Lines Matching defs:timeout

218 static void timeout_update_next(struct timeout *timeout, struct timeval *tv_now)
221 if (gettimeofday(&timeout->next_run, NULL) < 0)
224 timeout->next_run.tv_sec = tv_now->tv_sec;
225 timeout->next_run.tv_usec = tv_now->tv_usec;
230 timeout->next_run.tv_usec -= timeout->next_run.tv_usec % 1000;
232 timeout->next_run.tv_sec += timeout->msecs/1000;
233 timeout->next_run.tv_usec += (timeout->msecs%1000)*1000;
235 if (timeout->next_run.tv_usec >= 1000000) {
236 timeout->next_run.tv_sec++;
237 timeout->next_run.tv_usec -= 1000000;
241 static struct timeout *
246 struct timeout *timeout;
248 timeout = i_new(struct timeout, 1);
249 timeout->item.idx = UINT_MAX;
250 timeout->source_filename = source_filename;
251 timeout->source_linenum = source_linenum;
252 timeout->ioloop = ioloop;
254 timeout->callback = callback;
255 timeout->context = context;
257 if (timeout->ioloop->cur_ctx != NULL) {
258 timeout->ctx = timeout->ioloop->cur_ctx;
259 io_loop_context_ref(timeout->ctx);
262 return timeout;
266 struct timeout *timeout_add_to(struct ioloop *ioloop, unsigned int msecs,
271 struct timeout *timeout;
273 timeout = timeout_add_common(ioloop, source_filename, source_linenum,
275 timeout->msecs = msecs;
278 /* start this timeout in the next run cycle */
279 array_append(&timeout->ioloop->timeouts_new, &timeout, 1);
282 timeout_update_next(timeout, timeout->ioloop->running ?
284 priorityq_add(timeout->ioloop->timeouts, &timeout->item);
286 return timeout;
290 struct timeout *timeout_add(unsigned int msecs, const char *source_filename,
300 struct timeout *
311 struct timeout *
321 struct timeout *
327 struct timeout *timeout;
329 timeout = timeout_add_common(ioloop, source_filename, source_linenum,
331 timeout->one_shot = TRUE;
332 timeout->next_run = *time;
334 priorityq_add(timeout->ioloop->timeouts, &timeout->item);
335 return timeout;
339 struct timeout *
350 static struct timeout *
351 timeout_copy(const struct timeout *old_to, struct ioloop *ioloop)
353 struct timeout *new_to;
372 static void timeout_free(struct timeout *timeout)
374 if (timeout->ctx != NULL)
375 io_loop_context_unref(&timeout->ctx);
376 i_free(timeout);
379 void timeout_remove(struct timeout **_timeout)
381 struct timeout *timeout = *_timeout;
384 if (timeout == NULL)
387 ioloop = timeout->ioloop;
390 if (timeout->item.idx != UINT_MAX)
391 priorityq_remove(timeout->ioloop->timeouts, &timeout->item);
392 else if (!timeout->one_shot && timeout->msecs > 0) {
393 struct timeout *const *to_idx;
395 if (*to_idx == timeout) {
402 timeout_free(timeout);
406 timeout_reset_timeval(struct timeout *timeout, struct timeval *tv_now)
408 if (timeout->item.idx == UINT_MAX)
411 timeout_update_next(timeout, tv_now);
412 if (timeout->msecs <= 1) {
417 timeout->next_run.tv_usec += 2000;
418 if (timeout->next_run.tv_usec >= 1000000) {
419 timeout->next_run.tv_sec++;
420 timeout->next_run.tv_usec -= 1000000;
424 timeout->next_run.tv_sec > tv_now->tv_sec ||
425 (timeout->next_run.tv_sec == tv_now->tv_sec &&
426 timeout->next_run.tv_usec > tv_now->tv_usec));
427 priorityq_remove(timeout->ioloop->timeouts, &timeout->item);
428 priorityq_add(timeout->ioloop->timeouts, &timeout->item);
431 void timeout_reset(struct timeout *timeout)
433 i_assert(!timeout->one_shot);
434 timeout_reset_timeval(timeout, NULL);
437 static int timeout_get_wait_time(struct timeout *timeout, struct timeval *tv_r,
450 i_assert(timeout->next_run.tv_sec > 0);
452 tv_r->tv_sec = timeout->next_run.tv_sec - tv_r->tv_sec;
453 tv_r->tv_usec = timeout->next_run.tv_usec - tv_r->tv_usec;
477 struct timeout *timeout;
481 timeout = (struct timeout *)item;
486 if (timeout == NULL && ioloop->io_pending_count == 0) {
503 msecs = timeout_get_wait_time(timeout, tv_r, &tv_now);
517 const struct timeout *to1 = p1, *to2 = p2;
532 struct timeout *const *to_idx;
540 struct timeout *timeout= *to_idx;
541 i_assert(timeout->next_run.tv_sec == 0 &&
542 timeout->next_run.tv_usec == 0);
543 i_assert(!timeout->one_shot);
544 i_assert(timeout->msecs > 0);
545 timeout_update_next(timeout, &ioloop_timeval);
546 priorityq_add(ioloop->timeouts, &timeout->item);
559 struct timeout *to = (struct timeout *)items[i];
622 struct timeout *timeout = (struct timeout *)item;
626 if (timeout_get_wait_time(timeout, &tv, &tv_call) > 0)
629 if (timeout->one_shot) {
630 /* remove timeout from queue */
631 priorityq_remove(timeout->ioloop->timeouts, &timeout->item);
633 /* update timeout's next_run and reposition it in the queue */
634 timeout_reset_timeval(timeout, &tv_call);
637 if (timeout->ctx != NULL)
638 io_loop_context_activate(timeout->ctx);
639 t_id = t_push_named("ioloop timeout handler %p",
640 (void *)timeout->callback);
641 timeout->callback(timeout->context);
643 i_panic("Leaked a t_pop() call in timeout handler %p",
644 (void *)timeout->callback);
789 struct timeout *const *to_idx;
821 struct timeout *to = *to_idx;
837 struct timeout *to = (struct timeout *)item;
1103 struct timeout *io_loop_move_timeout_to(struct ioloop *ioloop,
1104 struct timeout **_timeout)
1106 struct timeout *new_to, *old_to = *_timeout;
1116 struct timeout *io_loop_move_timeout(struct timeout **_timeout)