blob: 8be787fda935cc8e88e220f122b99c03eeeda423 [file] [log] [blame]
Jason Evans72284f02013-12-04 17:40:49 -08001#include "test/jemalloc_test.h"
2
Jason Evansa4f124f2013-12-08 22:28:27 -08003#define THREAD_DATA 0x72b65c10
Jason Evans72284f02013-12-04 17:40:49 -08004
5typedef unsigned int data_t;
6
Jason Evans2a83ed02013-12-08 20:52:21 -08007static bool data_cleanup_executed;
8
Jason Evans8bb31982014-10-07 23:14:57 -07009malloc_tsd_types(data_, data_t)
Jason Evans029d44c2014-10-04 11:12:53 -070010malloc_tsd_protos(, data_, data_t)
11
Jason Evans72284f02013-12-04 17:40:49 -080012void
13data_cleanup(void *arg)
14{
15 data_t *data = (data_t *)arg;
16
Jason Evans029d44c2014-10-04 11:12:53 -070017 if (!data_cleanup_executed) {
18 assert_x_eq(*data, THREAD_DATA,
19 "Argument passed into cleanup function should match tsd "
20 "value");
21 }
Jason Evans2a83ed02013-12-08 20:52:21 -080022 data_cleanup_executed = true;
Jason Evans029d44c2014-10-04 11:12:53 -070023
24 /*
25 * Allocate during cleanup for two rounds, in order to assure that
26 * jemalloc's internal tsd reinitialization happens.
27 */
28 switch (*data) {
29 case THREAD_DATA:
30 *data = 1;
31 data_tsd_set(data);
32 break;
33 case 1:
34 *data = 2;
35 data_tsd_set(data);
36 break;
37 case 2:
38 return;
39 default:
40 not_reached();
41 }
42
43 {
44 void *p = mallocx(1, 0);
45 assert_ptr_not_null(p, "Unexpeced mallocx() failure");
46 dallocx(p, 0);
47 }
Jason Evans72284f02013-12-04 17:40:49 -080048}
49
Jason Evans5460aa62014-09-22 21:09:23 -070050malloc_tsd_externs(data_, data_t)
Jason Evansa4f124f2013-12-08 22:28:27 -080051#define DATA_INIT 0x12345678
Jason Evans5460aa62014-09-22 21:09:23 -070052malloc_tsd_data(, data_, data_t, DATA_INIT)
53malloc_tsd_funcs(, data_, data_t, DATA_INIT, data_cleanup)
Jason Evans72284f02013-12-04 17:40:49 -080054
Jason Evans0f4f1ef2013-12-12 14:41:02 -080055static void *
56thd_start(void *arg)
Jason Evans72284f02013-12-04 17:40:49 -080057{
Jason Evans2a83ed02013-12-08 20:52:21 -080058 data_t d = (data_t)(uintptr_t)arg;
Christopher Ferris45e9f662015-08-21 12:23:06 -070059 void *p;
60
Jason Evans2a83ed02013-12-08 20:52:21 -080061 assert_x_eq(*data_tsd_get(), DATA_INIT,
62 "Initial tsd get should return initialization value");
Jason Evans72284f02013-12-04 17:40:49 -080063
Christopher Ferris45e9f662015-08-21 12:23:06 -070064 p = malloc(1);
65 assert_ptr_not_null(p, "Unexpected malloc() failure");
66
Jason Evans72284f02013-12-04 17:40:49 -080067 data_tsd_set(&d);
Jason Evans2a83ed02013-12-08 20:52:21 -080068 assert_x_eq(*data_tsd_get(), d,
69 "After tsd set, tsd get should return value that was set");
Jason Evans72284f02013-12-04 17:40:49 -080070
71 d = 0;
Jason Evans2a83ed02013-12-08 20:52:21 -080072 assert_x_eq(*data_tsd_get(), (data_t)(uintptr_t)arg,
73 "Resetting local data should have no effect on tsd");
Jason Evans72284f02013-12-04 17:40:49 -080074
Christopher Ferris45e9f662015-08-21 12:23:06 -070075 free(p);
Jason Evans0f4f1ef2013-12-12 14:41:02 -080076 return (NULL);
Jason Evans72284f02013-12-04 17:40:49 -080077}
78
Jason Evans2a83ed02013-12-08 20:52:21 -080079TEST_BEGIN(test_tsd_main_thread)
80{
81
Jason Evans0f4f1ef2013-12-12 14:41:02 -080082 thd_start((void *) 0xa5f3e329);
Jason Evans2a83ed02013-12-08 20:52:21 -080083}
84TEST_END
85
86TEST_BEGIN(test_tsd_sub_thread)
Jason Evans72284f02013-12-04 17:40:49 -080087{
Jason Evans0f4f1ef2013-12-12 14:41:02 -080088 thd_t thd;
Jason Evans72284f02013-12-04 17:40:49 -080089
Jason Evans2a83ed02013-12-08 20:52:21 -080090 data_cleanup_executed = false;
Jason Evans0f4f1ef2013-12-12 14:41:02 -080091 thd_create(&thd, thd_start, (void *)THREAD_DATA);
92 thd_join(thd, NULL);
Jason Evans2a83ed02013-12-08 20:52:21 -080093 assert_true(data_cleanup_executed,
94 "Cleanup function should have executed");
95}
96TEST_END
Jason Evans72284f02013-12-04 17:40:49 -080097
Jason Evans2a83ed02013-12-08 20:52:21 -080098int
99main(void)
100{
101
102 data_tsd_boot();
103
104 return (test(
105 test_tsd_main_thread,
106 test_tsd_sub_thread));
Jason Evans72284f02013-12-04 17:40:49 -0800107}