… | |
… | |
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 | |
… | |
… | |
124 | set_now (); |
142 | set_now (); |
125 | #endif |
143 | #endif |
126 | |
144 | |
127 | for (;;) |
145 | for (;;) |
128 | { |
146 | { |
|
|
147 | struct timeval *to = 0; |
|
|
148 | struct timeval tval; |
|
|
149 | |
|
|
150 | #if IOM_IDLE |
|
|
151 | if (iw.size ()) |
|
|
152 | { |
|
|
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; |
|
|
162 | |
|
|
163 | for (;tw.size ();) |
|
|
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 | { |
|
|
173 | double diff = w->at - NOW; |
|
|
174 | tval.tv_sec = (int)diff; |
|
|
175 | tval.tv_usec = (int)((diff - tval.tv_sec) * 1000000); |
|
|
176 | to = &tval; |
|
|
177 | break; |
|
|
178 | } |
|
|
179 | else if (w->at >= 0) |
|
|
180 | w->call (*w); |
|
|
181 | else |
|
|
182 | unreg (w); |
|
|
183 | } |
|
|
184 | #endif |
|
|
185 | } |
|
|
186 | |
129 | #if IOM_CHECK |
187 | #if IOM_CHECK |
130 | for (int i = 0; i < cw.size (); ++i) |
188 | for (int i = 0; i < cw.size (); ++i) |
131 | cw[i]->call (*cw[i]); |
189 | cw[i]->call (*cw[i]); |
132 | #endif |
|
|
133 | |
|
|
134 | struct timeval *to = 0; |
|
|
135 | |
|
|
136 | #if IOM_TIME |
|
|
137 | struct timeval tval; |
|
|
138 | time_watcher *w; |
|
|
139 | |
|
|
140 | for (;tw.size ();) |
|
|
141 | { |
|
|
142 | w = tw[0]; |
|
|
143 | |
|
|
144 | for (time_watcher **i = tw.begin (); i < tw.end (); ++i) |
|
|
145 | if ((*i)->at < w->at) |
|
|
146 | w = *i; |
|
|
147 | |
|
|
148 | if (w->at > NOW) |
|
|
149 | { |
|
|
150 | double diff = w->at - NOW; |
|
|
151 | tval.tv_sec = (int)diff; |
|
|
152 | tval.tv_usec = (int)((diff - tval.tv_sec) * 1000000); |
|
|
153 | to = &tval; |
|
|
154 | break; |
|
|
155 | } |
|
|
156 | else if (w->at >= 0) |
|
|
157 | w->call (*w); |
|
|
158 | else |
|
|
159 | unreg (w); |
|
|
160 | } |
|
|
161 | #endif |
190 | #endif |
162 | |
191 | |
163 | #if IOM_IO |
192 | #if IOM_IO |
164 | fd_set rfd, wfd; |
193 | fd_set rfd, wfd; |
165 | |
194 | |
… | |
… | |
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); |