2
0
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:
Bob Halley
1998-10-23 22:59:44 +00:00
parent 3ce87f4ed9
commit 5cc3e0c38f

View File

@@ -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) {