--- gvpe/src/iom.h 2003/04/02 03:06:22 1.8 +++ gvpe/src/iom.h 2003/10/16 02:41:21 1.14 @@ -1,5 +1,6 @@ /* - iom.h -- I/O multiplexor + iom.h -- generic I/O multiplexor + Copyright (C) 2003 Marc Lehmann This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,7 +22,9 @@ #include -#include +#include + +#include "poll.h" #include "callback.h" #include "slog.h" @@ -35,16 +38,16 @@ 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 reg (io_watcher *w); void unreg (io_watcher *w); void reg (time_watcher *w); void unreg (time_watcher *w); @@ -55,22 +58,32 @@ ~io_manager (); }; -extern io_manager iom; +extern io_manager iom; // a singleton, together with it's construction/destruction problems. + +struct io_watcher : callback2 { + bool registered; // already registered? + int fd; + short events; -struct io_watcher : callback { template - io_watcher (O1 *object, void (O2::*method)(short revents)) - : callback(object,method) + io_watcher (O1 *object, void (O2::*method)(io_watcher &, short)) + : callback2(object,method) + , registered(false) { } - ~io_watcher () + ~io_watcher (); + + void set(int fd_, short events_); + + void set(short events_) { - iom.unreg (this); + set (fd, events_); } - void start (int fd, short events) + void start (int fd_, short events_) { - iom.reg (fd, events, this); + set (fd_, events_); + iom.reg (this); } void stop () @@ -81,20 +94,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 (); @@ -104,10 +114,15 @@ trigger (); } - void start (); + void start () + { + iom.reg (this); + } + void start (tstamp when) { set (when); + iom.reg (this); } void stop ()