static void test_outstanding (Test* test, gconstpointer unused) { /* A timer that can't be called */ gkm_timer_start (test->module, 5, timer_callback, NULL); gkm_timer_start (test->module, 10, timer_callback, NULL); gkm_timer_start (test->module, 1, timer_callback, NULL); }
static void test_multiple (Test* test, gconstpointer unused) { timer_check = 0; /* Multiple timers, add out of order, should be called in order */ gkm_timer_start (test->module, 1, multiple_callback, GINT_TO_POINTER (1)); gkm_timer_start (test->module, 3, multiple_callback, GINT_TO_POINTER (3)); gkm_timer_start (test->module, 2, multiple_callback, GINT_TO_POINTER (2)); gkm_timer_start (test->module, 0, multiple_callback, GINT_TO_POINTER (0)); mock_module_leave (); egg_test_wait_until (3500); mock_module_enter (); g_assert (timer_check == 4); }
static void test_simple (Test* test, gconstpointer unused) { GkmTimer *timer; timer = gkm_timer_start (test->module, 2, timer_callback, &timer); mock_module_leave (); egg_test_wait_until (2200); mock_module_enter (); g_assert (timer == NULL); }
static void test_immediate (Test* test, gconstpointer unused) { GkmTimer *timer; /* Setup timer in the past, should execute as soon as possible */ timer = gkm_timer_start (test->module, -5, timer_callback, &timer); /* Should not be called immediately */ g_assert (timer != NULL); mock_module_leave (); egg_test_wait_until (50); mock_module_enter (); /* Should have been called now */ g_assert (timer == NULL); }
static void timer_callback (GkmTimer *timer, gpointer user_data) { GkmObject *self = user_data; glong after, idle, offset; GkmObjectTransient *transient; GTimeVal tv; g_return_if_fail (GKM_IS_OBJECT (self)); g_object_ref (self); g_return_if_fail (self->pv->transient); transient = self->pv->transient; g_return_if_fail (timer == transient->timer); transient->timer = NULL; g_get_current_time (&tv); idle = after = G_MAXLONG; /* Are we supposed to be destroyed after a certain time? */ if (transient->timed_after) { g_return_if_fail (transient->stamp_created); after = (transient->stamp_created + transient->timed_after) - tv.tv_sec; } /* Are we supposed to be destroyed after an idle time? */ if (transient->timed_idle) { g_return_if_fail (transient->stamp_used); idle = (transient->stamp_used + transient->timed_idle) - tv.tv_sec; } /* Okay, time to destroy? */ offset = MIN (after, idle); if (offset <= 0) self_destruct (self); /* Setup the next timer */ else transient->timer = gkm_timer_start (self->pv->module, offset, timer_callback, self); g_object_unref (self); }
static void test_cancel (Test* test, gconstpointer unused) { GkmTimer *timer; timer = gkm_timer_start (test->module, 2, timer_callback, &timer); mock_module_leave (); egg_test_wait_until (50); mock_module_enter (); gkm_timer_cancel (timer); mock_module_leave (); egg_test_wait_until (3000); mock_module_enter (); /* The callback should not have been called */ g_assert (timer != NULL); }