feat: rename delaymgr precision→precision_ms, replace sleep() with nanosleep() (P0-2b)
- Rename `precision` field to `precision_ms` in delaymgr_t struct (delay.h) - Replace `sleep(mgr->precision)` with `nanosleep()` for 10ms granularity (delay.c) - Add `#include <time.h>` to delay.c (already in delay.h) - Update delaymgr_init() to store precision_ms parameter - Update all call sites: cluster.c (2→200ms), controller/testsuite/test.c (2→2000ms), lib/testsuite/test_delay.c (1→1000ms) - Add TDD test test_delaymgr_precision_ms_field verifying field exists and stores correctly - delay_task() delay parameter remains in seconds; only sleep granularity changes
This commit is contained in:
parent
762b59c043
commit
6d4d8eb81d
5 changed files with 23 additions and 6 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue