mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-07-24 13:53:11 +00:00
Use MSVC __declspec(thread) for TSD on Windows
This commit is contained in:
@@ -7,11 +7,17 @@
|
|||||||
#include "jemalloc/internal/tsd_internals.h"
|
#include "jemalloc/internal/tsd_internals.h"
|
||||||
#include "jemalloc/internal/tsd_types.h"
|
#include "jemalloc/internal/tsd_types.h"
|
||||||
|
|
||||||
|
/* val should always be the first field of tsd_wrapper_t since accessing
|
||||||
|
val is the common path and having val as the first field makes it possible
|
||||||
|
that converting a pointer to tsd_wrapper_t to a pointer to val is no more
|
||||||
|
than a type cast. */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool initialized;
|
|
||||||
tsd_t val;
|
tsd_t val;
|
||||||
|
bool initialized;
|
||||||
} tsd_wrapper_t;
|
} tsd_wrapper_t;
|
||||||
|
|
||||||
|
#if defined(JEMALLOC_LEGACY_WINDOWS_SUPPORT) || !defined(_MSC_VER)
|
||||||
|
|
||||||
extern DWORD tsd_tsd;
|
extern DWORD tsd_tsd;
|
||||||
extern tsd_wrapper_t tsd_boot_wrapper;
|
extern tsd_wrapper_t tsd_boot_wrapper;
|
||||||
extern bool tsd_booted;
|
extern bool tsd_booted;
|
||||||
@@ -165,3 +171,69 @@ tsd_set(tsd_t *val) {
|
|||||||
}
|
}
|
||||||
wrapper->initialized = true;
|
wrapper->initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else // defined(JEMALLOC_LEGACY_WINDOWS_SUPPORT) || !defined(_MSC_VER)
|
||||||
|
|
||||||
|
#define JEMALLOC_TSD_TYPE_ATTR(type) __declspec(thread) type
|
||||||
|
|
||||||
|
extern JEMALLOC_TSD_TYPE_ATTR(tsd_wrapper_t) tsd_wrapper_tls;
|
||||||
|
extern bool tsd_booted;
|
||||||
|
|
||||||
|
/* Initialization/cleanup. */
|
||||||
|
JEMALLOC_ALWAYS_INLINE bool
|
||||||
|
tsd_cleanup_wrapper(void) {
|
||||||
|
if (tsd_wrapper_tls.initialized) {
|
||||||
|
tsd_wrapper_tls.initialized = false;
|
||||||
|
tsd_cleanup(&tsd_wrapper_tls.val);
|
||||||
|
if (tsd_wrapper_tls.initialized) {
|
||||||
|
/* Trigger another cleanup round. */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialization/cleanup. */
|
||||||
|
JEMALLOC_ALWAYS_INLINE bool
|
||||||
|
tsd_boot0(void) {
|
||||||
|
_malloc_tsd_cleanup_register(tsd_cleanup_wrapper);
|
||||||
|
tsd_booted = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
tsd_boot1(void) {
|
||||||
|
/* Do nothing. */
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE bool
|
||||||
|
tsd_boot(void) {
|
||||||
|
return tsd_boot0();
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE bool
|
||||||
|
tsd_booted_get(void) {
|
||||||
|
return tsd_booted;
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE bool
|
||||||
|
tsd_get_allocates(void) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get/set. */
|
||||||
|
JEMALLOC_ALWAYS_INLINE tsd_t *
|
||||||
|
tsd_get(bool init) {
|
||||||
|
return &(tsd_wrapper_tls.val);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
tsd_set(tsd_t *val) {
|
||||||
|
assert(tsd_booted);
|
||||||
|
if (likely(&(tsd_wrapper_tls.val) != val)) {
|
||||||
|
tsd_wrapper_tls.val = (*val);
|
||||||
|
}
|
||||||
|
tsd_wrapper_tls.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // defined(JEMALLOC_LEGACY_WINDOWS_SUPPORT) || !defined(_MSC_VER)
|
||||||
|
|||||||
@@ -22,8 +22,12 @@ JEMALLOC_TSD_TYPE_ATTR(tsd_t) tsd_tls = TSD_INITIALIZER;
|
|||||||
pthread_key_t tsd_tsd;
|
pthread_key_t tsd_tsd;
|
||||||
bool tsd_booted = false;
|
bool tsd_booted = false;
|
||||||
#elif (defined(_WIN32))
|
#elif (defined(_WIN32))
|
||||||
|
#if defined(JEMALLOC_LEGACY_WINDOWS_SUPPORT) || !defined(_MSC_VER)
|
||||||
DWORD tsd_tsd;
|
DWORD tsd_tsd;
|
||||||
tsd_wrapper_t tsd_boot_wrapper = {false, TSD_INITIALIZER};
|
tsd_wrapper_t tsd_boot_wrapper = {TSD_INITIALIZER, false};
|
||||||
|
#else
|
||||||
|
JEMALLOC_TSD_TYPE_ATTR(tsd_wrapper_t) tsd_wrapper_tls = { TSD_INITIALIZER, false };
|
||||||
|
#endif
|
||||||
bool tsd_booted = false;
|
bool tsd_booted = false;
|
||||||
#if JEMALLOC_WIN32_TLSGETVALUE2
|
#if JEMALLOC_WIN32_TLSGETVALUE2
|
||||||
TGV2 tls_get_value2 = NULL;
|
TGV2 tls_get_value2 = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user