diff --git a/src/controller/cluster.c b/src/controller/cluster.c index f369f101..c4b4a72c 100644 --- a/src/controller/cluster.c +++ b/src/controller/cluster.c @@ -605,7 +605,7 @@ int cluster_init(cluster_t* c) vtaskmgr_init(&(c->vtaskmgr), c->myconf->cluster_config->vcpus); - delaymgr_init(&(c->delaymgr), 2, run_delay_tasks); + delaymgr_init(&(c->delaymgr), 200 /* precision_ms */, run_delay_tasks); apiserver_init(c); diff --git a/src/controller/testsuite/test.c b/src/controller/testsuite/test.c index 081d8a95..915deb1e 100644 --- a/src/controller/testsuite/test.c +++ b/src/controller/testsuite/test.c @@ -403,7 +403,7 @@ int cmd_worker(int argc, char* argv[]) active_ctx = &workerctx; - delaymgr_init(&delaymgr, 2, NULL); + delaymgr_init(&delaymgr, 2000 /* precision_ms */, NULL); delaymgr_start(&delaymgr); delay_task(&delaymgr, 5, -1, (delay_task_entry_fn_t)worker_house_keeping, &workerctx); diff --git a/src/include/delay.h b/src/include/delay.h index 90e0b73f..19a306d8 100644 --- a/src/include/delay.h +++ b/src/include/delay.h @@ -23,7 +23,7 @@ typedef struct { typedef struct { pthread_t worker; int running; - int precision; + int precision_ms; task_run_fn_t runner_fn; timer_t timerid; ordq_t tasks; diff --git a/src/lib/delay.c b/src/lib/delay.c index f2180db4..28fcba88 100644 --- a/src/lib/delay.c +++ b/src/lib/delay.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "delay.h" #include "utils.h" @@ -17,7 +18,10 @@ static void* delay_worker(void* args) time_t now; pthread_testcancel(); - sleep(mgr->precision); + { + struct timespec ts = { 0, (long)mgr->precision_ms * 1000000L }; + nanosleep(&ts, NULL); + } it = ordq_peek(&(mgr->tasks), NULL); if (it == NULL) { @@ -100,7 +104,7 @@ int delaymgr_init(delaymgr_t* mgr, int precision, task_run_fn_t runner_fn) runner_fn = default_runner_fn; } - mgr->precision = precision; + mgr->precision_ms = precision; mgr->running = 0; mgr->runner_fn = runner_fn; mgr->worker = 0; diff --git a/src/lib/testsuite/test_delay.c b/src/lib/testsuite/test_delay.c index 08214fe5..96acd359 100644 --- a/src/lib/testsuite/test_delay.c +++ b/src/lib/testsuite/test_delay.c @@ -26,7 +26,7 @@ static void test_delay1() int delay_period = 2; time_t t_start = time(NULL); - delaymgr_init(&mgr, 1, NULL); + delaymgr_init(&mgr, 1000 /* precision_ms */, NULL); delaymgr_start(&mgr); delay_task(&mgr, delay_period, runcount, (delay_task_entry_fn_t)delay_work, &count); @@ -48,9 +48,22 @@ static void test_delay1() return; } +static void test_delaymgr_precision_ms_field(void) +{ + delaymgr_t mgr; + memset(&mgr, 0, sizeof(mgr)); + /* precision_ms field must exist and be stored correctly */ + int rc = delaymgr_init(&mgr, 200 /* precision_ms */, NULL); + TEST_ASSERT_EQUAL_INT(0, rc); + TEST_ASSERT_EQUAL_INT(200, mgr.precision_ms); + delaymgr_fini(&mgr); + printf("test_delaymgr_precision_ms_field: PASS\n"); +} + void test_delay(void) { printf("\n>> delay test\n\n"); RUN_TEST(test_delay1); + RUN_TEST(test_delaymgr_precision_ms_field); }