#include #include #include #include #include #include #include #include #define JEMALLOC_MANGLE #include "jemalloc_test.h" void * thread_start(void *arg) { int err; void *p; uint64_t a0, a1, d0, d1; size_t sz, usize; sz = sizeof(a0); if ((err = JEMALLOC_P(mallctl)("thread.allocated", &a0, &sz, NULL, 0))) { if (err == ENOENT) { #ifdef JEMALLOC_STATS assert(false); #endif goto RETURN; } fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__, strerror(err)); exit(1); } sz = sizeof(d0); if ((err = JEMALLOC_P(mallctl)("thread.deallocated", &d0, &sz, NULL, 0))) { if (err == ENOENT) { #ifdef JEMALLOC_STATS assert(false); #endif goto RETURN; } fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__, strerror(err)); exit(1); } p = JEMALLOC_P(malloc)(1); if (p == NULL) { fprintf(stderr, "%s(): Error in malloc()\n", __func__); exit(1); } sz = sizeof(a1); JEMALLOC_P(mallctl)("thread.allocated", &a1, &sz, NULL, 0); usize = JEMALLOC_P(malloc_usable_size)(p); assert(a0 + usize <= a1); JEMALLOC_P(free)(p); sz = sizeof(d1); JEMALLOC_P(mallctl)("thread.deallocated", &d1, &sz, NULL, 0); assert(d0 + usize <= d1); RETURN: return (NULL); } int main(void) { int ret = 0; pthread_t thread; fprintf(stderr, "Test begin\n"); thread_start(NULL); if (pthread_create(&thread, NULL, thread_start, NULL) != 0) { fprintf(stderr, "%s(): Error in pthread_create()\n", __func__); ret = 1; goto RETURN; } pthread_join(thread, (void *)&ret); thread_start(NULL); if (pthread_create(&thread, NULL, thread_start, NULL) != 0) { fprintf(stderr, "%s(): Error in pthread_create()\n", __func__); ret = 1; goto RETURN; } pthread_join(thread, (void *)&ret); thread_start(NULL); RETURN: fprintf(stderr, "Test end\n"); return (ret); }