The timers can be destroyed while the timer actions are still running,
and when the action calls isc_event_free() it can assert, because it's
trying to access the destroyed timer object.
Before destroying the timers, first disable them, then wait 2 seconds
of grace period before destroying them.
atomic_store(&done, true);
+ /* Let everything run for 10 seconds. */
sleep(10);
+
+ /*
+ * Disable the timers, let all the already dispatched events to
+ * complete, and then destroy the timers.
+ */
+ (void)isc_timer_reset(ti1, isc_timertype_inactive, NULL, NULL, true);
+ (void)isc_timer_reset(ti2, isc_timertype_inactive, NULL, NULL, true);
+ (void)isc_timer_reset(ti3, isc_timertype_inactive, NULL, NULL, true);
+ sleep(4);
isc_timer_destroy(&ti1);
isc_timer_destroy(&ti2);
LOCK(&lock);