--- rxvt-unicode/src/iom.h 2006/01/09 22:41:41 1.24 +++ rxvt-unicode/src/iom.h 2006/05/31 00:39:48 1.29 @@ -1,6 +1,6 @@ /* iom.h -- generic I/O multiplexer - Copyright (C) 2003, 2004 Marc Lehmann + Copyright (C) 2003-2006 Marc Lehmann This file is part of GVPE. @@ -28,24 +28,13 @@ // edit iom_conf.h as appropriate. #include "iom_conf.h" -#include "callback.h" - -#ifndef IOM_IO -# define IOM_IO 0 -#endif -#ifndef IOM_TIME -# define IOM_TIME 0 -#endif -#ifndef IOM_CHECK -# define IOM_CHECK 0 -#endif -#ifndef IOM_IDLE -# define IOM_IDLE 0 -#endif -#ifndef IOM_SIG -# define IOM_SIG 0 +#if IOM_CHILD +# undef IOM_SIG +# define IOM_SIG 1 #endif +#include "callback.h" + typedef double tstamp; extern tstamp NOW; @@ -68,6 +57,9 @@ #if IOM_SIG struct sig_watcher; #endif +#if IOM_CHILD +struct child_watcher; +#endif template struct io_manager_vec : vector { @@ -115,6 +107,9 @@ #if IOM_SIG static void reg (sig_watcher &w); static void unreg (sig_watcher &w); #endif +#if IOM_CHILD + static void reg (child_watcher &w); static void unreg (child_watcher &w); +#endif static void loop (); }; @@ -122,13 +117,15 @@ struct watcher { int active; /* 0 == inactive, else index into respective vector */ + bool is_active () { return active; } + watcher () : active (0) { } }; #if IOM_IO enum { EVENT_UNDEF = -1, EVENT_NONE = 0, EVENT_READ = 1, EVENT_WRITE = 2 }; -struct io_watcher : watcher, callback2 { +struct io_watcher : watcher, callback { int fd; short events; @@ -139,16 +136,16 @@ void start (int fd_, short events_) { set (fd_, events_); io_manager::reg (*this); } void stop () { io_manager::unreg (*this); } - template - io_watcher (O1 *object, void (O2::*method) (io_watcher &, short)) - : callback2 (object,method) + template + io_watcher (O object, M method) + : callback (object, method) { } ~io_watcher () { stop (); } }; #endif #if IOM_TIME -struct time_watcher : watcher, callback1 { +struct time_watcher : watcher, callback { tstamp at; void trigger (); @@ -159,9 +156,9 @@ void start (tstamp when) { set (when); io_manager::reg (*this); } void stop () { io_manager::unreg (*this); } - template - time_watcher (O1 *object, void (O2::*method) (time_watcher &)) - : callback1 (object,method), at (0) + template + time_watcher (O object, M method) + : callback (object, method), at (0) { } ~time_watcher () { stop (); } }; @@ -169,13 +166,13 @@ #if IOM_CHECK // run before checking for new events -struct check_watcher : watcher, callback1 { +struct check_watcher : watcher, callback { void start () { io_manager::reg (*this); } void stop () { io_manager::unreg (*this); } - template - check_watcher (O1 *object, void (O2::*method) (check_watcher &)) - : callback1 (object,method) + template + check_watcher (O object, M method) + : callback (object, method) { } ~check_watcher () { stop (); } }; @@ -183,32 +180,47 @@ #if IOM_IDLE // run after checking for any i/o, but before waiting -struct idle_watcher : watcher, callback1 { +struct idle_watcher : watcher, callback { void start () { io_manager::reg (*this); } void stop () { io_manager::unreg (*this); } - template - idle_watcher (O1 *object, void (O2::*method) (idle_watcher &)) - : callback1 (object,method) + template + idle_watcher (O object, M method) + : callback (object, method) { } ~idle_watcher () { stop (); } }; #endif #if IOM_SIG -struct sig_watcher : watcher, callback1 { +struct sig_watcher : watcher, callback { int signum; void start (int signum); void stop () { io_manager::unreg (*this); } - template - sig_watcher (O1 *object, void (O2::*method) (sig_watcher &)) - : callback1 (object,method), signum (-1) + template + sig_watcher (O object, M method) + : callback (object, method), signum (0) { } ~sig_watcher () { stop (); } }; #endif +#if IOM_CHILD +struct child_watcher : watcher, callback { + int /*pid_t*/ pid; + + void start (int pid) { this->pid = pid; io_manager::reg (*this); } + void stop () { io_manager::unreg (*this); } + + template + child_watcher (O object, M method) + : callback (object, method), pid (0) + { } + ~child_watcher () { stop (); } +}; +#endif + #endif