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.7 by pcg, Fri Mar 28 05:40:54 2003 UTC

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)
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 (), lowest_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 (), lowest_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->at);
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);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines