ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/iom.h
(Generate patch)

Comparing gvpe/src/iom.h (file contents):
Revision 1.27 by pcg, Thu Mar 3 16:54:34 2005 UTC vs.
Revision 1.31 by pcg, Thu Jan 19 20:16:06 2006 UTC

1/* 1/*
2 iom.h -- generic I/O multiplexer 2 iom.h -- generic I/O multiplexer
3 Copyright (C) 2003, 2004 Marc Lehmann <gvpe@schmorp.de> 3 Copyright (C) 2003-2006 Marc Lehmann <gvpe@schmorp.de>
4 4
5 This file is part of GVPE. 5 This file is part of GVPE.
6 6
7 GVPE is free software; you can redistribute it and/or modify 7 GVPE is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 15 GNU General Public License for more details.
16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
18 along with gvpe; if not, write to the Free Software 18 along with gvpe; if not, write to the Free Software
19 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20*/ 20*/
21 21
22#ifndef IOM_H__ 22#ifndef IOM_H__
23#define IOM_H__ 23#define IOM_H__
24 24
26// - a vector template like simplevec or stl's vector 26// - a vector template like simplevec or stl's vector
27// - defines for all watcher types required in your app 27// - defines for all watcher types required in your app
28// edit iom_conf.h as appropriate. 28// edit iom_conf.h as appropriate.
29#include "iom_conf.h" 29#include "iom_conf.h"
30 30
31#if IOM_CHILD
32# undef IOM_SIG
33# define IOM_SIG 1
34#endif
35
31#include "callback.h" 36#include "callback.h"
32
33#ifndef IOM_IO
34# define IOM_IO 0
35#endif
36#ifndef IOM_TIME
37# define IOM_TIME 0
38#endif
39#ifndef IOM_CHECK
40# define IOM_CHECK 0
41#endif
42#ifndef IOM_IDLE
43# define IOM_IDLE 0
44#endif
45#ifndef IOM_SIG
46# define IOM_SIG 0
47#endif
48 37
49typedef double tstamp; 38typedef double tstamp;
50extern tstamp NOW; 39extern tstamp NOW;
40
41// TSTAMP_MAX must still fit into a positive struct timeval
42#define TSTAMP_MAX (double)(1UL<<31)
51 43
52struct watcher; 44struct watcher;
53#if IOM_IO 45#if IOM_IO
54struct io_watcher; 46struct io_watcher;
55#endif 47#endif
62#if IOM_IDLE 54#if IOM_IDLE
63struct idle_watcher; 55struct idle_watcher;
64#endif 56#endif
65#if IOM_SIG 57#if IOM_SIG
66struct sig_watcher; 58struct sig_watcher;
59#endif
60#if IOM_CHILD
61struct child_watcher;
67#endif 62#endif
68 63
69template<class watcher> 64template<class watcher>
70struct io_manager_vec : vector<watcher *> { 65struct io_manager_vec : vector<watcher *> {
71 void erase_unordered (unsigned int pos) 66 void erase_unordered (unsigned int pos)
110 static void reg (idle_watcher &w); static void unreg (idle_watcher &w); 105 static void reg (idle_watcher &w); static void unreg (idle_watcher &w);
111#endif 106#endif
112#if IOM_SIG 107#if IOM_SIG
113 static void reg (sig_watcher &w); static void unreg (sig_watcher &w); 108 static void reg (sig_watcher &w); static void unreg (sig_watcher &w);
114#endif 109#endif
110#if IOM_CHILD
111 static void reg (child_watcher &w); static void unreg (child_watcher &w);
112#endif
115 113
116 static void loop (); 114 static void loop ();
117}; 115};
118 116
119struct watcher { 117struct watcher {
120 int active; /* 0 == inactive, else index into respective vector */ 118 int active; /* 0 == inactive, else index into respective vector */
121 119
120 bool is_active () { return active; }
121
122 watcher () : active (0) { } 122 watcher () : active (0) { }
123}; 123};
124 124
125#if IOM_IO 125#if IOM_IO
126enum { EVENT_READ = 1, EVENT_WRITE = 2 }; 126enum { EVENT_UNDEF = -1, EVENT_NONE = 0, EVENT_READ = 1, EVENT_WRITE = 2 };
127 127
128struct io_watcher : watcher, callback2<void, io_watcher &, short> { 128struct io_watcher : watcher, callback2<void, io_watcher &, short> {
129 int fd; 129 int fd;
130 short events; 130 short events;
131 131
136 void start (int fd_, short events_) { set (fd_, events_); io_manager::reg (*this); } 136 void start (int fd_, short events_) { set (fd_, events_); io_manager::reg (*this); }
137 void stop () { io_manager::unreg (*this); } 137 void stop () { io_manager::unreg (*this); }
138 138
139 template<class O1, class O2> 139 template<class O1, class O2>
140 io_watcher (O1 *object, void (O2::*method) (io_watcher &, short)) 140 io_watcher (O1 *object, void (O2::*method) (io_watcher &, short))
141 : callback2<void, io_watcher &, short> (object,method) 141 : callback2<void, io_watcher &, short> (object, method)
142 { } 142 { }
143 ~io_watcher () { stop (); } 143 ~io_watcher () { stop (); }
144}; 144};
145#endif 145#endif
146 146
156 void start (tstamp when) { set (when); io_manager::reg (*this); } 156 void start (tstamp when) { set (when); io_manager::reg (*this); }
157 void stop () { io_manager::unreg (*this); } 157 void stop () { io_manager::unreg (*this); }
158 158
159 template<class O1, class O2> 159 template<class O1, class O2>
160 time_watcher (O1 *object, void (O2::*method) (time_watcher &)) 160 time_watcher (O1 *object, void (O2::*method) (time_watcher &))
161 : callback1<void, time_watcher &> (object,method), at (0) 161 : callback1<void, time_watcher &> (object, method), at (0)
162 { } 162 { }
163 ~time_watcher () { stop (); } 163 ~time_watcher () { stop (); }
164}; 164};
165#endif 165#endif
166 166
170 void start () { io_manager::reg (*this); } 170 void start () { io_manager::reg (*this); }
171 void stop () { io_manager::unreg (*this); } 171 void stop () { io_manager::unreg (*this); }
172 172
173 template<class O1, class O2> 173 template<class O1, class O2>
174 check_watcher (O1 *object, void (O2::*method) (check_watcher &)) 174 check_watcher (O1 *object, void (O2::*method) (check_watcher &))
175 : callback1<void, check_watcher &> (object,method) 175 : callback1<void, check_watcher &> (object, method)
176 { } 176 { }
177 ~check_watcher () { stop (); } 177 ~check_watcher () { stop (); }
178}; 178};
179#endif 179#endif
180 180
184 void start () { io_manager::reg (*this); } 184 void start () { io_manager::reg (*this); }
185 void stop () { io_manager::unreg (*this); } 185 void stop () { io_manager::unreg (*this); }
186 186
187 template<class O1, class O2> 187 template<class O1, class O2>
188 idle_watcher (O1 *object, void (O2::*method) (idle_watcher &)) 188 idle_watcher (O1 *object, void (O2::*method) (idle_watcher &))
189 : callback1<void, idle_watcher &> (object,method) 189 : callback1<void, idle_watcher &> (object, method)
190 { } 190 { }
191 ~idle_watcher () { stop (); } 191 ~idle_watcher () { stop (); }
192}; 192};
193#endif 193#endif
194 194
199 void start (int signum); 199 void start (int signum);
200 void stop () { io_manager::unreg (*this); } 200 void stop () { io_manager::unreg (*this); }
201 201
202 template<class O1, class O2> 202 template<class O1, class O2>
203 sig_watcher (O1 *object, void (O2::*method) (sig_watcher &)) 203 sig_watcher (O1 *object, void (O2::*method) (sig_watcher &))
204 : callback1<void, sig_watcher &> (object,method), signum (-1) 204 : callback1<void, sig_watcher &> (object, method), signum (0)
205 { } 205 { }
206 ~sig_watcher () { stop (); } 206 ~sig_watcher () { stop (); }
207}; 207};
208#endif 208#endif
209 209
210#endif 210#if IOM_CHILD
211struct child_watcher : watcher, callback2<void, child_watcher &, int> {
212 int /*pid_t*/ pid;
211 213
214 void start (int pid) { this->pid = pid; io_manager::reg (*this); }
215 void stop () { io_manager::unreg (*this); }
216
217 template<class O1, class O2>
218 child_watcher (O1 *object, void (O2::*method) (child_watcher &, int status))
219 : callback2<void, child_watcher &, int> (object, method), pid (0)
220 { }
221 ~child_watcher () { stop (); }
222};
223#endif
224
225#endif
226

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines