#if !defined(_DELAY_H_) #define _DELAY_H_ 1 #include #include #include #include #include "ordq.h" typedef int (*delay_task_entry_fn_t)(void*); typedef int (*task_run_fn_t)(delay_task_entry_fn_t, void*); /* Single normalized time domain: every task (whether scheduled via * delay_task() seconds or delay_task_ms() milliseconds) is stored as one * flat CLOCK_MONOTONIC millisecond deadline. There is no separate * wall-clock/ms task "flavor" to distinguish -- delay_task() is a thin * seconds->ms wrapper around delay_task_ms() (see delay.c), so every entry * in the queue is always comparable on the same scale with a single * integer comparison (no tv_sec/tv_nsec pair, no carry arithmetic). */ typedef struct { uint64_t nextrun_ms; /* CLOCK_MONOTONIC deadline, in ms */ int run_period_ms; int runcount; delay_task_entry_fn_t entry; void* args; } delay_task_t; typedef struct { pthread_t worker; int running; int precision_ms; task_run_fn_t runner_fn; timer_t timerid; ordq_t tasks; } delaymgr_t; extern int delaymgr_init(delaymgr_t*, int, task_run_fn_t); extern void delaymgr_stop(delaymgr_t*); extern void delaymgr_fini(delaymgr_t*); extern int delaymgr_start(delaymgr_t*); extern int delay_task(delaymgr_t*, int, int, delay_task_entry_fn_t, void*); extern int delay_task_ms(delaymgr_t*, int, int, delay_task_entry_fn_t, void*); #endif