]> git.saurik.com Git - redis.git/blobdiff - deps/jemalloc.orig/test/allocated.c
Jemalloc updated to 3.0.0.
[redis.git] / deps / jemalloc.orig / test / allocated.c
diff --git a/deps/jemalloc.orig/test/allocated.c b/deps/jemalloc.orig/test/allocated.c
new file mode 100644 (file)
index 0000000..b1e40e4
--- /dev/null
@@ -0,0 +1,142 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <pthread.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+
+#define        JEMALLOC_MANGLE
+#include "jemalloc_test.h"
+
+void *
+thread_start(void *arg)
+{
+       int err;
+       void *p;
+       uint64_t a0, a1, d0, d1;
+       uint64_t *ap0, *ap1, *dp0, *dp1;
+       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(ap0);
+       if ((err = JEMALLOC_P(mallctl)("thread.allocatedp", &ap0, &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);
+       }
+       assert(*ap0 == a0);
+
+       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);
+       }
+       sz = sizeof(dp0);
+       if ((err = JEMALLOC_P(mallctl)("thread.deallocatedp", &dp0, &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);
+       }
+       assert(*dp0 == d0);
+
+       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);
+       sz = sizeof(ap1);
+       JEMALLOC_P(mallctl)("thread.allocatedp", &ap1, &sz, NULL, 0);
+       assert(*ap1 == a1);
+       assert(ap0 == ap1);
+
+       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);
+       sz = sizeof(dp1);
+       JEMALLOC_P(mallctl)("thread.deallocatedp", &dp1, &sz, NULL, 0);
+       assert(*dp1 == d1);
+       assert(dp0 == dp1);
+
+       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);
+}