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