mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
opaque isc_time_t; add isc_interval_t; conditional WINAPI for run()
This commit is contained in:
@@ -33,9 +33,6 @@
|
|||||||
#define WAITUNTIL(cvp, lp, tp) \
|
#define WAITUNTIL(cvp, lp, tp) \
|
||||||
isc_condition_waituntil((cvp), (lp), (tp))
|
isc_condition_waituntil((cvp), (lp), (tp))
|
||||||
|
|
||||||
#define ZERO(t) ((t).seconds == 0 && \
|
|
||||||
(t).nanoseconds == 0)
|
|
||||||
|
|
||||||
#ifdef ISC_TIMER_TRACE
|
#ifdef ISC_TIMER_TRACE
|
||||||
#define XTRACE(s) printf("%s\n", (s))
|
#define XTRACE(s) printf("%s\n", (s))
|
||||||
#define XTRACEID(s, t) printf("%s %p\n", (s), (t))
|
#define XTRACEID(s, t) printf("%s %p\n", (s), (t))
|
||||||
@@ -64,7 +61,7 @@ struct isc_timer {
|
|||||||
/* Locked by manager lock. */
|
/* Locked by manager lock. */
|
||||||
isc_timertype_t type;
|
isc_timertype_t type;
|
||||||
struct isc_time expires;
|
struct isc_time expires;
|
||||||
struct isc_time interval;
|
struct isc_interval interval;
|
||||||
isc_task_t task;
|
isc_task_t task;
|
||||||
isc_taskaction_t action;
|
isc_taskaction_t action;
|
||||||
void * arg;
|
void * arg;
|
||||||
@@ -109,9 +106,9 @@ schedule(isc_timer_t timer, isc_time_t now, isc_boolean_t signal_ok) {
|
|||||||
if (timer->type == isc_timertype_ticker)
|
if (timer->type == isc_timertype_ticker)
|
||||||
isc_time_add(now, &timer->interval, &due);
|
isc_time_add(now, &timer->interval, &due);
|
||||||
else {
|
else {
|
||||||
if (ZERO(timer->idle))
|
if (isc_time_isepoch(&timer->idle))
|
||||||
due = timer->expires;
|
due = timer->expires;
|
||||||
else if (ZERO(timer->expires))
|
else if (isc_time_isepoch(&timer->expires))
|
||||||
due = timer->idle;
|
due = timer->idle;
|
||||||
else if (isc_time_compare(&timer->idle, &timer->expires) < 0)
|
else if (isc_time_compare(&timer->idle, &timer->expires) < 0)
|
||||||
due = timer->idle;
|
due = timer->idle;
|
||||||
@@ -214,7 +211,7 @@ destroy(isc_timer_t timer) {
|
|||||||
|
|
||||||
isc_result
|
isc_result
|
||||||
isc_timer_create(isc_timermgr_t manager, isc_timertype_t type,
|
isc_timer_create(isc_timermgr_t manager, isc_timertype_t type,
|
||||||
isc_time_t expires, isc_time_t interval,
|
isc_time_t expires, isc_interval_t interval,
|
||||||
isc_task_t task, isc_taskaction_t action, void *arg,
|
isc_task_t task, isc_taskaction_t action, void *arg,
|
||||||
isc_timer_t *timerp)
|
isc_timer_t *timerp)
|
||||||
{
|
{
|
||||||
@@ -233,7 +230,7 @@ isc_timer_create(isc_timermgr_t manager, isc_timertype_t type,
|
|||||||
REQUIRE(VALID_MANAGER(manager));
|
REQUIRE(VALID_MANAGER(manager));
|
||||||
REQUIRE(task != NULL);
|
REQUIRE(task != NULL);
|
||||||
REQUIRE(action != NULL);
|
REQUIRE(action != NULL);
|
||||||
REQUIRE(!(ZERO(*expires) && ZERO(*interval)));
|
REQUIRE(!(isc_time_isepoch(expires) && isc_interval_iszero(interval)));
|
||||||
REQUIRE(timerp != NULL && *timerp == NULL);
|
REQUIRE(timerp != NULL && *timerp == NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -254,12 +251,10 @@ isc_timer_create(isc_timermgr_t manager, isc_timertype_t type,
|
|||||||
timer->magic = TIMER_MAGIC;
|
timer->magic = TIMER_MAGIC;
|
||||||
timer->manager = manager;
|
timer->manager = manager;
|
||||||
timer->references = 1;
|
timer->references = 1;
|
||||||
if (type == isc_timertype_once && !ZERO(*interval))
|
if (type == isc_timertype_once && !isc_interval_iszero(interval))
|
||||||
isc_time_add(&now, interval, &timer->idle);
|
isc_time_add(&now, interval, &timer->idle);
|
||||||
else {
|
else
|
||||||
timer->idle.seconds = 0;
|
isc_time_settoepoch(&timer->idle);
|
||||||
timer->idle.nanoseconds = 0;
|
|
||||||
}
|
|
||||||
timer->type = type;
|
timer->type = type;
|
||||||
timer->expires = *expires;
|
timer->expires = *expires;
|
||||||
timer->interval = *interval;
|
timer->interval = *interval;
|
||||||
@@ -295,7 +290,8 @@ isc_timer_create(isc_timermgr_t manager, isc_timertype_t type,
|
|||||||
|
|
||||||
isc_result
|
isc_result
|
||||||
isc_timer_reset(isc_timer_t timer, isc_timertype_t type,
|
isc_timer_reset(isc_timer_t timer, isc_timertype_t type,
|
||||||
isc_time_t expires, isc_time_t interval, isc_boolean_t purge)
|
isc_time_t expires, isc_interval_t interval,
|
||||||
|
isc_boolean_t purge)
|
||||||
{
|
{
|
||||||
struct isc_time now;
|
struct isc_time now;
|
||||||
isc_timermgr_t manager;
|
isc_timermgr_t manager;
|
||||||
@@ -310,7 +306,7 @@ isc_timer_reset(isc_timer_t timer, isc_timertype_t type,
|
|||||||
REQUIRE(VALID_TIMER(timer));
|
REQUIRE(VALID_TIMER(timer));
|
||||||
manager = timer->manager;
|
manager = timer->manager;
|
||||||
REQUIRE(VALID_MANAGER(manager));
|
REQUIRE(VALID_MANAGER(manager));
|
||||||
REQUIRE(!(ZERO(*expires) && ZERO(*interval)));
|
REQUIRE(!(isc_time_isepoch(expires) && isc_interval_iszero(interval)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get current time.
|
* Get current time.
|
||||||
@@ -333,12 +329,10 @@ isc_timer_reset(isc_timer_t timer, isc_timertype_t type,
|
|||||||
timer->type = type;
|
timer->type = type;
|
||||||
timer->expires = *expires;
|
timer->expires = *expires;
|
||||||
timer->interval = *interval;
|
timer->interval = *interval;
|
||||||
if (type == isc_timertype_once && !ZERO(*interval))
|
if (type == isc_timertype_once && !isc_interval_iszero(interval))
|
||||||
isc_time_add(&now, interval, &timer->idle);
|
isc_time_add(&now, interval, &timer->idle);
|
||||||
else {
|
else
|
||||||
timer->idle.seconds = 0;
|
isc_time_settoepoch(&timer->idle);
|
||||||
timer->idle.nanoseconds = 0;
|
|
||||||
}
|
|
||||||
result = schedule(timer, &now, ISC_TRUE);
|
result = schedule(timer, &now, ISC_TRUE);
|
||||||
|
|
||||||
UNLOCK(&timer->lock);
|
UNLOCK(&timer->lock);
|
||||||
@@ -433,15 +427,15 @@ dispatch(isc_timermgr_t manager, isc_time_t now) {
|
|||||||
type = ISC_TIMEREVENT_TICK;
|
type = ISC_TIMEREVENT_TICK;
|
||||||
post_event = ISC_TRUE;
|
post_event = ISC_TRUE;
|
||||||
need_schedule = ISC_TRUE;
|
need_schedule = ISC_TRUE;
|
||||||
} else if (!ZERO(timer->expires) &&
|
} else if (!isc_time_isepoch(&timer->expires) &&
|
||||||
isc_time_compare(now,
|
isc_time_compare(now,
|
||||||
&timer->expires) >= 0) {
|
&timer->expires) >= 0) {
|
||||||
type = ISC_TIMEREVENT_LIFE;
|
type = ISC_TIMEREVENT_LIFE;
|
||||||
post_event = ISC_TRUE;
|
post_event = ISC_TRUE;
|
||||||
need_schedule = ISC_FALSE;
|
need_schedule = ISC_FALSE;
|
||||||
} else if (!ZERO(timer->idle) &&
|
} else if (!isc_time_isepoch(&timer->idle) &&
|
||||||
isc_time_compare(now,
|
isc_time_compare(now,
|
||||||
&timer->idle) >= 0) {
|
&timer->idle) >= 0) {
|
||||||
type = ISC_TIMEREVENT_IDLE;
|
type = ISC_TIMEREVENT_IDLE;
|
||||||
post_event = ISC_TRUE;
|
post_event = ISC_TRUE;
|
||||||
need_schedule = ISC_FALSE;
|
need_schedule = ISC_FALSE;
|
||||||
@@ -489,6 +483,9 @@ dispatch(isc_timermgr_t manager, isc_time_t now) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_threadresult_t
|
static isc_threadresult_t
|
||||||
|
#ifdef _WIN32
|
||||||
|
WINAPI
|
||||||
|
#endif
|
||||||
run(void *uap) {
|
run(void *uap) {
|
||||||
isc_timermgr_t manager = uap;
|
isc_timermgr_t manager = uap;
|
||||||
struct isc_time now;
|
struct isc_time now;
|
||||||
@@ -563,8 +560,7 @@ isc_timermgr_create(isc_memctx_t mctx, isc_timermgr_t *managerp) {
|
|||||||
manager->done = ISC_FALSE;
|
manager->done = ISC_FALSE;
|
||||||
INIT_LIST(manager->timers);
|
INIT_LIST(manager->timers);
|
||||||
manager->nscheduled = 0;
|
manager->nscheduled = 0;
|
||||||
manager->due.seconds = 0;
|
isc_time_settoepoch(&manager->due);
|
||||||
manager->due.nanoseconds = 0;
|
|
||||||
manager->heap = NULL;
|
manager->heap = NULL;
|
||||||
result = isc_heap_create(mctx, sooner, set_index, 0, &manager->heap);
|
result = isc_heap_create(mctx, sooner, set_index, 0, &manager->heap);
|
||||||
if (result != ISC_R_SUCCESS) {
|
if (result != ISC_R_SUCCESS) {
|
||||||
|
Reference in New Issue
Block a user