blob: 701c1754044b8e353441df4131a65ae720e588fb [file] [log] [blame]
Jason Evans93443682010-10-20 17:39:18 -07001#include <stdio.h>
2#include <stdlib.h>
3#include <stdint.h>
4#include <stdbool.h>
5#include <pthread.h>
6#include <assert.h>
7#include <errno.h>
8#include <string.h>
9
10#define JEMALLOC_MANGLE
11#include "jemalloc_test.h"
12
13void *
14thread_start(void *arg)
15{
16 int err;
17 void *p;
18 uint64_t a0, a1, d0, d1;
Jason Evans9dcad2d2011-02-13 18:11:54 -080019 uint64_t *ap0, *ap1, *dp0, *dp1;
Jason Evans93443682010-10-20 17:39:18 -070020 size_t sz, usize;
21
22 sz = sizeof(a0);
Jason Evans0a5489e2012-03-01 17:19:20 -080023 if ((err = mallctl("thread.allocated", &a0, &sz, NULL, 0))) {
Jason Evans93443682010-10-20 17:39:18 -070024 if (err == ENOENT) {
25#ifdef JEMALLOC_STATS
26 assert(false);
27#endif
28 goto RETURN;
29 }
30 fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__,
31 strerror(err));
32 exit(1);
33 }
Jason Evans9dcad2d2011-02-13 18:11:54 -080034 sz = sizeof(ap0);
Jason Evans0a5489e2012-03-01 17:19:20 -080035 if ((err = mallctl("thread.allocatedp", &ap0, &sz, NULL, 0))) {
Jason Evans9dcad2d2011-02-13 18:11:54 -080036 if (err == ENOENT) {
37#ifdef JEMALLOC_STATS
38 assert(false);
39#endif
40 goto RETURN;
41 }
42 fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__,
43 strerror(err));
44 exit(1);
45 }
46 assert(*ap0 == a0);
Jason Evans93443682010-10-20 17:39:18 -070047
48 sz = sizeof(d0);
Jason Evans0a5489e2012-03-01 17:19:20 -080049 if ((err = mallctl("thread.deallocated", &d0, &sz, NULL, 0))) {
Jason Evans93443682010-10-20 17:39:18 -070050 if (err == ENOENT) {
51#ifdef JEMALLOC_STATS
52 assert(false);
53#endif
54 goto RETURN;
55 }
56 fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__,
57 strerror(err));
58 exit(1);
59 }
Jason Evans9dcad2d2011-02-13 18:11:54 -080060 sz = sizeof(dp0);
Jason Evans0a5489e2012-03-01 17:19:20 -080061 if ((err = mallctl("thread.deallocatedp", &dp0, &sz, NULL, 0))) {
Jason Evans9dcad2d2011-02-13 18:11:54 -080062 if (err == ENOENT) {
63#ifdef JEMALLOC_STATS
64 assert(false);
65#endif
66 goto RETURN;
67 }
68 fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__,
69 strerror(err));
70 exit(1);
71 }
72 assert(*dp0 == d0);
Jason Evans93443682010-10-20 17:39:18 -070073
Jason Evans0a5489e2012-03-01 17:19:20 -080074 p = malloc(1);
Jason Evans93443682010-10-20 17:39:18 -070075 if (p == NULL) {
76 fprintf(stderr, "%s(): Error in malloc()\n", __func__);
77 exit(1);
78 }
79
80 sz = sizeof(a1);
Jason Evans0a5489e2012-03-01 17:19:20 -080081 mallctl("thread.allocated", &a1, &sz, NULL, 0);
Jason Evans9dcad2d2011-02-13 18:11:54 -080082 sz = sizeof(ap1);
Jason Evans0a5489e2012-03-01 17:19:20 -080083 mallctl("thread.allocatedp", &ap1, &sz, NULL, 0);
Jason Evans9dcad2d2011-02-13 18:11:54 -080084 assert(*ap1 == a1);
85 assert(ap0 == ap1);
Jason Evans93443682010-10-20 17:39:18 -070086
Jason Evans0a5489e2012-03-01 17:19:20 -080087 usize = malloc_usable_size(p);
Jason Evans93443682010-10-20 17:39:18 -070088 assert(a0 + usize <= a1);
89
Jason Evans0a5489e2012-03-01 17:19:20 -080090 free(p);
Jason Evans93443682010-10-20 17:39:18 -070091
92 sz = sizeof(d1);
Jason Evans0a5489e2012-03-01 17:19:20 -080093 mallctl("thread.deallocated", &d1, &sz, NULL, 0);
Jason Evans9dcad2d2011-02-13 18:11:54 -080094 sz = sizeof(dp1);
Jason Evans0a5489e2012-03-01 17:19:20 -080095 mallctl("thread.deallocatedp", &dp1, &sz, NULL, 0);
Jason Evans9dcad2d2011-02-13 18:11:54 -080096 assert(*dp1 == d1);
97 assert(dp0 == dp1);
Jason Evans93443682010-10-20 17:39:18 -070098
99 assert(d0 + usize <= d1);
100
101RETURN:
102 return (NULL);
103}
104
105int
106main(void)
107{
108 int ret = 0;
109 pthread_t thread;
110
111 fprintf(stderr, "Test begin\n");
112
113 thread_start(NULL);
114
115 if (pthread_create(&thread, NULL, thread_start, NULL)
116 != 0) {
117 fprintf(stderr, "%s(): Error in pthread_create()\n", __func__);
118 ret = 1;
119 goto RETURN;
120 }
121 pthread_join(thread, (void *)&ret);
122
123 thread_start(NULL);
124
125 if (pthread_create(&thread, NULL, thread_start, NULL)
126 != 0) {
127 fprintf(stderr, "%s(): Error in pthread_create()\n", __func__);
128 ret = 1;
129 goto RETURN;
130 }
131 pthread_join(thread, (void *)&ret);
132
133 thread_start(NULL);
134
135RETURN:
136 fprintf(stderr, "Test end\n");
137 return (ret);
138}