… | |
… | |
105 | { |
105 | { |
106 | unreg (w, cw); |
106 | unreg (w, cw); |
107 | } |
107 | } |
108 | #endif |
108 | #endif |
109 | |
109 | |
|
|
110 | #if IOM_IDLE |
|
|
111 | idle_watcher::~idle_watcher () |
|
|
112 | { |
|
|
113 | if (iom_valid) |
|
|
114 | iom.unreg (this); |
|
|
115 | } |
|
|
116 | |
|
|
117 | void io_manager::reg (idle_watcher *w) |
|
|
118 | { |
|
|
119 | reg (w, iw); |
|
|
120 | } |
|
|
121 | |
|
|
122 | void io_manager::unreg (idle_watcher *w) |
|
|
123 | { |
|
|
124 | unreg (w, iw); |
|
|
125 | } |
|
|
126 | #endif |
|
|
127 | |
110 | #if IOM_TIME |
128 | #if IOM_TIME |
111 | inline void set_now (void) |
129 | inline void set_now (void) |
112 | { |
130 | { |
113 | struct timeval tv; |
131 | struct timeval tv; |
114 | |
132 | |
… | |
… | |
125 | #endif |
143 | #endif |
126 | |
144 | |
127 | for (;;) |
145 | for (;;) |
128 | { |
146 | { |
129 | struct timeval *to = 0; |
147 | struct timeval *to = 0; |
130 | |
|
|
131 | #if IOM_TIME |
|
|
132 | struct timeval tval; |
148 | struct timeval tval; |
133 | time_watcher *w; |
|
|
134 | |
149 | |
|
|
150 | #if IOM_IDLE |
135 | for (;tw.size ();) |
151 | if (iw.size ()) |
136 | { |
152 | { |
137 | w = tw[0]; |
153 | tval.tv_sec = 0; |
|
|
154 | tval.tv_usec = 0; |
|
|
155 | to = &tval; |
|
|
156 | } |
|
|
157 | else |
|
|
158 | #endif |
|
|
159 | { |
|
|
160 | #if IOM_TIME |
|
|
161 | time_watcher *w; |
138 | |
162 | |
139 | for (time_watcher **i = tw.begin (); i < tw.end (); ++i) |
163 | for (;tw.size ();) |
140 | if ((*i)->at < w->at) |
|
|
141 | w = *i; |
|
|
142 | |
|
|
143 | if (w->at > NOW) |
|
|
144 | { |
164 | { |
|
|
165 | w = tw[0]; |
|
|
166 | |
|
|
167 | for (time_watcher **i = tw.begin (); i < tw.end (); ++i) |
|
|
168 | if ((*i)->at < w->at) |
|
|
169 | w = *i; |
|
|
170 | |
|
|
171 | if (w->at > NOW) |
|
|
172 | { |
145 | double diff = w->at - NOW; |
173 | double diff = w->at - NOW; |
146 | tval.tv_sec = (int)diff; |
174 | tval.tv_sec = (int)diff; |
147 | tval.tv_usec = (int)((diff - tval.tv_sec) * 1000000); |
175 | tval.tv_usec = (int)((diff - tval.tv_sec) * 1000000); |
148 | to = &tval; |
176 | to = &tval; |
149 | break; |
177 | break; |
|
|
178 | } |
|
|
179 | else if (w->at >= 0) |
|
|
180 | w->call (*w); |
|
|
181 | else |
|
|
182 | unreg (w); |
150 | } |
183 | } |
151 | else if (w->at >= 0) |
184 | #endif |
152 | w->call (*w); |
|
|
153 | else |
|
|
154 | unreg (w); |
|
|
155 | } |
185 | } |
156 | #endif |
|
|
157 | |
186 | |
158 | #if IOM_CHECK |
187 | #if IOM_CHECK |
159 | for (int i = 0; i < cw.size (); ++i) |
188 | for (int i = 0; i < cw.size (); ++i) |
160 | cw[i]->call (*cw[i]); |
189 | cw[i]->call (*cw[i]); |
161 | #endif |
190 | #endif |
… | |
… | |
195 | if (!FD_ISSET (w->fd, &wfd)) revents &= ~EVENT_WRITE; |
224 | if (!FD_ISSET (w->fd, &wfd)) revents &= ~EVENT_WRITE; |
196 | |
225 | |
197 | if (revents) |
226 | if (revents) |
198 | w->call (*w, revents); |
227 | w->call (*w, revents); |
199 | } |
228 | } |
|
|
229 | #if IOM_IDLE |
|
|
230 | else if (iw.size ()) |
|
|
231 | for (int i = 0; i < iw.size (); ++i) |
|
|
232 | iw[i]->call (*iw[i]); |
|
|
233 | #endif |
|
|
234 | |
200 | #elif IOM_TIME |
235 | #elif IOM_TIME |
201 | if (!to) |
236 | if (!to) |
202 | break; |
237 | break; |
203 | |
238 | |
204 | select (0, 0, 0, 0, &to); |
239 | select (0, 0, 0, 0, &to); |