blob: 6ce145b3eb3ef6894032e346704f188d99365222 [file] [log] [blame]
Jason Evans86abd0d2013-11-30 15:25:42 -08001#include "test/jemalloc_test.h"
Jason Evans93443682010-10-20 17:39:18 -07002
Jason Evans2a83ed02013-12-08 20:52:21 -08003static const bool config_stats =
4#ifdef JEMALLOC_STATS
5 true
6#else
7 false
8#endif
9 ;
10
Jason Evans93443682010-10-20 17:39:18 -070011void *
Jason Evans0f4f1ef2013-12-12 14:41:02 -080012thd_start(void *arg)
Jason Evans93443682010-10-20 17:39:18 -070013{
14 int err;
15 void *p;
16 uint64_t a0, a1, d0, d1;
Jason Evans9dcad2d2011-02-13 18:11:54 -080017 uint64_t *ap0, *ap1, *dp0, *dp1;
Jason Evans93443682010-10-20 17:39:18 -070018 size_t sz, usize;
19
20 sz = sizeof(a0);
Jason Evans8f61fde2016-10-27 21:31:25 -070021 if ((err = mallctl("thread.allocated", (void *)&a0, &sz, NULL, 0))) {
Jason Evans2a83ed02013-12-08 20:52:21 -080022 if (err == ENOENT)
23 goto label_ENOENT;
24 test_fail("%s(): Error in mallctl(): %s", __func__,
Jason Evans93443682010-10-20 17:39:18 -070025 strerror(err));
Jason Evans93443682010-10-20 17:39:18 -070026 }
Jason Evans9dcad2d2011-02-13 18:11:54 -080027 sz = sizeof(ap0);
Jason Evans8f61fde2016-10-27 21:31:25 -070028 if ((err = mallctl("thread.allocatedp", (void *)&ap0, &sz, NULL, 0))) {
Jason Evans2a83ed02013-12-08 20:52:21 -080029 if (err == ENOENT)
30 goto label_ENOENT;
31 test_fail("%s(): Error in mallctl(): %s", __func__,
Jason Evans9dcad2d2011-02-13 18:11:54 -080032 strerror(err));
Jason Evans9dcad2d2011-02-13 18:11:54 -080033 }
Jason Evans2a83ed02013-12-08 20:52:21 -080034 assert_u64_eq(*ap0, a0,
35 "\"thread.allocatedp\" should provide a pointer to internal "
36 "storage");
Jason Evans93443682010-10-20 17:39:18 -070037
38 sz = sizeof(d0);
Jason Evans8f61fde2016-10-27 21:31:25 -070039 if ((err = mallctl("thread.deallocated", (void *)&d0, &sz, NULL, 0))) {
Jason Evans2a83ed02013-12-08 20:52:21 -080040 if (err == ENOENT)
41 goto label_ENOENT;
42 test_fail("%s(): Error in mallctl(): %s", __func__,
Jason Evans93443682010-10-20 17:39:18 -070043 strerror(err));
Jason Evans93443682010-10-20 17:39:18 -070044 }
Jason Evans9dcad2d2011-02-13 18:11:54 -080045 sz = sizeof(dp0);
Jason Evans8f61fde2016-10-27 21:31:25 -070046 if ((err = mallctl("thread.deallocatedp", (void *)&dp0, &sz, NULL,
47 0))) {
Jason Evans2a83ed02013-12-08 20:52:21 -080048 if (err == ENOENT)
49 goto label_ENOENT;
50 test_fail("%s(): Error in mallctl(): %s", __func__,
Jason Evans9dcad2d2011-02-13 18:11:54 -080051 strerror(err));
Jason Evans9dcad2d2011-02-13 18:11:54 -080052 }
Jason Evans2a83ed02013-12-08 20:52:21 -080053 assert_u64_eq(*dp0, d0,
54 "\"thread.deallocatedp\" should provide a pointer to internal "
55 "storage");
Jason Evans93443682010-10-20 17:39:18 -070056
Jason Evans0a5489e2012-03-01 17:19:20 -080057 p = malloc(1);
Jason Evans2a83ed02013-12-08 20:52:21 -080058 assert_ptr_not_null(p, "Unexpected malloc() error");
Jason Evans93443682010-10-20 17:39:18 -070059
60 sz = sizeof(a1);
Jason Evans8f61fde2016-10-27 21:31:25 -070061 mallctl("thread.allocated", (void *)&a1, &sz, NULL, 0);
Jason Evans9dcad2d2011-02-13 18:11:54 -080062 sz = sizeof(ap1);
Jason Evans8f61fde2016-10-27 21:31:25 -070063 mallctl("thread.allocatedp", (void *)&ap1, &sz, NULL, 0);
Jason Evans2a83ed02013-12-08 20:52:21 -080064 assert_u64_eq(*ap1, a1,
65 "Dereferenced \"thread.allocatedp\" value should equal "
66 "\"thread.allocated\" value");
67 assert_ptr_eq(ap0, ap1,
68 "Pointer returned by \"thread.allocatedp\" should not change");
Jason Evans93443682010-10-20 17:39:18 -070069
Jason Evans0a5489e2012-03-01 17:19:20 -080070 usize = malloc_usable_size(p);
Jason Evans2a83ed02013-12-08 20:52:21 -080071 assert_u64_le(a0 + usize, a1,
72 "Allocated memory counter should increase by at least the amount "
73 "explicitly allocated");
Jason Evans93443682010-10-20 17:39:18 -070074
Jason Evans0a5489e2012-03-01 17:19:20 -080075 free(p);
Jason Evans93443682010-10-20 17:39:18 -070076
77 sz = sizeof(d1);
Jason Evans8f61fde2016-10-27 21:31:25 -070078 mallctl("thread.deallocated", (void *)&d1, &sz, NULL, 0);
Jason Evans9dcad2d2011-02-13 18:11:54 -080079 sz = sizeof(dp1);
Jason Evans8f61fde2016-10-27 21:31:25 -070080 mallctl("thread.deallocatedp", (void *)&dp1, &sz, NULL, 0);
Jason Evans2a83ed02013-12-08 20:52:21 -080081 assert_u64_eq(*dp1, d1,
82 "Dereferenced \"thread.deallocatedp\" value should equal "
83 "\"thread.deallocated\" value");
84 assert_ptr_eq(dp0, dp1,
85 "Pointer returned by \"thread.deallocatedp\" should not change");
Jason Evans93443682010-10-20 17:39:18 -070086
Jason Evans2a83ed02013-12-08 20:52:21 -080087 assert_u64_le(d0 + usize, d1,
88 "Deallocated memory counter should increase by at least the amount "
89 "explicitly deallocated");
Jason Evans93443682010-10-20 17:39:18 -070090
Jason Evans2a83ed02013-12-08 20:52:21 -080091 return (NULL);
92label_ENOENT:
93 assert_false(config_stats,
94 "ENOENT should only be returned if stats are disabled");
95 test_skip("\"thread.allocated\" mallctl not available");
Jason Evans93443682010-10-20 17:39:18 -070096 return (NULL);
97}
98
Jason Evans2a83ed02013-12-08 20:52:21 -080099TEST_BEGIN(test_main_thread)
100{
101
Jason Evans0f4f1ef2013-12-12 14:41:02 -0800102 thd_start(NULL);
Jason Evans2a83ed02013-12-08 20:52:21 -0800103}
104TEST_END
105
106TEST_BEGIN(test_subthread)
107{
Jason Evans0f4f1ef2013-12-12 14:41:02 -0800108 thd_t thd;
Jason Evans2a83ed02013-12-08 20:52:21 -0800109
Jason Evans0f4f1ef2013-12-12 14:41:02 -0800110 thd_create(&thd, thd_start, NULL);
111 thd_join(thd, NULL);
Jason Evans2a83ed02013-12-08 20:52:21 -0800112}
113TEST_END
114
Jason Evans93443682010-10-20 17:39:18 -0700115int
116main(void)
117{
Jason Evans93443682010-10-20 17:39:18 -0700118
Jason Evans2a83ed02013-12-08 20:52:21 -0800119 /* Run tests multiple times to check for bad interactions. */
120 return (test(
121 test_main_thread,
122 test_subthread,
123 test_main_thread,
124 test_subthread,
125 test_main_thread));
Jason Evans93443682010-10-20 17:39:18 -0700126}