--- gvpe/src/iom.C 2003/04/04 05:26:45 1.10 +++ gvpe/src/iom.C 2003/04/05 02:32:40 1.11 @@ -23,6 +23,8 @@ #include #include +#include "gettext.h" + #include "slog.h" #include "iom.h" @@ -41,8 +43,6 @@ if (registered) iom.reschedule_time_watchers (); - else - iom.reg (this); } void time_watcher::trigger () @@ -55,18 +55,24 @@ iom.reg (this); } -void time_watcher::start () -{ - if (!registered) - iom.reg (this); -} - time_watcher::~time_watcher () { if (iom_valid) iom.unreg (this); } +void io_watcher::set(int fd_, short events_) +{ + fd = fd_; + events = events_; + + if (registered) + { + iom.unreg (this); + iom.reg (this); + } +} + io_watcher::~io_watcher () { if (iom_valid) @@ -75,18 +81,26 @@ void io_manager::reg (io_watcher *w) { - pollfd pfd; + if (!w->registered) + { + w->registered = true; + + pollfd pfd; - pfs.push_back (pfd); - iow.push_back (w); + pfd.fd = w->fd; + pfd.events = w->events; - w->p = &(*(pfs.end () - 1)); + pfs.push_back (pfd); + iow.push_back (w); + } } void io_manager::unreg (io_watcher *w) { - if (w->p) + if (w->registered) { + w->registered = false; + unsigned int sz = iow.size (); unsigned int i = find (iow.begin (), iow.end (), w) - iow.begin (); @@ -107,8 +121,6 @@ iow[i] = iow[sz - 1]; iow.pop_back (); pfs[i] = pfs[sz - 1]; pfs.pop_back (); } - - w->p = 0; } } @@ -119,16 +131,21 @@ void io_manager::reg (time_watcher *w) { - w->registered = true; + if (!w->registered) + { + w->registered = true; - tw.push_back (w); - push_heap (tw.begin (), tw.end (), earliest_first); + tw.push_back (w); + push_heap (tw.begin (), tw.end (), earliest_first); + } } void io_manager::unreg (time_watcher *w) { if (w->registered) { + w->registered = false; + unsigned int sz = tw.size (); unsigned int i = find (tw.begin (), tw.end (), w) - tw.begin (); @@ -139,8 +156,6 @@ tw.pop_back (); reschedule_time_watchers (); - - w->registered = false; } } @@ -192,7 +207,14 @@ if (p->revents) { --fds; - (*w)->call (**w, p->revents); + + if (p->revents & POLLNVAL) + { + slog (L_ERR, _("io_watcher started on illegal file descriptor, disabling.")); + (*w)->stop (); + } + else + (*w)->call (**w, p->revents); } } }