static void _destroy_state(PatternDB *self) { if (self->timer_wheel) timer_wheel_free(self->timer_wheel); g_hash_table_destroy(self->rate_limits); correllation_state_deinit_instance(&self->correllation); }
void test_wheel(gint seed) { TimerWheel *wheel; gint i; guint64 latest = 0; gint expected_callbacks; prev_now = 0; num_callbacks = 0; expected_callbacks = 0; srand(seed); wheel = timer_wheel_new(); _test_assoc_data(wheel); timer_wheel_set_time(wheel, 1); for (i = 0; i < NUM_TIMERS; i++) { guint64 expires; TWEntry *timer1, *timer2, *timer3; gint r; expires = rand() & ((1 << 24) - 1); if (expires <= 1) expires = 1; if (expires > latest) latest = expires; timer1 = timer_wheel_add_timer(wheel, expires - 1, timer_callback, g_memdup(&expires, sizeof(expires)), (GDestroyNotify) g_free); timer2 = timer_wheel_add_timer(wheel, expires - 1, timer_callback, g_memdup(&expires, sizeof(expires)), (GDestroyNotify) g_free); timer3 = timer_wheel_add_timer(wheel, expires - 1, timer_callback, g_memdup(&expires, sizeof(expires)), (GDestroyNotify) g_free); expected_callbacks += 3; r = rand() & 0xFF; if (r < 64) { /* delete the timer with 25% chance */ timer_wheel_del_timer(wheel, timer1); expected_callbacks--; } else if (r < 128) { /* delete the timer with 25% chance */ timer_wheel_del_timer(wheel, timer2); expected_callbacks--; } else if (r < 192) { /* delete the timer with 25% chance */ timer_wheel_del_timer(wheel, timer3); expected_callbacks--; } } timer_wheel_set_time(wheel, latest + 1); if (num_callbacks != expected_callbacks) { fprintf(stderr, "Error: not enough callbacks received, " "num_callbacks=%d, expected=%d\n", num_callbacks, expected_callbacks); exit(1); } timer_wheel_free(wheel); }