ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev++.h
Revision: 1.43
Committed: Wed Nov 5 14:36:18 2008 UTC (15 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-3_49
Changes since 1.42: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.21 /*
2     * libev simple C++ wrapper classes
3     *
4 root 1.40 * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de>
5 root 1.21 * All rights reserved.
6     *
7     * Redistribution and use in source and binary forms, with or without modifica-
8     * tion, are permitted provided that the following conditions are met:
9     *
10     * 1. Redistributions of source code must retain the above copyright notice,
11     * this list of conditions and the following disclaimer.
12     *
13     * 2. Redistributions in binary form must reproduce the above copyright
14     * notice, this list of conditions and the following disclaimer in the
15     * documentation and/or other materials provided with the distribution.
16     *
17     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
18     * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
19     * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20     * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
21     * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
25     * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
26     * OF THE POSSIBILITY OF SUCH DAMAGE.
27     *
28     * Alternatively, the contents of this file may be used under the terms of
29     * the GNU General Public License ("GPL") version 2 or any later version,
30     * in which case the provisions of the GPL are applicable instead of
31     * the above. If you wish to allow the use of your version of this file
32     * only under the terms of the GPL and not to allow others to use your
33     * version of this file under the BSD license, indicate your decision
34     * by deleting the provisions above and replace them with the notice
35     * and other provisions required by the GPL. If you do not delete the
36     * provisions above, a recipient may use your version of this file under
37     * either the BSD or the GPL.
38     */
39    
40 root 1.1 #ifndef EVPP_H__
41     #define EVPP_H__
42    
43 root 1.20 #ifdef EV_H
44     # include EV_H
45     #else
46 root 1.22 # include "ev.h"
47 root 1.20 #endif
48 root 1.1
49 root 1.32 #ifndef EV_USE_STDEXCEPT
50     # define EV_USE_STDEXCEPT 1
51 llucax 1.30 #endif
52    
53 root 1.32 #if EV_USE_STDEXCEPT
54     # include <stdexcept>
55 llucax 1.30 #endif
56    
57 root 1.1 namespace ev {
58    
59 llucax 1.24 typedef ev_tstamp tstamp;
60    
61 root 1.43 enum
62     {
63 llucax 1.24 UNDEF = EV_UNDEF,
64     NONE = EV_NONE,
65     READ = EV_READ,
66     WRITE = EV_WRITE,
67     TIMEOUT = EV_TIMEOUT,
68     PERIODIC = EV_PERIODIC,
69     SIGNAL = EV_SIGNAL,
70     CHILD = EV_CHILD,
71     STAT = EV_STAT,
72     IDLE = EV_IDLE,
73     CHECK = EV_CHECK,
74     PREPARE = EV_PREPARE,
75     FORK = EV_FORK,
76 root 1.39 ASYNC = EV_ASYNC,
77 llucax 1.24 EMBED = EV_EMBED,
78 root 1.42 # undef ERROR // some systems stupidly #define ERROR
79 llucax 1.24 ERROR = EV_ERROR,
80     };
81    
82 llucax 1.25 enum
83     {
84 root 1.41 AUTO = EVFLAG_AUTO,
85     NOENV = EVFLAG_NOENV,
86 llucax 1.25 FORKCHECK = EVFLAG_FORKCHECK,
87 root 1.41
88     SELECT = EVBACKEND_SELECT,
89     POLL = EVBACKEND_POLL,
90     EPOLL = EVBACKEND_EPOLL,
91     KQUEUE = EVBACKEND_KQUEUE,
92     DEVPOLL = EVBACKEND_DEVPOLL,
93     PORT = EVBACKEND_PORT
94 llucax 1.25 };
95    
96     enum
97     {
98     NONBLOCK = EVLOOP_NONBLOCK,
99 root 1.41 ONESHOT = EVLOOP_ONESHOT
100 llucax 1.25 };
101    
102     enum how_t
103     {
104     ONE = EVUNLOOP_ONE,
105     ALL = EVUNLOOP_ALL
106     };
107    
108 root 1.32 struct bad_loop
109     #if EV_USE_STDEXCEPT
110     : std::runtime_error
111     #endif
112 llucax 1.30 {
113 root 1.32 #if EV_USE_STDEXCEPT
114 root 1.31 bad_loop ()
115 root 1.32 : std::runtime_error ("libev event loop cannot be initialized, bad value of LIBEV_FLAGS?")
116 root 1.31 {
117     }
118 root 1.32 #endif
119 llucax 1.30 };
120    
121 llucax 1.28 #ifdef EV_AX
122     # undef EV_AX
123     #endif
124    
125     #ifdef EV_AX_
126     # undef EV_AX_
127     #endif
128    
129     #if EV_MULTIPLICITY
130     # define EV_AX raw_loop
131     # define EV_AX_ raw_loop,
132     #else
133     # define EV_AX
134     # define EV_AX_
135     #endif
136    
137     struct loop_ref
138     {
139 root 1.36 loop_ref (EV_P) throw ()
140 llucax 1.28 #if EV_MULTIPLICITY
141 root 1.36 : EV_AX (EV_A)
142     #endif
143 llucax 1.33 {
144     }
145 llucax 1.28
146 root 1.32 bool operator == (const loop_ref &other) const throw ()
147 llucax 1.28 {
148     #if EV_MULTIPLICITY
149 root 1.32 return EV_AX == other.EV_AX;
150 llucax 1.28 #else
151     return true;
152     #endif
153     }
154    
155 root 1.32 bool operator != (const loop_ref &other) const throw ()
156 llucax 1.28 {
157     #if EV_MULTIPLICITY
158     return ! (*this == other);
159     #else
160     return false;
161     #endif
162     }
163    
164     #if EV_MULTIPLICITY
165 root 1.37 bool operator == (struct ev_loop *other) const throw ()
166 llucax 1.28 {
167     return this->EV_AX == other;
168     }
169    
170 root 1.37 bool operator != (struct ev_loop *other) const throw ()
171 llucax 1.28 {
172     return ! (*this == other);
173     }
174    
175 root 1.37 bool operator == (const struct ev_loop *other) const throw ()
176 llucax 1.28 {
177     return this->EV_AX == other;
178     }
179    
180 root 1.37 bool operator != (const struct ev_loop *other) const throw ()
181 llucax 1.28 {
182     return (*this == other);
183     }
184    
185 root 1.31 operator struct ev_loop * () const throw ()
186 llucax 1.28 {
187     return EV_AX;
188     }
189    
190 root 1.31 operator const struct ev_loop * () const throw ()
191 llucax 1.28 {
192     return EV_AX;
193     }
194    
195 root 1.31 bool is_default () const throw ()
196 llucax 1.28 {
197     return EV_AX == ev_default_loop (0);
198     }
199     #endif
200    
201     void loop (int flags = 0)
202     {
203     ev_loop (EV_AX_ flags);
204     }
205    
206 root 1.31 void unloop (how_t how = ONE) throw ()
207 llucax 1.28 {
208     ev_unloop (EV_AX_ how);
209     }
210    
211 root 1.31 void post_fork () throw ()
212 llucax 1.28 {
213     #if EV_MULTIPLICITY
214     ev_loop_fork (EV_AX);
215     #else
216     ev_default_fork ();
217     #endif
218     }
219    
220 root 1.31 unsigned int count () const throw ()
221 llucax 1.28 {
222     return ev_loop_count (EV_AX);
223     }
224    
225 root 1.31 unsigned int backend () const throw ()
226 llucax 1.28 {
227     return ev_backend (EV_AX);
228     }
229    
230 root 1.31 tstamp now () const throw ()
231 llucax 1.28 {
232     return ev_now (EV_AX);
233     }
234    
235 root 1.31 void ref () throw ()
236 llucax 1.28 {
237     ev_ref (EV_AX);
238     }
239    
240 root 1.31 void unref () throw ()
241 llucax 1.28 {
242     ev_unref (EV_AX);
243     }
244    
245 root 1.31 void set_io_collect_interval (tstamp interval) throw ()
246 llucax 1.28 {
247     ev_set_io_collect_interval (EV_AX_ interval);
248     }
249    
250 root 1.31 void set_timeout_collect_interval (tstamp interval) throw ()
251 llucax 1.28 {
252     ev_set_timeout_collect_interval (EV_AX_ interval);
253     }
254    
255     // function callback
256 root 1.31 void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void* arg = 0) throw ()
257 llucax 1.28 {
258     ev_once (EV_AX_ fd, events, timeout, cb, arg);
259     }
260    
261     // method callback
262     template<class K, void (K::*method)(int)>
263 root 1.31 void once (int fd, int events, tstamp timeout, K *object) throw ()
264 llucax 1.28 {
265     once (fd, events, timeout, method_thunk<K, method>, object);
266     }
267    
268     template<class K, void (K::*method)(int)>
269     static void method_thunk (int revents, void* arg)
270     {
271     K *obj = static_cast<K *>(arg);
272     (obj->*method) (revents);
273     }
274    
275     // const method callback
276     template<class K, void (K::*method)(int) const>
277 root 1.31 void once (int fd, int events, tstamp timeout, const K *object) throw ()
278 llucax 1.28 {
279     once (fd, events, timeout, const_method_thunk<K, method>, object);
280     }
281    
282     template<class K, void (K::*method)(int) const>
283     static void const_method_thunk (int revents, void* arg)
284     {
285     K *obj = static_cast<K *>(arg);
286     (obj->*method) (revents);
287     }
288    
289     // simple method callback
290     template<class K, void (K::*method)()>
291 root 1.31 void once (int fd, int events, tstamp timeout, K *object) throw ()
292 llucax 1.28 {
293     once (fd, events, timeout, method_noargs_thunk<K, method>, object);
294     }
295    
296     template<class K, void (K::*method)()>
297     static void method_noargs_thunk (int revents, void* arg)
298     {
299     K *obj = static_cast<K *>(arg);
300     (obj->*method) ();
301     }
302    
303     // simpler function callback
304     template<void (*cb)(int)>
305 root 1.31 void once (int fd, int events, tstamp timeout) throw ()
306 llucax 1.28 {
307     once (fd, events, timeout, simpler_func_thunk<cb>);
308     }
309    
310     template<void (*cb)(int)>
311     static void simpler_func_thunk (int revents, void* arg)
312     {
313     (*cb) (revents);
314     }
315    
316     // simplest function callback
317     template<void (*cb)()>
318 root 1.31 void once (int fd, int events, tstamp timeout) throw ()
319 llucax 1.28 {
320     once (fd, events, timeout, simplest_func_thunk<cb>);
321     }
322    
323     template<void (*cb)()>
324     static void simplest_func_thunk (int revents, void* arg)
325     {
326     (*cb) ();
327     }
328    
329 root 1.31 void feed_fd_event (int fd, int revents) throw ()
330 llucax 1.28 {
331     ev_feed_fd_event (EV_AX_ fd, revents);
332     }
333    
334 root 1.31 void feed_signal_event (int signum) throw ()
335 llucax 1.28 {
336     ev_feed_signal_event (EV_AX_ signum);
337     }
338    
339     #if EV_MULTIPLICITY
340     struct ev_loop* EV_AX;
341     #endif
342    
343     };
344    
345     #if EV_MULTIPLICITY
346 root 1.36 struct dynamic_loop : loop_ref
347 llucax 1.28 {
348    
349 llucax 1.34 dynamic_loop (unsigned int flags = AUTO) throw (bad_loop)
350 root 1.36 : loop_ref (ev_loop_new (flags))
351 llucax 1.28 {
352 root 1.36 if (!EV_AX)
353     throw bad_loop ();
354 llucax 1.28 }
355    
356 root 1.31 ~dynamic_loop () throw ()
357 llucax 1.28 {
358     ev_loop_destroy (EV_AX);
359     EV_AX = 0;
360     }
361    
362     private:
363    
364     dynamic_loop (const dynamic_loop &);
365    
366     dynamic_loop & operator= (const dynamic_loop &);
367    
368     };
369     #endif
370    
371 root 1.36 struct default_loop : loop_ref
372 llucax 1.28 {
373 root 1.32 default_loop (unsigned int flags = AUTO) throw (bad_loop)
374 llucax 1.28 #if EV_MULTIPLICITY
375 root 1.32 : loop_ref (ev_default_loop (flags))
376     #endif
377 llucax 1.28 {
378 root 1.36 if (
379     #if EV_MULTIPLICITY
380     !EV_AX
381     #else
382     !ev_default_loop (flags)
383 root 1.32 #endif
384 root 1.36 )
385     throw bad_loop ();
386 llucax 1.28 }
387    
388 root 1.31 ~default_loop () throw ()
389 llucax 1.28 {
390     ev_default_destroy ();
391     }
392    
393     private:
394     default_loop (const default_loop &);
395 root 1.32 default_loop &operator = (const default_loop &);
396 llucax 1.28 };
397    
398 root 1.31 inline loop_ref get_default_loop () throw ()
399 llucax 1.28 {
400     #if EV_MULTIPLICITY
401     return ev_default_loop (0);
402     #else
403     return loop_ref ();
404     #endif
405     }
406    
407     #undef EV_AX
408     #undef EV_AX_
409    
410     #undef EV_PX
411     #undef EV_PX_
412     #if EV_MULTIPLICITY
413     # define EV_PX loop_ref EV_A
414     # define EV_PX_ loop_ref EV_A_
415     #else
416     # define EV_PX
417     # define EV_PX_
418     #endif
419    
420 root 1.13 template<class ev_watcher, class watcher>
421     struct base : ev_watcher
422 root 1.1 {
423 root 1.13 #if EV_MULTIPLICITY
424 llucax 1.28 EV_PX;
425 root 1.1
426 root 1.31 void set (EV_PX) throw ()
427 root 1.13 {
428     this->EV_A = EV_A;
429     }
430     #endif
431 root 1.1
432 root 1.31 base (EV_PX) throw ()
433 llucax 1.28 #if EV_MULTIPLICITY
434     : EV_A (EV_A)
435     #endif
436 root 1.13 {
437     ev_init (this, 0);
438     }
439    
440 root 1.31 void set_ (void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) throw ()
441 root 1.13 {
442 root 1.17 this->data = data;
443 root 1.18 ev_set_cb (static_cast<ev_watcher *>(this), cb);
444 root 1.13 }
445    
446 root 1.19 // method callback
447 root 1.13 template<class K, void (K::*method)(watcher &w, int)>
448 root 1.31 void set (K *object) throw ()
449 root 1.13 {
450     set_ (object, method_thunk<K, method>);
451     }
452    
453     template<class K, void (K::*method)(watcher &w, int)>
454 root 1.18 static void method_thunk (EV_P_ ev_watcher *w, int revents)
455 root 1.13 {
456 root 1.17 K *obj = static_cast<K *>(w->data);
457 root 1.18 (obj->*method) (*static_cast<watcher *>(w), revents);
458 root 1.13 }
459    
460 root 1.19 // const method callback
461 root 1.13 template<class K, void (K::*method)(watcher &w, int) const>
462 root 1.31 void set (const K *object) throw ()
463 root 1.13 {
464     set_ (object, const_method_thunk<K, method>);
465     }
466    
467     template<class K, void (K::*method)(watcher &w, int) const>
468 root 1.18 static void const_method_thunk (EV_P_ ev_watcher *w, int revents)
469 root 1.13 {
470 root 1.17 K *obj = static_cast<K *>(w->data);
471 root 1.18 (static_cast<K *>(w->data)->*method) (*static_cast<watcher *>(w), revents);
472 root 1.13 }
473    
474 root 1.19 // function callback
475 root 1.17 template<void (*function)(watcher &w, int)>
476 root 1.31 void set (void *data = 0) throw ()
477 root 1.13 {
478 root 1.16 set_ (data, function_thunk<function>);
479 root 1.13 }
480    
481     template<void (*function)(watcher &w, int)>
482 root 1.18 static void function_thunk (EV_P_ ev_watcher *w, int revents)
483 root 1.13 {
484 root 1.18 function (*static_cast<watcher *>(w), revents);
485 root 1.13 }
486    
487 root 1.19 // simple callback
488     template<class K, void (K::*method)()>
489 root 1.31 void set (K *object) throw ()
490 root 1.19 {
491     set_ (object, method_noargs_thunk<K, method>);
492     }
493    
494     template<class K, void (K::*method)()>
495     static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents)
496     {
497     K *obj = static_cast<K *>(w->data);
498     (obj->*method) ();
499     }
500    
501 root 1.13 void operator ()(int events = EV_UNDEF)
502     {
503 root 1.14 return ev_cb (static_cast<ev_watcher *>(this))
504     (static_cast<ev_watcher *>(this), events);
505 root 1.13 }
506    
507 root 1.31 bool is_active () const throw ()
508 root 1.1 {
509 root 1.13 return ev_is_active (static_cast<const ev_watcher *>(this));
510 root 1.1 }
511    
512 root 1.31 bool is_pending () const throw ()
513 root 1.1 {
514 root 1.13 return ev_is_pending (static_cast<const ev_watcher *>(this));
515 root 1.1 }
516 llucax 1.27
517 root 1.31 void feed_event (int revents) throw ()
518 llucax 1.27 {
519     ev_feed_event (EV_A_ static_cast<const ev_watcher *>(this), revents);
520     }
521 root 1.1 };
522    
523 root 1.31 inline tstamp now () throw ()
524 llucax 1.29 {
525     return ev_time ();
526     }
527    
528 root 1.31 inline void delay (tstamp interval) throw ()
529 llucax 1.26 {
530     ev_sleep (interval);
531     }
532    
533 root 1.31 inline int version_major () throw ()
534 llucax 1.26 {
535     return ev_version_major ();
536     }
537    
538 root 1.31 inline int version_minor () throw ()
539 llucax 1.26 {
540     return ev_version_minor ();
541     }
542    
543 root 1.31 inline unsigned int supported_backends () throw ()
544 llucax 1.26 {
545     return ev_supported_backends ();
546     }
547    
548 root 1.31 inline unsigned int recommended_backends () throw ()
549 llucax 1.26 {
550     return ev_recommended_backends ();
551     }
552    
553 root 1.31 inline unsigned int embeddable_backends () throw ()
554 llucax 1.26 {
555     return ev_embeddable_backends ();
556     }
557    
558 root 1.31 inline void set_allocator (void *(*cb)(void *ptr, long size)) throw ()
559 llucax 1.26 {
560     ev_set_allocator (cb);
561     }
562    
563 root 1.31 inline void set_syserr_cb (void (*cb)(const char *msg)) throw ()
564 llucax 1.26 {
565     ev_set_syserr_cb (cb);
566     }
567    
568 root 1.1 #if EV_MULTIPLICITY
569 llucax 1.28 #define EV_CONSTRUCT(cppstem,cstem) \
570 root 1.39 (EV_PX = get_default_loop ()) throw () \
571 llucax 1.28 : base<ev_ ## cstem, cppstem> (EV_A) \
572 root 1.1 { \
573 root 1.13 }
574 root 1.1 #else
575 llucax 1.28 #define EV_CONSTRUCT(cppstem,cstem) \
576 root 1.39 () throw () \
577 root 1.13 { \
578     }
579 root 1.1 #endif
580    
581     /* using a template here would require quite a bit more lines,
582     * so a macro solution was chosen */
583 root 1.4 #define EV_BEGIN_WATCHER(cppstem,cstem) \
584 root 1.1 \
585 root 1.13 struct cppstem : base<ev_ ## cstem, cppstem> \
586 root 1.1 { \
587 root 1.39 void start () throw () \
588 root 1.1 { \
589     ev_ ## cstem ## _start (EV_A_ static_cast<ev_ ## cstem *>(this)); \
590     } \
591     \
592 root 1.39 void stop () throw () \
593 root 1.1 { \
594     ev_ ## cstem ## _stop (EV_A_ static_cast<ev_ ## cstem *>(this)); \
595     } \
596     \
597 llucax 1.28 cppstem EV_CONSTRUCT(cppstem,cstem) \
598 root 1.1 \
599 root 1.39 ~cppstem () throw () \
600 root 1.3 { \
601     stop (); \
602     } \
603     \
604 root 1.13 using base<ev_ ## cstem, cppstem>::set; \
605     \
606 root 1.1 private: \
607     \
608 llucax 1.23 cppstem (const cppstem &o); \
609 root 1.6 \
610 root 1.39 cppstem &operator =(const cppstem &o); \
611 root 1.1 \
612     public:
613    
614 root 1.4 #define EV_END_WATCHER(cppstem,cstem) \
615 root 1.6 };
616 root 1.4
617     EV_BEGIN_WATCHER (io, io)
618 root 1.31 void set (int fd, int events) throw ()
619 root 1.1 {
620     int active = is_active ();
621     if (active) stop ();
622     ev_io_set (static_cast<ev_io *>(this), fd, events);
623     if (active) start ();
624     }
625    
626 root 1.31 void set (int events) throw ()
627 root 1.1 {
628     int active = is_active ();
629     if (active) stop ();
630     ev_io_set (static_cast<ev_io *>(this), fd, events);
631     if (active) start ();
632     }
633    
634 root 1.31 void start (int fd, int events) throw ()
635 root 1.1 {
636     set (fd, events);
637     start ();
638     }
639 root 1.4 EV_END_WATCHER (io, io)
640 root 1.1
641 root 1.4 EV_BEGIN_WATCHER (timer, timer)
642 root 1.31 void set (ev_tstamp after, ev_tstamp repeat = 0.) throw ()
643 root 1.1 {
644     int active = is_active ();
645     if (active) stop ();
646     ev_timer_set (static_cast<ev_timer *>(this), after, repeat);
647     if (active) start ();
648     }
649    
650 root 1.31 void start (ev_tstamp after, ev_tstamp repeat = 0.) throw ()
651 root 1.1 {
652     set (after, repeat);
653     start ();
654     }
655    
656 root 1.31 void again () throw ()
657 root 1.1 {
658     ev_timer_again (EV_A_ static_cast<ev_timer *>(this));
659     }
660 root 1.4 EV_END_WATCHER (timer, timer)
661 root 1.1
662 root 1.8 #if EV_PERIODIC_ENABLE
663 root 1.4 EV_BEGIN_WATCHER (periodic, periodic)
664 root 1.31 void set (ev_tstamp at, ev_tstamp interval = 0.) throw ()
665 root 1.1 {
666     int active = is_active ();
667     if (active) stop ();
668     ev_periodic_set (static_cast<ev_periodic *>(this), at, interval, 0);
669     if (active) start ();
670     }
671    
672 root 1.31 void start (ev_tstamp at, ev_tstamp interval = 0.) throw ()
673 root 1.1 {
674     set (at, interval);
675     start ();
676     }
677    
678 root 1.31 void again () throw ()
679 root 1.1 {
680     ev_periodic_again (EV_A_ static_cast<ev_periodic *>(this));
681     }
682 root 1.4 EV_END_WATCHER (periodic, periodic)
683 root 1.3 #endif
684 root 1.1
685 root 1.4 EV_BEGIN_WATCHER (sig, signal)
686 root 1.31 void set (int signum) throw ()
687 root 1.1 {
688     int active = is_active ();
689     if (active) stop ();
690     ev_signal_set (static_cast<ev_signal *>(this), signum);
691     if (active) start ();
692     }
693    
694 root 1.31 void start (int signum) throw ()
695 root 1.1 {
696     set (signum);
697     start ();
698     }
699 root 1.4 EV_END_WATCHER (sig, signal)
700 root 1.1
701 root 1.4 EV_BEGIN_WATCHER (child, child)
702 root 1.37 void set (int pid, int trace = 0) throw ()
703 root 1.1 {
704     int active = is_active ();
705     if (active) stop ();
706 root 1.37 ev_child_set (static_cast<ev_child *>(this), pid, trace);
707 root 1.1 if (active) start ();
708     }
709    
710 root 1.37 void start (int pid, int trace = 0) throw ()
711 root 1.1 {
712 root 1.37 set (pid, trace);
713 root 1.1 start ();
714     }
715 root 1.4 EV_END_WATCHER (child, child)
716 root 1.1
717 root 1.8 #if EV_STAT_ENABLE
718     EV_BEGIN_WATCHER (stat, stat)
719 root 1.31 void set (const char *path, ev_tstamp interval = 0.) throw ()
720 root 1.8 {
721     int active = is_active ();
722     if (active) stop ();
723     ev_stat_set (static_cast<ev_stat *>(this), path, interval);
724     if (active) start ();
725     }
726    
727 root 1.31 void start (const char *path, ev_tstamp interval = 0.) throw ()
728 root 1.8 {
729 root 1.12 stop ();
730 root 1.8 set (path, interval);
731     start ();
732     }
733    
734 root 1.31 void update () throw ()
735 root 1.8 {
736     ev_stat_stat (EV_A_ static_cast<ev_stat *>(this));
737     }
738     EV_END_WATCHER (stat, stat)
739     #endif
740    
741     EV_BEGIN_WATCHER (idle, idle)
742 root 1.31 void set () throw () { }
743 root 1.8 EV_END_WATCHER (idle, idle)
744 root 1.7
745 root 1.8 EV_BEGIN_WATCHER (prepare, prepare)
746 root 1.31 void set () throw () { }
747 root 1.8 EV_END_WATCHER (prepare, prepare)
748    
749     EV_BEGIN_WATCHER (check, check)
750 root 1.31 void set () throw () { }
751 root 1.8 EV_END_WATCHER (check, check)
752    
753     #if EV_EMBED_ENABLE
754 root 1.7 EV_BEGIN_WATCHER (embed, embed)
755 root 1.39 void set (struct ev_loop *embedded_loop) throw ()
756     {
757     int active = is_active ();
758     if (active) stop ();
759     ev_embed_set (static_cast<ev_embed *>(this), embedded_loop);
760     if (active) start ();
761     }
762    
763 root 1.31 void start (struct ev_loop *embedded_loop) throw ()
764 root 1.7 {
765 root 1.39 set (embedded_loop);
766 root 1.7 start ();
767     }
768    
769     void sweep ()
770     {
771     ev_embed_sweep (EV_A_ static_cast<ev_embed *>(this));
772     }
773     EV_END_WATCHER (embed, embed)
774     #endif
775    
776 root 1.10 #if EV_FORK_ENABLE
777     EV_BEGIN_WATCHER (fork, fork)
778 root 1.31 void set () throw () { }
779 root 1.10 EV_END_WATCHER (fork, fork)
780     #endif
781    
782 root 1.39 #if EV_ASYNC_ENABLE
783     EV_BEGIN_WATCHER (async, async)
784     void set () throw () { }
785    
786     void send () throw ()
787     {
788     ev_async_send (EV_A_ static_cast<ev_async *>(this));
789     }
790    
791     bool async_pending () throw ()
792     {
793     return ev_async_pending (static_cast<ev_async *>(this));
794     }
795     EV_END_WATCHER (async, async)
796     #endif
797    
798 llucax 1.28 #undef EV_PX
799     #undef EV_PX_
800 root 1.1 #undef EV_CONSTRUCT
801 root 1.4 #undef EV_BEGIN_WATCHER
802 root 1.7 #undef EV_END_WATCHER
803 root 1.1 }
804    
805     #endif
806