--- gvpe/src/iom.h 2004/03/21 12:50:05 1.18 +++ gvpe/src/iom.h 2004/04/02 14:42:45 1.19 @@ -40,6 +40,9 @@ #ifndef IOM_IDLE # define IOM_IDLE 0 #endif +#ifndef IOM_SIG +# define IOM_SIG 0 +#endif typedef double tstamp; extern tstamp NOW; @@ -57,6 +60,9 @@ #if IOM_IDLE struct idle_watcher; #endif +#if IOM_SIG +struct sig_watcher; +#endif template struct io_manager_vec : vector { @@ -88,6 +94,11 @@ #if IOM_IDLE io_manager_vec iw; #endif +#if IOM_SIG + typedef io_manager_vec sig_vec; + vector sw; + static void sighandler (int signum); +#endif template void reg (watcher *w, io_manager_vec &queue); @@ -109,6 +120,9 @@ #if IOM_IDLE void reg (idle_watcher *w); void unreg (idle_watcher *w); #endif +#if IOM_SIG + void reg (sig_watcher *w); void unreg (sig_watcher *w); +#endif void loop (); @@ -121,7 +135,7 @@ struct watcher { int active; /* 0 == inactive, else index into respective vector */ - watcher() : active(0) { } + watcher () : active (0) { } }; #if IOM_IO @@ -139,8 +153,8 @@ void stop () { iom.unreg (this); } template - io_watcher (O1 *object, void (O2::*method)(io_watcher &, short)) - : callback2(object,method) + io_watcher (O1 *object, void (O2::*method) (io_watcher &, short)) + : callback2 (object,method) { } ~io_watcher () { stop (); } }; @@ -153,14 +167,14 @@ void trigger (); void set (tstamp when) { at = when; } - void operator ()() { trigger (); } + void operator () () { trigger (); } void start () { iom.reg (this); } void start (tstamp when) { set (when); iom.reg (this); } void stop () { iom.unreg (this); } template - time_watcher (O1 *object, void (O2::*method)(time_watcher &)) - : callback1(object,method), at(0) + time_watcher (O1 *object, void (O2::*method) (time_watcher &)) + : callback1 (object,method), at (0) { } ~time_watcher () { stop (); } }; @@ -173,8 +187,8 @@ void stop () { iom.unreg (this); } template - check_watcher (O1 *object, void (O2::*method)(check_watcher &)) - : callback1(object,method) + check_watcher (O1 *object, void (O2::*method) (check_watcher &)) + : callback1 (object,method) { } ~check_watcher () { stop (); } }; @@ -187,12 +201,27 @@ void stop () { iom.unreg (this); } template - idle_watcher (O1 *object, void (O2::*method)(idle_watcher &)) - : callback1(object,method) + idle_watcher (O1 *object, void (O2::*method) (idle_watcher &)) + : callback1 (object,method) { } ~idle_watcher () { stop (); } }; #endif +#if IOM_SIG +struct sig_watcher : watcher, callback1 { + int signum; + + void start (int signum); + void stop () { iom.unreg (this); } + + template + sig_watcher (O1 *object, void (O2::*method) (sig_watcher &)) + : callback1 (object,method), signum (-1) + { } + ~sig_watcher () { stop (); } +}; +#endif + #endif