summaryrefslogtreecommitdiffstats
path: root/test/thread_tcache_enabled.c
blob: 465403858a09bd5048399cf96e6c7524edbd6f15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <pthread.h>
#include <assert.h>
#include <errno.h>

#define	JEMALLOC_MANGLE
#include "jemalloc_test.h"

void *
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 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));
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);
}