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);
|
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);
|
apiserver_init(c);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -403,7 +403,7 @@ int cmd_worker(int argc, char* argv[])
|
||||||
|
|
||||||
active_ctx = &workerctx;
|
active_ctx = &workerctx;
|
||||||
|
|
||||||
delaymgr_init(&delaymgr, 2, NULL);
|
delaymgr_init(&delaymgr, 2000 /* precision_ms */, NULL);
|
||||||
delaymgr_start(&delaymgr);
|
delaymgr_start(&delaymgr);
|
||||||
delay_task(&delaymgr, 5, -1, (delay_task_entry_fn_t)worker_house_keeping,
|
delay_task(&delaymgr, 5, -1, (delay_task_entry_fn_t)worker_house_keeping,
|
||||||
&workerctx);
|
&workerctx);
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
pthread_t worker;
|
pthread_t worker;
|
||||||
int running;
|
int running;
|
||||||
int precision;
|
int precision_ms;
|
||||||
task_run_fn_t runner_fn;
|
task_run_fn_t runner_fn;
|
||||||
timer_t timerid;
|
timer_t timerid;
|
||||||
ordq_t tasks;
|
ordq_t tasks;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include "delay.h"
|
#include "delay.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
@ -17,7 +18,10 @@ static void* delay_worker(void* args)
|
||||||
time_t now;
|
time_t now;
|
||||||
|
|
||||||
pthread_testcancel();
|
pthread_testcancel();
|
||||||
sleep(mgr->precision);
|
{
|
||||||
|
struct timespec ts = { 0, (long)mgr->precision_ms * 1000000L };
|
||||||
|
nanosleep(&ts, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
it = ordq_peek(&(mgr->tasks), NULL);
|
it = ordq_peek(&(mgr->tasks), NULL);
|
||||||
if (it == 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;
|
runner_fn = default_runner_fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
mgr->precision = precision;
|
mgr->precision_ms = precision;
|
||||||
mgr->running = 0;
|
mgr->running = 0;
|
||||||
mgr->runner_fn = runner_fn;
|
mgr->runner_fn = runner_fn;
|
||||||
mgr->worker = 0;
|
mgr->worker = 0;
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ static void test_delay1()
|
||||||
int delay_period = 2;
|
int delay_period = 2;
|
||||||
time_t t_start = time(NULL);
|
time_t t_start = time(NULL);
|
||||||
|
|
||||||
delaymgr_init(&mgr, 1, NULL);
|
delaymgr_init(&mgr, 1000 /* precision_ms */, NULL);
|
||||||
delaymgr_start(&mgr);
|
delaymgr_start(&mgr);
|
||||||
delay_task(&mgr, delay_period, runcount, (delay_task_entry_fn_t)delay_work,
|
delay_task(&mgr, delay_period, runcount, (delay_task_entry_fn_t)delay_work,
|
||||||
&count);
|
&count);
|
||||||
|
|
@ -48,9 +48,22 @@ static void test_delay1()
|
||||||
return;
|
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)
|
void test_delay(void)
|
||||||
{
|
{
|
||||||
printf("\n>> delay test\n\n");
|
printf("\n>> delay test\n\n");
|
||||||
|
|
||||||
RUN_TEST(test_delay1);
|
RUN_TEST(test_delay1);
|
||||||
|
RUN_TEST(test_delaymgr_precision_ms_field);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue