1 #ifdef JEMALLOC_INTERNAL_TSD_TLS_H 2 #error This file should be included only once, by tsd.h. 3 #endif 4 #define JEMALLOC_INTERNAL_TSD_TLS_H 5 6 extern __thread tsd_t tsd_tls; 7 extern pthread_key_t tsd_tsd; 8 extern bool tsd_booted; 9 10 /* Initialization/cleanup. */ 11 JEMALLOC_ALWAYS_INLINE bool tsd_boot0(void)12tsd_boot0(void) { 13 if (pthread_key_create(&tsd_tsd, &tsd_cleanup) != 0) { 14 return true; 15 } 16 tsd_booted = true; 17 return false; 18 } 19 20 JEMALLOC_ALWAYS_INLINE void tsd_boot1(void)21tsd_boot1(void) { 22 /* Do nothing. */ 23 } 24 25 JEMALLOC_ALWAYS_INLINE bool tsd_boot(void)26tsd_boot(void) { 27 return tsd_boot0(); 28 } 29 30 JEMALLOC_ALWAYS_INLINE bool tsd_booted_get(void)31tsd_booted_get(void) { 32 return tsd_booted; 33 } 34 35 JEMALLOC_ALWAYS_INLINE bool tsd_get_allocates(void)36tsd_get_allocates(void) { 37 return false; 38 } 39 40 /* Get/set. */ 41 JEMALLOC_ALWAYS_INLINE tsd_t * tsd_get(UNUSED bool init)42tsd_get(UNUSED bool init) { 43 assert(tsd_booted); 44 return &tsd_tls; 45 } 46 47 JEMALLOC_ALWAYS_INLINE void tsd_set(tsd_t * val)48tsd_set(tsd_t *val) { 49 assert(tsd_booted); 50 if (likely(&tsd_tls != val)) { 51 tsd_tls = (*val); 52 } 53 if (pthread_setspecific(tsd_tsd, (void *)(&tsd_tls)) != 0) { 54 malloc_write("<jemalloc>: Error setting tsd.\n"); 55 if (opt_abort) { 56 abort(); 57 } 58 } 59 } 60