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