xref: /netbsd-src/external/bsd/jemalloc/dist/test/unit/ticker.c (revision 7bdf38e5b7a28439665f2fdeff81e36913eef7dd)
1a0698ed9Schristos #include "test/jemalloc_test.h"
2a0698ed9Schristos 
3a0698ed9Schristos #include "jemalloc/internal/ticker.h"
4a0698ed9Schristos 
5a0698ed9Schristos TEST_BEGIN(test_ticker_tick) {
6a0698ed9Schristos #define NREPS 2
7a0698ed9Schristos #define NTICKS 3
8a0698ed9Schristos 	ticker_t ticker;
9a0698ed9Schristos 	int32_t i, j;
10a0698ed9Schristos 
11a0698ed9Schristos 	ticker_init(&ticker, NTICKS);
12a0698ed9Schristos 	for (i = 0; i < NREPS; i++) {
13a0698ed9Schristos 		for (j = 0; j < NTICKS; j++) {
14*7bdf38e5Schristos 			expect_u_eq(ticker_read(&ticker), NTICKS - j,
15a0698ed9Schristos 			    "Unexpected ticker value (i=%d, j=%d)", i, j);
16*7bdf38e5Schristos 			expect_false(ticker_tick(&ticker),
17a0698ed9Schristos 			    "Unexpected ticker fire (i=%d, j=%d)", i, j);
18a0698ed9Schristos 		}
19*7bdf38e5Schristos 		expect_u32_eq(ticker_read(&ticker), 0,
20a0698ed9Schristos 		    "Expected ticker depletion");
21*7bdf38e5Schristos 		expect_true(ticker_tick(&ticker),
22a0698ed9Schristos 		    "Expected ticker fire (i=%d)", i);
23*7bdf38e5Schristos 		expect_u32_eq(ticker_read(&ticker), NTICKS,
24a0698ed9Schristos 		    "Expected ticker reset");
25a0698ed9Schristos 	}
26a0698ed9Schristos #undef NTICKS
27a0698ed9Schristos }
28a0698ed9Schristos TEST_END
29a0698ed9Schristos 
30a0698ed9Schristos TEST_BEGIN(test_ticker_ticks) {
31a0698ed9Schristos #define NTICKS 3
32a0698ed9Schristos 	ticker_t ticker;
33a0698ed9Schristos 
34a0698ed9Schristos 	ticker_init(&ticker, NTICKS);
35a0698ed9Schristos 
36*7bdf38e5Schristos 	expect_u_eq(ticker_read(&ticker), NTICKS, "Unexpected ticker value");
37*7bdf38e5Schristos 	expect_false(ticker_ticks(&ticker, NTICKS), "Unexpected ticker fire");
38*7bdf38e5Schristos 	expect_u_eq(ticker_read(&ticker), 0, "Unexpected ticker value");
39*7bdf38e5Schristos 	expect_true(ticker_ticks(&ticker, NTICKS), "Expected ticker fire");
40*7bdf38e5Schristos 	expect_u_eq(ticker_read(&ticker), NTICKS, "Unexpected ticker value");
41a0698ed9Schristos 
42*7bdf38e5Schristos 	expect_true(ticker_ticks(&ticker, NTICKS + 1), "Expected ticker fire");
43*7bdf38e5Schristos 	expect_u_eq(ticker_read(&ticker), NTICKS, "Unexpected ticker value");
44a0698ed9Schristos #undef NTICKS
45a0698ed9Schristos }
46a0698ed9Schristos TEST_END
47a0698ed9Schristos 
48a0698ed9Schristos TEST_BEGIN(test_ticker_copy) {
49a0698ed9Schristos #define NTICKS 3
50a0698ed9Schristos 	ticker_t ta, tb;
51a0698ed9Schristos 
52a0698ed9Schristos 	ticker_init(&ta, NTICKS);
53a0698ed9Schristos 	ticker_copy(&tb, &ta);
54*7bdf38e5Schristos 	expect_u_eq(ticker_read(&tb), NTICKS, "Unexpected ticker value");
55*7bdf38e5Schristos 	expect_true(ticker_ticks(&tb, NTICKS + 1), "Expected ticker fire");
56*7bdf38e5Schristos 	expect_u_eq(ticker_read(&tb), NTICKS, "Unexpected ticker value");
57a0698ed9Schristos 
58a0698ed9Schristos 	ticker_tick(&ta);
59a0698ed9Schristos 	ticker_copy(&tb, &ta);
60*7bdf38e5Schristos 	expect_u_eq(ticker_read(&tb), NTICKS - 1, "Unexpected ticker value");
61*7bdf38e5Schristos 	expect_true(ticker_ticks(&tb, NTICKS), "Expected ticker fire");
62*7bdf38e5Schristos 	expect_u_eq(ticker_read(&tb), NTICKS, "Unexpected ticker value");
63a0698ed9Schristos #undef NTICKS
64a0698ed9Schristos }
65a0698ed9Schristos TEST_END
66a0698ed9Schristos 
67*7bdf38e5Schristos TEST_BEGIN(test_ticker_geom) {
68*7bdf38e5Schristos 	const int32_t ticks = 100;
69*7bdf38e5Schristos 	const uint64_t niters = 100 * 1000;
70*7bdf38e5Schristos 
71*7bdf38e5Schristos 	ticker_geom_t ticker;
72*7bdf38e5Schristos 	ticker_geom_init(&ticker, ticks);
73*7bdf38e5Schristos 	uint64_t total_ticks = 0;
74*7bdf38e5Schristos 	/* Just some random constant. */
75*7bdf38e5Schristos 	uint64_t prng_state = 0x343219f93496db9fULL;
76*7bdf38e5Schristos 	for (uint64_t i = 0; i < niters; i++) {
77*7bdf38e5Schristos 		while(!ticker_geom_tick(&ticker, &prng_state)) {
78*7bdf38e5Schristos 			total_ticks++;
79*7bdf38e5Schristos 		}
80*7bdf38e5Schristos 	}
81*7bdf38e5Schristos 	/*
82*7bdf38e5Schristos 	 * In fact, with this choice of random seed and the PRNG implementation
83*7bdf38e5Schristos 	 * used at the time this was tested, total_ticks is 95.1% of the
84*7bdf38e5Schristos 	 * expected ticks.
85*7bdf38e5Schristos 	 */
86*7bdf38e5Schristos 	expect_u64_ge(total_ticks , niters * ticks * 9 / 10,
87*7bdf38e5Schristos 	    "Mean off by > 10%%");
88*7bdf38e5Schristos 	expect_u64_le(total_ticks , niters * ticks * 11 / 10,
89*7bdf38e5Schristos 	    "Mean off by > 10%%");
90*7bdf38e5Schristos }
91*7bdf38e5Schristos TEST_END
92*7bdf38e5Schristos 
93a0698ed9Schristos int
94a0698ed9Schristos main(void) {
95a0698ed9Schristos 	return test(
96a0698ed9Schristos 	    test_ticker_tick,
97a0698ed9Schristos 	    test_ticker_ticks,
98*7bdf38e5Schristos 	    test_ticker_copy,
99*7bdf38e5Schristos 	    test_ticker_geom);
100a0698ed9Schristos }
101