From f57c6e129815d530c8f4d584b17b12aa7e1cd7dd Mon Sep 17 00:00:00 2001 From: Andreas Fink Date: Mon, 30 Nov 2009 15:36:06 +0000 Subject: [PATCH] *fix* make timer non-blocking to fix freezing when a timer is resetted in a callback function --- src/tint.c | 29 +++++++++++++---------------- src/util/timer.c | 6 ++++++ 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/tint.c b/src/tint.c index 3be5311..ca8f4ff 100644 --- a/src/tint.c +++ b/src/tint.c @@ -709,6 +709,19 @@ int main (int argc, char *argv[]) // Wait for X Event or a Timer if (pselect(max_fd+1, &fdset, 0, 0, 0, &empty_mask) > 0) { + // we need to iterate over the whole timer list, since fd_set can only be checked with the + // brute force method FD_ISSET for every possible timer + timer_iter = timer_list; + while (timer_iter) { + timer = timer_iter->data; + if (FD_ISSET(timer->id, &fdset)) { + uint64_t dummy; + if ( -1 != read(timer->id, &dummy, sizeof(uint64_t)) ) + timer->_callback(); + } + timer_iter = timer_iter->next; + } + while (XPending (server.dsp)) { XNextEvent(server.dsp, &e); @@ -786,22 +799,6 @@ int main (int argc, char *argv[]) break; } } - - // we need to iterate over the whole timer list, since fd_set can only be checked with the - // brute force method FD_ISSET for every possible timer - timer_iter = timer_list; - while (timer_iter) { - timer = timer_iter->data; - if (FD_ISSET(timer->id, &fdset)) { - uint64_t dummy; -//printf("reading from timer->id=%d\n", timer->id); - read(timer->id, &dummy, sizeof(uint64_t)); -//printf("Callback timer->_callback\n"); - timer->_callback(); -//printf("Timer callback finished\n"); - } - timer_iter = timer_iter->next; - } } switch (signal_pending) { diff --git a/src/util/timer.c b/src/util/timer.c index e218877..48529dc 100644 --- a/src/util/timer.c +++ b/src/util/timer.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "timer.h" @@ -38,6 +39,11 @@ int install_timer(int value_sec, int value_nsec, int interval_sec, int interval_ t->id=timer_fd; t->_callback = _callback; timer_list = g_slist_prepend(timer_list, t); + + int flags = fcntl( timer_fd, F_GETFL, 0 ); + if( flags != -1 ) + fcntl( timer_fd, F_SETFL, flags | O_NONBLOCK ); + return timer_fd; } -- 2.44.0