--- gvpe/src/iom.h 2003/03/28 04:05:10 1.6 +++ gvpe/src/iom.h 2003/04/04 05:26:45 1.11 @@ -21,33 +21,35 @@ #include +#include + #include +#include "callback.h" #include "slog.h" typedef double tstamp; extern tstamp NOW; -template class callback; struct io_watcher; struct time_watcher; class io_manager { vector pfs; - vector iow; + vector iow; vector tw; // actually a heap - void idle_cb (tstamp &ts); time_watcher *idle; + void idle_cb (time_watcher &w); time_watcher *idle; public: void reschedule_time_watchers (); // register a watcher - void reg (int fd, short events, io_watcher *w); - void unreg (const io_watcher *w); + void reg (io_watcher *w); + void unreg (io_watcher *w); void reg (time_watcher *w); - void unreg (const time_watcher *w); + void unreg (time_watcher *w); void loop (); @@ -55,68 +57,40 @@ ~io_manager (); }; -extern io_manager iom; - -template -class callback { - struct object { }; - - void *obj; - R (object::*meth)(A arg); - - // a proxy is a kind of recipe on how to call a specific class method - struct proxy_base { - virtual R call (void *obj, R (object::*meth)(A), A arg) = 0; - }; - template - struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth)(A), A arg) - { - ((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (arg); - } - }; +extern io_manager iom; // a singleton, together with it's construction/destruction problems. - proxy_base *prxy; +struct io_watcher : callback2 { + pollfd *p; -public: template - callback (O1 *object, R (O2::*method)(A)) - { - static proxy p; - obj = reinterpret_cast(object); - meth = reinterpret_cast(method); - prxy = &p; - } + io_watcher (O1 *object, void (O2::*method)(io_watcher &, short)) + : callback2(object,method) + { } - R call(A arg) const - { - return prxy->call (obj, meth, arg); - } + ~io_watcher (); - R operator ()(A arg) const + void set(int fd, short events) { - return call (arg); + assert (p); + p->fd = fd; + p->events = events; } -}; -struct io_watcher : callback { - template - io_watcher (O1 *object, void (O2::*method)(short revents)) - : callback(object,method) - { } - - ~io_watcher () + void set(short events) { - iom.unreg (this); + assert (p); + p->events = events; } void start (int fd, short events) { - iom.reg (fd, events, this); + iom.reg (this); // make sure pfd is set + + p->fd = fd; + p->events = events; } - void stop () const + void stop () { iom.unreg (this); } @@ -124,20 +98,17 @@ #define TSTAMP_CANCEL -1. -struct time_watcher : callback { +struct time_watcher : callback1 { bool registered; // already registered? tstamp at; template - time_watcher (O1 *object, void (O2::*method)(tstamp &)) - : callback(object,method) + time_watcher (O1 *object, void (O2::*method)(time_watcher &)) + : callback1(object,method) , registered(false) { } - ~time_watcher () - { - iom.unreg (this); - } + ~time_watcher (); void set (tstamp when); void trigger (); @@ -153,7 +124,7 @@ set (when); } - void stop () const + void stop () { iom.unreg (this); } @@ -161,6 +132,7 @@ void reset (tstamp when = TSTAMP_CANCEL) { stop (); + at = when; } };