summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/timer.c6
-rw-r--r--sysdep/unix/io.c17
2 files changed, 20 insertions, 3 deletions
diff --git a/lib/timer.c b/lib/timer.c
index 00ac4b03..7ca0bdaa 100644
--- a/lib/timer.c
+++ b/lib/timer.c
@@ -166,6 +166,8 @@ timers_init(struct timeloop *loop, pool *p)
BUFFER_PUSH(loop->timers) = NULL;
}
+void io_log_event(void *hook, void *data);
+
void
timers_fire(struct timeloop *loop)
{
@@ -195,6 +197,10 @@ timers_fire(struct timeloop *loop)
else
tm2_stop(t);
+ /* This is ugly hack, we want to log just timers executed from the main I/O loop */
+ if (loop == &main_timeloop)
+ io_log_event(t->hook, t->data);
+
t->hook(t);
}
}
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index ebd380ba..13635586 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -2507,9 +2507,10 @@ static int short_loops = 0;
void
io_loop(void)
{
- int poll_tout;
+ int poll_tout, timeout;
time_t tout;
int nfds, events, pout;
+ timer2 *t;
sock *s;
node *n;
int fdmax = 256;
@@ -2518,7 +2519,9 @@ io_loop(void)
watchdog_start1();
for(;;)
{
+ times_update(&main_timeloop);
events = ev_run_list(&global_event_list);
+ timers_fire(&main_timeloop);
timers:
update_times();
tout = tm_first_shot();
@@ -2527,10 +2530,16 @@ io_loop(void)
tm_shot();
goto timers;
}
- poll_tout = (events ? 0 : MIN(tout - now, 3)) * 1000; /* Time in milliseconds */
-
io_close_event();
+ poll_tout = (events ? 0 : MIN(tout - now, 3)) * 1000; /* Time in milliseconds */
+ if (t = timers_first(&main_timeloop))
+ {
+ times_update(&main_timeloop);
+ timeout = (tm2_remains(t) TO_MS) + 1;
+ poll_tout = MIN(poll_tout, timeout);
+ }
+
nfds = 0;
WALK_LIST(n, sock_list)
{
@@ -2601,6 +2610,8 @@ io_loop(void)
}
if (pout)
{
+ times_update(&main_timeloop);
+
/* guaranteed to be non-empty */
current_sock = SKIP_BACK(sock, n, HEAD(sock_list));