]>
Dogcows Code - chaz/openbox/blob - otk/timer.cc
0a0083146afee234012a7e30796f33d4bd60b393
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
9 #ifdef HAVE_SYS_SELECT_H
10 # include <sys/select.h>
11 #endif // HAVE_SYS_SELECT_H
13 #ifdef HAVE_SYS_TIME_H
14 # include <sys/time.h>
20 timeval
Timer::_nearest_timeout
, Timer::_now
;
21 Timer::TimerQ
Timer::_q
;
23 void Timer::timevalAdd(timeval
&a
, long msec
)
25 a
.tv_sec
+= msec
/ 1000;
26 a
.tv_usec
+= (msec
% 1000) * 1000;
27 a
.tv_sec
+= a
.tv_usec
/ 1000000;
31 bool Timer::nearestTimeout(struct timeval
&tm
)
35 tm
.tv_sec
= _nearest_timeout
.tv_sec
- _now
.tv_sec
;
36 tm
.tv_usec
= _nearest_timeout
.tv_usec
- _now
.tv_usec
;
38 while (tm
.tv_usec
< 0) {
39 tm
.tv_usec
+= 1000000;
42 tm
.tv_sec
+= tm
.tv_usec
/ 1000000;
43 tm
.tv_usec
%= 1000000;
50 void Timer::dispatchTimers(bool wait
)
57 gettimeofday(&_now
, NULL
);
58 _nearest_timeout
= _now
;
59 _nearest_timeout
.tv_sec
+= 10000;
63 /* since we overload the destructor to keep from removing from the middle
64 of the priority queue, set _del_me, we have to do our real delete in
73 // the queue is sorted, so if this timer shouldn't fire, none are ready
74 _nearest_timeout
= curr
->_timeout
;
75 if (!timercmp(&_now
, &_nearest_timeout
, >))
78 /* we set the last fired time to delay msec after the previous firing, then
79 re-insert. timers maintain their order and may trigger more than once
80 if they've waited more than one delay's worth of time.
83 timevalAdd(curr
->_last
, curr
->_delay
);
84 curr
->_action(curr
->_data
);
85 timevalAdd(curr
->_timeout
, curr
->_delay
);
88 /* if at least one timer fires, then don't wait on X events, as there may
89 already be some in the queue from the timer callbacks.
95 // wait for the nearest trigger, or for X to do something interesting
96 fd
= ConnectionNumber(**display
);
99 if (nearestTimeout(next
)) {
100 select(fd
+ 1, &selset
, NULL
, NULL
, &next
);
102 select(fd
+ 1, &selset
, NULL
, NULL
, NULL
);
106 Timer::Timer(long delay
, Timer::TimeoutHandler action
, void *data
)
114 timevalAdd(_timeout
, delay
);
118 void Timer::operator delete(void *self
)
125 void Timer::realDelete(Timer
*me
)
130 void Timer::initialize(void)
132 gettimeofday(&_now
, NULL
);
133 _nearest_timeout
.tv_sec
= 100000;
134 _nearest_timeout
.tv_usec
= 0;
137 void Timer::destroy(void)
140 realDelete(_q
.top());
This page took 0.042464 seconds and 4 git commands to generate.