memory/jemalloc/src/test/thread_tcache_enabled.c
author Ryan VanderMeulen <ryanvm@gmail.com>
Mon, 22 Apr 2013 21:15:00 -0400
changeset 129468 f59811fe0fb3d303fd20abc4e10432488c3d3db5
parent 96045 c27de97f078dc7c2276af6484b718b54730180d8
permissions -rw-r--r--
Merge birch to m-c.

#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);
}