*fix* make timer non-blocking to fix freezing when a timer is resetted in a callback function
git-svn-id: http://tint2.googlecode.com/svn/trunk@282 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
29
src/tint.c
29
src/tint.c
@@ -709,6 +709,19 @@ int main (int argc, char *argv[])
|
|||||||
|
|
||||||
// Wait for X Event or a Timer
|
// Wait for X Event or a Timer
|
||||||
if (pselect(max_fd+1, &fdset, 0, 0, 0, &empty_mask) > 0) {
|
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)) {
|
while (XPending (server.dsp)) {
|
||||||
XNextEvent(server.dsp, &e);
|
XNextEvent(server.dsp, &e);
|
||||||
|
|
||||||
@@ -786,22 +799,6 @@ int main (int argc, char *argv[])
|
|||||||
break;
|
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) {
|
switch (signal_pending) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <sys/timerfd.h>
|
#include <sys/timerfd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "timer.h"
|
#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->id=timer_fd;
|
||||||
t->_callback = _callback;
|
t->_callback = _callback;
|
||||||
timer_list = g_slist_prepend(timer_list, t);
|
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;
|
return timer_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user