// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
-#ifdef HAVE_CONFIG_H
-# include "../config.h"
-#endif // HAVE_CONFIG_H
+#include "config.h"
#include "timer.hh"
#include "display.hh"
+extern "C" {
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
-#else
-# ifdef HAVE_UNISTD_H
-# include <sys/types.h>
-# include <unistd.h>
-# endif // HAVE_UNISTD_H
#endif // HAVE_SYS_SELECT_H
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+}
+
namespace otk {
timeval Timer::_nearest_timeout, Timer::_now;
while (!_q.empty()) {
curr = _q.top();
- /* since we overload the destructor to keep from removing from the middle of
- the priority queue, set _del_me, we have to do our real delete in here.
+ /* since we overload the destructor to keep from removing from the middle
+ of the priority queue, set _del_me, we have to do our real delete in
+ here.
*/
if (curr->_del_me) {
_q.pop();
if (!timercmp(&_now, &_nearest_timeout, >))
break;
- /* we set the last fired time to delay msec after the previous firing, then
- re-insert. timers maintain their order and may trigger more than once if
- they've waited more than one delay's worth of time.
+ /* we set the last fired time to delay msec after the previous firing, then
+ re-insert. timers maintain their order and may trigger more than once
+ if they've waited more than one delay's worth of time.
*/
_q.pop();
timevalAdd(curr->_last, curr->_delay);
curr->_action(curr->_data);
timevalAdd(curr->_timeout, curr->_delay);
_q.push(curr);
+
+ /* if at least one timer fires, then don't wait on X events, as there may
+ already be some in the queue from the timer callbacks.
+ */
+ wait = false;
}
if (wait) {
fd = ConnectionNumber(**display);
FD_ZERO(&selset);
FD_SET(fd, &selset);
- if (nearestTimeout(next))
+ if (nearestTimeout(next)) {
select(fd + 1, &selset, NULL, NULL, &next);
- else
+ } else
select(fd + 1, &selset, NULL, NULL, NULL);
}
}