mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-31 17:52:27 +00:00
Make dlmalloc 2.4x faster for multithreading
This change adds a TLS freelist for small dynamic memory allocations. Cosmopolitan's TIB is now 512 bytes in size. Single-threaded malloc() performance isn't impacted by this, until pthread_create() is called. Single-threaded programs may also want to consider using: #include "libc/mem/tinymalloc.inc" Which will shave 30k off the executable size and sometimes go faster.
This commit is contained in:
parent
deaef81463
commit
07cef612c3
9 changed files with 150 additions and 6 deletions
|
@ -29,6 +29,7 @@
|
|||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/thread/posixthread.internal.h"
|
||||
#include "libc/thread/thread.h"
|
||||
#include "libc/thread/tls.h"
|
||||
|
@ -130,6 +131,23 @@ wontreturn void pthread_exit(void *rc) {
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef MODE_DBG
|
||||
// free tls freelist
|
||||
//
|
||||
// 1. set lengths to -1 so free() thinks it's full
|
||||
// 2. free globally by giving mallocs back to free
|
||||
//
|
||||
short freelen[32];
|
||||
static_assert(sizeof(freelen) == sizeof(tib->tib_freelen), "");
|
||||
memcpy(freelen, tib->tib_freelen, sizeof(freelen));
|
||||
memset(tib->tib_freelen, -1, sizeof(freelen));
|
||||
for (int i = 0; i < 32; ++i) {
|
||||
if (freelen[i] > 0) {
|
||||
free(tib->tib_freemem[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// transition the thread to a terminated state
|
||||
status = atomic_load_explicit(&pt->pt_status, memory_order_acquire);
|
||||
do {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue