1#include "test/jemalloc_test.h" 2 3#define THREAD_DATA 0x72b65c10 4 5typedef unsigned int data_t; 6 7static bool data_cleanup_executed; 8 9void 10data_cleanup(void *arg) 11{ 12 data_t *data = (data_t *)arg; 13 14 assert_x_eq(*data, THREAD_DATA, 15 "Argument passed into cleanup function should match tsd value"); 16 data_cleanup_executed = true; 17} 18 19malloc_tsd_protos(, data, data_t) 20malloc_tsd_externs(data, data_t) 21#define DATA_INIT 0x12345678 22malloc_tsd_data(, data, data_t, DATA_INIT) 23malloc_tsd_funcs(, data, data_t, DATA_INIT, data_cleanup) 24 25static void * 26thd_start(void *arg) 27{ 28 data_t d = (data_t)(uintptr_t)arg; 29 assert_x_eq(*data_tsd_get(), DATA_INIT, 30 "Initial tsd get should return initialization value"); 31 32 data_tsd_set(&d); 33 assert_x_eq(*data_tsd_get(), d, 34 "After tsd set, tsd get should return value that was set"); 35 36 d = 0; 37 assert_x_eq(*data_tsd_get(), (data_t)(uintptr_t)arg, 38 "Resetting local data should have no effect on tsd"); 39 40 return (NULL); 41} 42 43TEST_BEGIN(test_tsd_main_thread) 44{ 45 46 thd_start((void *) 0xa5f3e329); 47} 48TEST_END 49 50TEST_BEGIN(test_tsd_sub_thread) 51{ 52 thd_t thd; 53 54 data_cleanup_executed = false; 55 thd_create(&thd, thd_start, (void *)THREAD_DATA); 56 thd_join(thd, NULL); 57 assert_true(data_cleanup_executed, 58 "Cleanup function should have executed"); 59} 60TEST_END 61 62int 63main(void) 64{ 65 66 data_tsd_boot(); 67 68 return (test( 69 test_tsd_main_thread, 70 test_tsd_sub_thread)); 71} 72