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