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