diff options
| author | Jason Evans <jasone@canonware.com> | 2012-05-12 00:48:33 (GMT) |
|---|---|---|
| committer | Jason Evans <jasone@canonware.com> | 2012-05-12 00:48:33 (GMT) |
| commit | fc9b1dbf69f59d7ecfc4ac68da9847e017e1d046 (patch) | |
| tree | 7f843c7c51cd5df5d3be1ca48f504325f0536c0d /src/tsd.c | |
| parent | fc1bb70e5f0d9a58b39efa39cc549b5af5104760 (diff) | |
| parent | cbb71caceb1e53d0fd21284ce298885327c211b4 (diff) | |
| download | jemalloc-3.0.0.zip jemalloc-3.0.0.tar.gz jemalloc-3.0.0.tar.bz2 | |
Merge branch 'dev'3.0.0
Conflicts:
ChangeLog
include/jemalloc/internal/chunk.h
src/chunk.c
src/huge.c
src/jemalloc.c
test/rallocm.c
Diffstat (limited to 'src/tsd.c')
| -rw-r--r-- | src/tsd.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/tsd.c b/src/tsd.c new file mode 100644 index 0000000..961a546 --- /dev/null +++ b/src/tsd.c @@ -0,0 +1,107 @@ +#define JEMALLOC_TSD_C_ +#include "jemalloc/internal/jemalloc_internal.h" + +/******************************************************************************/ +/* Data. */ + +static unsigned ncleanups; +static malloc_tsd_cleanup_t cleanups[MALLOC_TSD_CLEANUPS_MAX]; + +/******************************************************************************/ + +void * +malloc_tsd_malloc(size_t size) +{ + + /* Avoid choose_arena() in order to dodge bootstrapping issues. */ + return (arena_malloc(arenas[0], size, false, false)); +} + +void +malloc_tsd_dalloc(void *wrapper) +{ + + idalloc(wrapper); +} + +void +malloc_tsd_no_cleanup(void *arg) +{ + + not_reached(); +} + +#if defined(JEMALLOC_MALLOC_THREAD_CLEANUP) || defined(_WIN32) +#ifndef _WIN32 +JEMALLOC_EXPORT +#endif +void +_malloc_thread_cleanup(void) +{ + bool pending[MALLOC_TSD_CLEANUPS_MAX], again; + unsigned i; + + for (i = 0; i < ncleanups; i++) + pending[i] = true; + + do { + again = false; + for (i = 0; i < ncleanups; i++) { + if (pending[i]) { + pending[i] = cleanups[i](); + if (pending[i]) + again = true; + } + } + } while (again); +} +#endif + +void +malloc_tsd_cleanup_register(bool (*f)(void)) +{ + + assert(ncleanups < MALLOC_TSD_CLEANUPS_MAX); + cleanups[ncleanups] = f; + ncleanups++; +} + +void +malloc_tsd_boot(void) +{ + + ncleanups = 0; +} + +#ifdef _WIN32 +static BOOL WINAPI +_tls_callback(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + + switch (fdwReason) { +#ifdef JEMALLOC_LAZY_LOCK + case DLL_THREAD_ATTACH: + isthreaded = true; + break; +#endif + case DLL_THREAD_DETACH: + _malloc_thread_cleanup(); + break; + default: + break; + } + return (true); +} + +#ifdef _MSC_VER +# ifdef _M_IX86 +# pragma comment(linker, "/INCLUDE:__tls_used") +# else +# pragma comment(linker, "/INCLUDE:_tls_used") +# endif +# pragma section(".CRT$XLY",long,read) +#endif +JEMALLOC_SECTION(".CRT$XLY") JEMALLOC_ATTR(used) +static const BOOL (WINAPI *tls_callback)(HINSTANCE hinstDLL, + DWORD fdwReason, LPVOID lpvReserved) = _tls_callback; +#endif |
