Lines Matching refs:timer
137 isc__timer_reset(isc_timer_t *timer, isc_timertype_t type,
141 isc__timer_gettype(isc_timer_t *timer);
143 isc__timer_touch(isc_timer_t *timer);
201 schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) { in schedule() argument
214 REQUIRE(timer->type != isc_timertype_inactive); in schedule()
220 manager = timer->manager; in schedule()
234 if (timer->type != isc_timertype_once) { in schedule()
235 result = isc_time_add(now, &timer->interval, &due); in schedule()
238 if (timer->type == isc_timertype_limited && in schedule()
239 isc_time_compare(&timer->expires, &due) < 0) in schedule()
240 due = timer->expires; in schedule()
242 if (isc_time_isepoch(&timer->idle)) in schedule()
243 due = timer->expires; in schedule()
244 else if (isc_time_isepoch(&timer->expires)) in schedule()
245 due = timer->idle; in schedule()
246 else if (isc_time_compare(&timer->idle, &timer->expires) < 0) in schedule()
247 due = timer->idle; in schedule()
249 due = timer->expires; in schedule()
256 if (timer->index > 0) { in schedule()
260 cmp = isc_time_compare(&due, &timer->due); in schedule()
261 timer->due = due; in schedule()
264 isc_heap_increased(manager->heap, timer->index); in schedule()
267 isc_heap_decreased(manager->heap, timer->index); in schedule()
274 timer->due = due; in schedule()
275 result = isc_heap_insert(manager->heap, timer); in schedule()
284 ISC_MSG_SCHEDULE, "schedule"), timer, due); in schedule()
319 if (timer->index == 1 && signal_ok) { in schedule()
326 if (timer->index == 1 && in schedule()
327 isc_time_compare(&timer->due, &manager->due) < 0) in schedule()
328 manager->due = timer->due; in schedule()
335 deschedule(isc__timer_t *timer) { in deschedule() argument
345 manager = timer->manager; in deschedule()
346 if (timer->index > 0) { in deschedule()
348 if (timer->index == 1) in deschedule()
351 isc_heap_delete(manager->heap, timer->index); in deschedule()
352 timer->index = 0; in deschedule()
367 destroy(isc__timer_t *timer) { in destroy() argument
368 isc__timermgr_t *manager = timer->manager; in destroy()
376 (void)isc_task_purgerange(timer->task, in destroy()
377 timer, in destroy()
381 deschedule(timer); in destroy()
382 UNLINK(manager->timers, timer, link); in destroy()
386 isc_task_detach(&timer->task); in destroy()
387 DESTROYLOCK(&timer->lock); in destroy()
388 timer->common.impmagic = 0; in destroy()
389 timer->common.magic = 0; in destroy()
390 isc_mem_put(manager->mctx, timer, sizeof(*timer)); in destroy()
400 isc__timer_t *timer; in isc__timer_create() local
440 timer = isc_mem_get(manager->mctx, sizeof(*timer)); in isc__timer_create()
441 if (timer == NULL) in isc__timer_create()
444 timer->manager = manager; in isc__timer_create()
445 timer->references = 1; in isc__timer_create()
448 result = isc_time_add(&now, interval, &timer->idle); in isc__timer_create()
450 isc_mem_put(manager->mctx, timer, sizeof(*timer)); in isc__timer_create()
454 isc_time_settoepoch(&timer->idle); in isc__timer_create()
456 timer->type = type; in isc__timer_create()
457 timer->expires = *expires; in isc__timer_create()
458 timer->interval = *interval; in isc__timer_create()
459 timer->task = NULL; in isc__timer_create()
460 isc_task_attach(task, &timer->task); in isc__timer_create()
461 timer->action = action; in isc__timer_create()
472 DE_CONST(arg, timer->arg); in isc__timer_create()
473 timer->index = 0; in isc__timer_create()
474 result = isc_mutex_init(&timer->lock); in isc__timer_create()
476 isc_task_detach(&timer->task); in isc__timer_create()
477 isc_mem_put(manager->mctx, timer, sizeof(*timer)); in isc__timer_create()
480 ISC_LINK_INIT(timer, link); in isc__timer_create()
481 timer->common.impmagic = TIMER_MAGIC; in isc__timer_create()
482 timer->common.magic = ISCAPI_TIMER_MAGIC; in isc__timer_create()
483 timer->common.methods = (isc_timermethods_t *)&timermethods; in isc__timer_create()
493 result = schedule(timer, &now, ISC_TRUE); in isc__timer_create()
497 APPEND(manager->timers, timer, link); in isc__timer_create()
502 timer->common.impmagic = 0; in isc__timer_create()
503 timer->common.magic = 0; in isc__timer_create()
504 DESTROYLOCK(&timer->lock); in isc__timer_create()
505 isc_task_detach(&timer->task); in isc__timer_create()
506 isc_mem_put(manager->mctx, timer, sizeof(*timer)); in isc__timer_create()
510 *timerp = (isc_timer_t *)timer; in isc__timer_create()
520 isc__timer_t *timer = (isc__timer_t *)timer0; in isc__timer_reset() local
531 REQUIRE(VALID_TIMER(timer)); in isc__timer_reset()
532 manager = timer->manager; in isc__timer_reset()
559 LOCK(&timer->lock); in isc__timer_reset()
562 (void)isc_task_purgerange(timer->task, in isc__timer_reset()
563 timer, in isc__timer_reset()
567 timer->type = type; in isc__timer_reset()
568 timer->expires = *expires; in isc__timer_reset()
569 timer->interval = *interval; in isc__timer_reset()
571 result = isc_time_add(&now, interval, &timer->idle); in isc__timer_reset()
573 isc_time_settoepoch(&timer->idle); in isc__timer_reset()
579 deschedule(timer); in isc__timer_reset()
582 result = schedule(timer, &now, ISC_TRUE); in isc__timer_reset()
585 UNLOCK(&timer->lock); in isc__timer_reset()
593 isc__timer_t *timer = (isc__timer_t *)timer0; in isc__timer_gettype() local
596 REQUIRE(VALID_TIMER(timer)); in isc__timer_gettype()
598 LOCK(&timer->lock); in isc__timer_gettype()
599 t = timer->type; in isc__timer_gettype()
600 UNLOCK(&timer->lock); in isc__timer_gettype()
607 isc__timer_t *timer = (isc__timer_t *)timer0; in isc__timer_touch() local
615 REQUIRE(VALID_TIMER(timer)); in isc__timer_touch()
617 LOCK(&timer->lock); in isc__timer_touch()
629 result = isc_time_add(&now, &timer->interval, &timer->idle); in isc__timer_touch()
631 UNLOCK(&timer->lock); in isc__timer_touch()
638 isc__timer_t *timer = (isc__timer_t *)timer0; in isc__timer_attach() local
644 REQUIRE(VALID_TIMER(timer)); in isc__timer_attach()
647 LOCK(&timer->lock); in isc__timer_attach()
648 timer->references++; in isc__timer_attach()
649 UNLOCK(&timer->lock); in isc__timer_attach()
651 *timerp = (isc_timer_t *)timer; in isc__timer_attach()
656 isc__timer_t *timer; in isc__timer_detach() local
664 timer = (isc__timer_t *)*timerp; in isc__timer_detach()
665 REQUIRE(VALID_TIMER(timer)); in isc__timer_detach()
667 LOCK(&timer->lock); in isc__timer_detach()
668 REQUIRE(timer->references > 0); in isc__timer_detach()
669 timer->references--; in isc__timer_detach()
670 if (timer->references == 0) in isc__timer_detach()
672 UNLOCK(&timer->lock); in isc__timer_detach()
675 destroy(timer); in isc__timer_detach()
685 isc__timer_t *timer; in dispatch() local
694 timer = isc_heap_element(manager->heap, 1); in dispatch()
695 INSIST(timer->type != isc_timertype_inactive); in dispatch()
696 if (isc_time_compare(now, &timer->due) >= 0) { in dispatch()
697 if (timer->type == isc_timertype_ticker) { in dispatch()
701 } else if (timer->type == isc_timertype_limited) { in dispatch()
703 cmp = isc_time_compare(now, &timer->expires); in dispatch()
713 } else if (!isc_time_isepoch(&timer->expires) && in dispatch()
715 &timer->expires) >= 0) { in dispatch()
722 LOCK(&timer->lock); in dispatch()
723 if (!isc_time_isepoch(&timer->idle) && in dispatch()
725 &timer->idle) >= 0) { in dispatch()
728 UNLOCK(&timer->lock); in dispatch()
742 timer); in dispatch()
752 "posting"), timer); in dispatch()
757 timer, in dispatch()
759 timer->action, in dispatch()
760 timer->arg, in dispatch()
764 event->due = timer->due; in dispatch()
765 isc_task_send(timer->task, in dispatch()
776 timer->index = 0; in dispatch()
781 result = schedule(timer, now, ISC_FALSE); in dispatch()
793 manager->due = timer->due; in dispatch()
862 isc__timer_t *timer; in set_index() local
864 timer = what; in set_index()
865 REQUIRE(VALID_TIMER(timer)); in set_index()
867 timer->index = index; in set_index()