--- gvpe/src/iom.C 2003/03/21 21:17:02 1.2 +++ gvpe/src/iom.C 2003/03/21 23:17:01 1.4 @@ -1,4 +1,3 @@ -#include /* iom.C -- I/O multiplexor @@ -25,7 +24,6 @@ #include #include "slog.h" - #include "iom.h" inline bool lowest_first (const time_watcher *a, const time_watcher *b) @@ -44,6 +42,19 @@ iom.reg (this); } +void time_watcher::trigger () +{ + iom.unreg (this); + call (at); + iom.reg (this); +} + +void time_watcher::start () +{ + iom.unreg (this); + iom.reg (this); +} + void io_manager::reg (int fd, short events, io_watcher *w) { pollfd pfd; @@ -93,16 +104,11 @@ if (i != sz) { - if (sz == 1) - tw.clear (); - else - { - if (i != sz - 1) - tw[i] = tw[sz - 1]; + if (i != sz - 1) + tw[i] = tw[sz - 1]; - tw.pop_back (); - make_heap (tw.begin (), tw.end (), lowest_first); - } + tw.pop_back (); + make_heap (tw.begin (), tw.end (), lowest_first); } } @@ -119,40 +125,47 @@ { set_now (); - while (!(iow.empty () && tw.empty ())) + for (;;) { - int timeout = tw.empty () - ? 3600 * 1000 // wake up at least every hour - : (int) ((tw[0]->at - NOW) * 1000); + while (tw[0]->at <= NOW) + { + pop_heap (tw.begin (), tw.end (), lowest_first); + time_watcher *w = *(tw.end () - 1); - printf ("s%d t%d #%d\n", pfs.size (), timeout, tw.size ()); + if (w->at >= 0) + { + w->call (w->at); + push_heap (tw.begin (), tw.end (), lowest_first); + } + else + tw.pop_back (); + } - if (timeout >= 0) - { - int fds = poll (&pfs[0], pfs.size (), timeout); + int timeout = (int) ((tw[0]->at - NOW) * 1000); - set_now (); + int fds = poll (&pfs[0], pfs.size (), timeout); - for (unsigned int i = iow.size (); fds && i--; ) - if (pfs[i].revents) - { - --fds; - iow[i]->call (pfs[i].revents); - } - } + set_now (); - while (!tw.empty () && tw[0]->at <= NOW) - { - pop_heap (tw.begin (), tw.end (), lowest_first); - (*(tw.end () - 1))->trigger (); - push_heap (tw.begin (), tw.end (), lowest_first); - } + for (unsigned int i = iow.size (); fds > 0 && i--; ) + if (pfs[i].revents) + { + --fds; + iow[i]->call (pfs[i].revents); + } } } +void io_manager::idle_cb (tstamp &ts) +{ + ts = NOW + 86400; // wake up every day, for no good reason +} + io_manager::io_manager () { set_now (); + idle = new time_watcher (this, &io_manager::idle_cb); + idle->start (0); } io_manager::~io_manager ()