]>
Dogcows Code - chaz/openbox/blob - otk/timer.cc
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
4 # include "../config.h"
5 #endif // HAVE_CONFIG_H
11 #ifdef HAVE_SYS_SELECT_H
12 # include <sys/select.h>
15 # include <sys/types.h>
17 # endif // HAVE_UNISTD_H
18 #endif // HAVE_SYS_SELECT_H
23 timeval
Timer::_nearest_timeout
, Timer::_now
;
24 Timer::TimerQ
Timer::_q
;
26 void Timer::timevalAdd(timeval
&a
, long msec
)
28 a
.tv_sec
+= msec
/ 1000;
29 a
.tv_usec
+= (msec
% 1000) * 1000;
30 a
.tv_sec
+= a
.tv_usec
/ 1000000;
34 bool Timer::nearestTimeout(struct timeval
&tm
)
38 tm
.tv_sec
= _nearest_timeout
.tv_sec
- _now
.tv_sec
;
39 tm
.tv_usec
= _nearest_timeout
.tv_usec
- _now
.tv_usec
;
41 while (tm
.tv_usec
< 0) {
42 tm
.tv_usec
+= 1000000;
45 tm
.tv_sec
+= tm
.tv_usec
/ 1000000;
46 tm
.tv_usec
%= 1000000;
53 void Timer::dispatchTimers(bool wait
)
60 gettimeofday(&_now
, NULL
);
61 _nearest_timeout
= _now
;
62 _nearest_timeout
.tv_sec
+= 10000;
66 /* since we overload the destructor to keep from removing from the middle of
67 the priority queue, set _del_me, we have to do our real delete in here.
75 // the queue is sorted, so if this timer shouldn't fire, none are ready
76 _nearest_timeout
= curr
->_timeout
;
77 if (!timercmp(&_now
, &_nearest_timeout
, >))
80 /* we set the last fired time to delay msec after the previous firing, then
81 re-insert. timers maintain their order and may trigger more than once if
82 they've waited more than one delay's worth of time.
85 timevalAdd(curr
->_last
, curr
->_delay
);
86 curr
->_action(curr
->_data
);
87 timevalAdd(curr
->_timeout
, curr
->_delay
);
92 // wait for the nearest trigger, or for X to do something interesting
93 fd
= ConnectionNumber(**display
);
96 if (nearestTimeout(next
))
97 select(fd
+ 1, &selset
, NULL
, NULL
, &next
);
99 select(fd
+ 1, &selset
, NULL
, NULL
, NULL
);
103 Timer::Timer(long delay
, Timer::TimeoutHandler action
, void *data
)
111 timevalAdd(_timeout
, delay
);
115 void Timer::operator delete(void *self
)
122 void Timer::realDelete(Timer
*me
)
127 void Timer::initialize(void)
129 gettimeofday(&_now
, NULL
);
130 _nearest_timeout
.tv_sec
= 100000;
131 _nearest_timeout
.tv_usec
= 0;
134 void Timer::destroy(void)
137 realDelete(_q
.top());
This page took 0.043502 seconds and 4 git commands to generate.