| #include <stdio.h> |
| #include <stdlib.h> |
| #include <stdbool.h> |
| #include <assert.h> |
| #include <errno.h> |
| |
| #define JEMALLOC_MANGLE |
| #include "jemalloc_test.h" |
| |
| void * |
| je_thread_start(void *arg) |
| { |
| int err; |
| size_t sz; |
| bool e0, e1; |
| |
| sz = sizeof(bool); |
| if ((err = mallctl("thread.tcache.enabled", &e0, &sz, NULL, 0))) { |
| if (err == ENOENT) { |
| #ifdef JEMALLOC_TCACHE |
| assert(false); |
| #endif |
| } |
| goto label_return; |
| } |
| |
| if (e0) { |
| e1 = false; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) |
| == 0); |
| assert(e0); |
| } |
| |
| e1 = true; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0 == false); |
| |
| e1 = true; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0); |
| |
| e1 = false; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0); |
| |
| e1 = false; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0 == false); |
| |
| free(malloc(1)); |
| e1 = true; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0 == false); |
| |
| free(malloc(1)); |
| e1 = true; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0); |
| |
| free(malloc(1)); |
| e1 = false; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0); |
| |
| free(malloc(1)); |
| e1 = false; |
| assert(mallctl("thread.tcache.enabled", &e0, &sz, &e1, sz) == 0); |
| assert(e0 == false); |
| |
| free(malloc(1)); |
| label_return: |
| return (NULL); |
| } |
| |
| int |
| main(void) |
| { |
| int ret = 0; |
| je_thread_t thread; |
| |
| malloc_printf("Test begin\n"); |
| |
| je_thread_start(NULL); |
| |
| je_thread_create(&thread, je_thread_start, NULL); |
| je_thread_join(thread, (void *)&ret); |
| |
| je_thread_start(NULL); |
| |
| je_thread_create(&thread, je_thread_start, NULL); |
| je_thread_join(thread, (void *)&ret); |
| |
| je_thread_start(NULL); |
| |
| malloc_printf("Test end\n"); |
| return (ret); |
| } |