… | |
… | |
94 | } tw0; |
94 | } tw0; |
95 | |
95 | |
96 | tstamp NOW; |
96 | tstamp NOW; |
97 | |
97 | |
98 | #if IOM_TIME |
98 | #if IOM_TIME |
99 | inline void set_now (void) |
99 | tstamp io_manager::now () |
100 | { |
100 | { |
101 | struct timeval tv; |
101 | struct timeval tv; |
102 | |
102 | |
103 | gettimeofday (&tv, 0); |
103 | gettimeofday (&tv, 0); |
104 | NOW = (tstamp)tv.tv_sec + (tstamp)tv.tv_usec / 1000000.; |
104 | return (tstamp)tv.tv_sec + (tstamp)tv.tv_usec / 1000000.; |
|
|
105 | } |
|
|
106 | |
|
|
107 | void io_manager::set_now () |
|
|
108 | { |
|
|
109 | NOW = now (); |
105 | } |
110 | } |
106 | #endif |
111 | #endif |
107 | |
112 | |
108 | static bool iom_valid; |
113 | static bool iom_valid; |
109 | |
114 | |
… | |
… | |
118 | { |
123 | { |
119 | perror ("io_manager: unable to create signal pipe, aborting."); |
124 | perror ("io_manager: unable to create signal pipe, aborting."); |
120 | abort (); |
125 | abort (); |
121 | } |
126 | } |
122 | |
127 | |
123 | fcntl (sigpipe[0], F_SETFL, O_NONBLOCK); |
128 | fcntl (sigpipe[0], F_SETFL, O_NONBLOCK); fcntl (sigpipe[0], F_SETFD, FD_CLOEXEC); |
124 | fcntl (sigpipe[1], F_SETFL, O_NONBLOCK); |
129 | fcntl (sigpipe[1], F_SETFL, O_NONBLOCK); fcntl (sigpipe[1], F_SETFD, FD_CLOEXEC); |
125 | #endif |
130 | #endif |
126 | |
131 | |
127 | iom_valid = true; |
132 | iom_valid = true; |
128 | |
133 | |
129 | #if IOM_TIME |
134 | #if IOM_TIME |
130 | set_now (); |
135 | io_manager::set_now (); |
131 | |
136 | |
132 | tw0.start (TSTAMP_MAX); |
137 | tw0.start (TSTAMP_MAX); |
133 | #endif |
138 | #endif |
134 | } |
139 | } |
135 | |
140 | |
… | |
… | |
283 | activity = false; |
288 | activity = false; |
284 | |
289 | |
285 | for (int i = tw.size (); i--; ) |
290 | for (int i = tw.size (); i--; ) |
286 | if (!tw[i]) |
291 | if (!tw[i]) |
287 | tw.erase_unordered (i); |
292 | tw.erase_unordered (i); |
288 | else if (tw[i]->at <= NOW + IOM_ACCURACY) |
293 | else if (tw[i]->at <= NOW) |
289 | { |
294 | { |
290 | time_watcher &w = *tw[i]; |
295 | time_watcher &w = *tw[i]; |
291 | |
296 | |
292 | unreg (w); |
297 | unreg (w); |
293 | w.call (w); |
298 | w.call (w); |
… | |
… | |
388 | char ch; |
393 | char ch; |
389 | |
394 | |
390 | while (read (sigpipe[0], &ch, 1) > 0) |
395 | while (read (sigpipe[0], &ch, 1) > 0) |
391 | ; |
396 | ; |
392 | |
397 | |
393 | for (sig_vec **svp = sw.end (); svp-- > sw.begin (); ) |
398 | for (vector<sig_vec *>::iterator svp = sw.end (); svp-- > sw.begin (); ) |
394 | if (*svp && (*svp)->pending) |
399 | if (*svp && (*svp)->pending) |
395 | { |
400 | { |
396 | sig_vec &sv = **svp; |
401 | sig_vec &sv = **svp; |
397 | for (int i = sv.size (); i--; ) |
402 | for (int i = sv.size (); i--; ) |
398 | if (!sv[i]) |
403 | if (!sv[i]) |
… | |
… | |
409 | for (int i = iow.size (); i--; ) |
414 | for (int i = iow.size (); i--; ) |
410 | if (!iow[i]) |
415 | if (!iow[i]) |
411 | iow.erase_unordered (i); |
416 | iow.erase_unordered (i); |
412 | else |
417 | else |
413 | { |
418 | { |
|
|
419 | io_watcher &w = *iow[i]; |
414 | short revents = iow[i]->events; |
420 | short revents = w.events; |
415 | |
421 | |
416 | if (!FD_ISSET (iow[i]->fd, &rfd)) revents &= ~EVENT_READ; |
422 | if (!FD_ISSET (w.fd, &rfd)) revents &= ~EVENT_READ; |
417 | if (!FD_ISSET (iow[i]->fd, &wfd)) revents &= ~EVENT_WRITE; |
423 | if (!FD_ISSET (w.fd, &wfd)) revents &= ~EVENT_WRITE; |
418 | |
424 | |
419 | if (revents) |
425 | if (revents) |
420 | iow[i]->call (*iow[i], revents); |
426 | w.call (w, revents); |
421 | } |
427 | } |
422 | #endif |
428 | #endif |
423 | } |
429 | } |
424 | else if (fds < 0 && errno != EINTR) |
430 | else if (fds < 0 && errno != EINTR) |
425 | { |
431 | { |