/** * @see pomp_timer_new. */ static struct pomp_timer *pomp_timer_win32_new(struct pomp_loop *loop, pomp_timer_cb_t cb, void *userdata) { struct pomp_timer *timer = NULL; struct pomp_fd *pfd = NULL; POMP_RETURN_VAL_IF_FAILED(loop != NULL, -EINVAL, NULL); POMP_RETURN_VAL_IF_FAILED(cb != NULL, -EINVAL, NULL); /* Allocate timer structure */ timer = calloc(1, sizeof(*timer)); if (timer == NULL) goto error; timer->loop = loop; timer->cb = cb; timer->userdata = userdata; /* Create event for notification */ timer->hevt = CreateEvent(NULL, TRUE, FALSE, NULL); if (timer->hevt == NULL) goto error; /* Add it in loop */ pfd = pomp_loop_win32_add_pfd_with_hevt(timer->loop, timer->hevt, &pomp_timer_win32_cb, timer); if (pfd == NULL) goto error; /* Success */ return timer; /* Cleanup in case of error */ error: if (timer != NULL) pomp_timer_win32_destroy(timer); return NULL; }
static void test_loop(void) { int res = 0; HANDLE htimer1 = NULL, htimer2 = NULL, htimer3 = NULL; struct test_data data; struct pomp_loop *loop = NULL; struct pomp_fd *pfd = NULL; memset(&data, 0, sizeof(data)); /* Create loop */ loop = pomp_loop_new(); CU_ASSERT_PTR_NOT_NULL_FATAL(loop); /* Create timers for testing */ htimer1 = setup_timer_win32(100, 500); CU_ASSERT_PTR_NOT_NULL_FATAL(htimer1); htimer2 = setup_timer_win32(50, 500); CU_ASSERT_PTR_NOT_NULL_FATAL(htimer2); htimer3 = setup_timer_win32(150, 500); CU_ASSERT_PTR_NOT_NULL_FATAL(htimer3); /* Add timer in loop */ pfd = pomp_loop_win32_add_pfd_with_hevt(loop, htimer1, &timer_win32_cb, &data); CU_ASSERT_PTR_NOT_NULL(pfd); /* Add 2nd and 3rd timer in loop */ pfd = pomp_loop_win32_add_pfd_with_hevt(loop, htimer2, &timer_win32_cb, &data); CU_ASSERT_PTR_NOT_NULL(pfd); pfd = pomp_loop_win32_add_pfd_with_hevt(loop, htimer3, &timer_win32_cb, &data); CU_ASSERT_PTR_NOT_NULL(pfd); /* Run loop with different timeout first one should have all timers) */ res = pomp_loop_wait_and_process(loop, 500); CU_ASSERT_EQUAL(res, 0); res = pomp_loop_wait_and_process(loop, 0); CU_ASSERT_TRUE(res == -ETIMEDOUT || res == 0); res = pomp_loop_wait_and_process(loop, -1); CU_ASSERT_EQUAL(res, 0); /* Invalid run (NULL param) */ res = pomp_loop_wait_and_process(NULL, 0); CU_ASSERT_EQUAL(res, -EINVAL); /* Invalid destroy (NULL param) */ res = pomp_loop_destroy(NULL); CU_ASSERT_EQUAL(res, -EINVAL); /* Invalid destroy (busy) */ res = pomp_loop_destroy(loop); CU_ASSERT_EQUAL(res, -EBUSY); /* Remove timers */ pfd = pomp_loop_win32_find_pfd_by_hevt(loop, htimer1); CU_ASSERT_PTR_NOT_NULL(pfd); res = pomp_loop_remove_pfd(loop, pfd); CU_ASSERT_EQUAL(res, 0); free(pfd); pfd = pomp_loop_win32_find_pfd_by_hevt(loop, htimer2); CU_ASSERT_PTR_NOT_NULL(pfd); res = pomp_loop_remove_pfd(loop, pfd); CU_ASSERT_EQUAL(res, 0); free(pfd); pfd = pomp_loop_win32_find_pfd_by_hevt(loop, htimer3); CU_ASSERT_PTR_NOT_NULL(pfd); res = pomp_loop_remove_pfd(loop, pfd); CU_ASSERT_EQUAL(res, 0); free(pfd); /* Close timers */ res = CloseHandle(htimer1); CU_ASSERT_EQUAL(res, 1); res = CloseHandle(htimer2); CU_ASSERT_EQUAL(res, 1); res = CloseHandle(htimer3); CU_ASSERT_EQUAL(res, 1); /* Destroy loop */ res = pomp_loop_destroy(loop); CU_ASSERT_EQUAL(res, 0); }