ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/iom.C
(Generate patch)

Comparing gvpe/src/iom.C (file contents):
Revision 1.6 by pcg, Fri Mar 28 04:05:10 2003 UTC vs.
Revision 1.9 by pcg, Wed Apr 2 21:02:25 2003 UTC

24#include <functional> 24#include <functional>
25 25
26#include "slog.h" 26#include "slog.h"
27#include "iom.h" 27#include "iom.h"
28 28
29inline bool lowest_first (const time_watcher *a, const time_watcher *b) 29inline bool earliest_first (const time_watcher *a, const time_watcher *b)
30{ 30{
31 return a->at > b->at; 31 return a->at > b->at;
32} 32}
33 33
34tstamp NOW; 34tstamp NOW;
45 iom.reg (this); 45 iom.reg (this);
46} 46}
47 47
48void time_watcher::trigger () 48void time_watcher::trigger ()
49{ 49{
50 call (at); 50 call (*this);
51 51
52 if (registered) 52 if (registered)
53 iom.reschedule_time_watchers (); 53 iom.reschedule_time_watchers ();
54 else 54 else
55 iom.reg (this); 55 iom.reg (this);
59{ 59{
60 if (!registered) 60 if (!registered)
61 iom.reg (this); 61 iom.reg (this);
62} 62}
63 63
64void io_manager::reg (int fd, short events, io_watcher *w) 64void io_manager::reg (io_watcher *w)
65{ 65{
66 pollfd pfd; 66 pollfd pfd;
67 67
68 pfd.fd = fd; 68 pfd.fd = w->fd;
69 pfd.events = events; 69 pfd.events = w->events;
70 70
71 pfs.push_back (pfd); 71 pfs.push_back (pfd);
72 iow.push_back (w); 72 iow.push_back (w);
73} 73}
74 74
75void io_manager::unreg (const io_watcher *w) 75void io_manager::unreg (io_watcher *w)
76{ 76{
77 unsigned int sz = iow.size (); 77 unsigned int sz = iow.size ();
78 unsigned int i = find (iow.begin (), iow.end (), w) - iow.begin (); 78 unsigned int i = find (iow.begin (), iow.end (), w) - iow.begin ();
79 79
80 if (i != sz) 80 if (i != sz)
97 } 97 }
98} 98}
99 99
100void io_manager::reschedule_time_watchers () 100void io_manager::reschedule_time_watchers ()
101{ 101{
102 make_heap (tw.begin (), tw.end (), lowest_first); 102 make_heap (tw.begin (), tw.end (), earliest_first);
103} 103}
104 104
105void io_manager::reg (time_watcher *w) 105void io_manager::reg (time_watcher *w)
106{ 106{
107 if (w->registered) 107 if (w->registered)
108 slog (L_CRIT, "FATAL: io_manager::reg(time_watcher) called on already-registered watcher"); 108 slog (L_CRIT, "FATAL: io_manager::reg(time_watcher) called on already-registered watcher");
109 109
110 w->registered = true;
111
110 tw.push_back (w); 112 tw.push_back (w);
111 push_heap (tw.begin (), tw.end (), lowest_first); 113 push_heap (tw.begin (), tw.end (), earliest_first);
112} 114}
113 115
114void io_manager::unreg (const time_watcher *w) 116void io_manager::unreg (time_watcher *w)
115{ 117{
116 unsigned int sz = tw.size (); 118 if (w->registered)
117 unsigned int i = find (tw.begin (), tw.end (), w) - tw.begin ();
118
119 if (i != sz)
120 { 119 {
120 unsigned int sz = tw.size ();
121 unsigned int i = find (tw.begin (), tw.end (), w) - tw.begin ();
122
123 if (i != sz)
124 {
121 if (i != sz - 1) 125 if (i != sz - 1)
122 tw[i] = tw[sz - 1]; 126 tw[i] = tw[sz - 1];
123 127
124 tw.pop_back (); 128 tw.pop_back ();
125 reschedule_time_watchers (); 129 reschedule_time_watchers ();
130 }
131
132 w->registered = false;
126 } 133 }
127} 134}
128 135
129inline void set_now (void) 136inline void set_now (void)
130{ 137{
141 148
142 for (;;) 149 for (;;)
143 { 150 {
144 while (tw[0]->at <= NOW) 151 while (tw[0]->at <= NOW)
145 { 152 {
153 // remove the first watcher
154 time_watcher *w = tw[0];
155
146 pop_heap (tw.begin (), tw.end (), lowest_first); 156 pop_heap (tw.begin (), tw.end (), earliest_first);
147 time_watcher *w = *(tw.end () - 1);
148 tw.pop_back (); 157 tw.pop_back ();
149 158
150 if (w->at >= 0) 159 w->registered = false;
151 { 160
161 // call it
152 w->call (w->at); 162 w->call (*w);
153 163
164 // re-add it if necessary
154 if (!w->registered) 165 if (w->at >= 0 && !w->registered)
155 reg (w); 166 reg (w);
156 }
157 } 167 }
158 168
159 int timeout = (int) ((tw[0]->at - NOW) * 1000); 169 int timeout = (int) ((tw[0]->at - NOW) * 1000);
160 170
161 int fds = poll (&pfs[0], pfs.size (), timeout); 171 int fds = poll (&pfs[0], pfs.size (), timeout);
162 172
163 set_now (); 173 set_now ();
164 174
165 for (unsigned int i = iow.size (); fds > 0 && i--; ) 175 vector<io_watcher *>::iterator w;
176 vector<pollfd>::iterator p;
177
178 for (w = iow.begin (), p = pfs.begin ();
179 fds > 0 && w < iow.end ();
180 ++w, ++p)
166 if (pfs[i].revents) 181 if (p->revents)
167 { 182 {
168 --fds; 183 --fds;
169 iow[i]->call (pfs[i].revents); 184 (*w)->call (**w, p->revents);
170 } 185 }
171 } 186 }
172} 187}
173 188
174void io_manager::idle_cb (tstamp &ts) 189void io_manager::idle_cb (time_watcher &w)
175{ 190{
176 ts = NOW + 86400; // wake up every day, for no good reason 191 w.at = NOW + 86400; // wake up every day, for no good reason
177} 192}
178 193
179io_manager::io_manager () 194io_manager::io_manager ()
180{ 195{
181 set_now (); 196 set_now ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines