evdispatch 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/History.txt +3 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +96 -0
  4. data/README.txt +73 -0
  5. data/Rakefile +4 -0
  6. data/config/hoe.rb +70 -0
  7. data/config/requirements.rb +15 -0
  8. data/ext/revdispatch/extconf.rb +31 -0
  9. data/ext/revdispatch/libevdispatch/Changelog +0 -0
  10. data/ext/revdispatch/libevdispatch/LICENSE +0 -0
  11. data/ext/revdispatch/libevdispatch/Makefile.am +10 -0
  12. data/ext/revdispatch/libevdispatch/Makefile.in +637 -0
  13. data/ext/revdispatch/libevdispatch/README +3 -0
  14. data/ext/revdispatch/libevdispatch/TODO +5 -0
  15. data/ext/revdispatch/libevdispatch/aclocal.m4 +7459 -0
  16. data/ext/revdispatch/libevdispatch/autogen.sh +11 -0
  17. data/ext/revdispatch/libevdispatch/confdefs.h +32 -0
  18. data/ext/revdispatch/libevdispatch/config.guess +1516 -0
  19. data/ext/revdispatch/libevdispatch/config.h.in +112 -0
  20. data/ext/revdispatch/libevdispatch/config.sub +1626 -0
  21. data/ext/revdispatch/libevdispatch/configure +21949 -0
  22. data/ext/revdispatch/libevdispatch/configure.ac +40 -0
  23. data/ext/revdispatch/libevdispatch/depcomp +584 -0
  24. data/ext/revdispatch/libevdispatch/install-sh +507 -0
  25. data/ext/revdispatch/libevdispatch/libev/Changes +54 -0
  26. data/ext/revdispatch/libevdispatch/libev/LICENSE +25 -0
  27. data/ext/revdispatch/libevdispatch/libev/Makefile.am +18 -0
  28. data/ext/revdispatch/libevdispatch/libev/Makefile.in +677 -0
  29. data/ext/revdispatch/libevdispatch/libev/README +130 -0
  30. data/ext/revdispatch/libevdispatch/libev/aclocal.m4 +7430 -0
  31. data/ext/revdispatch/libevdispatch/libev/autogen.sh +7 -0
  32. data/ext/revdispatch/libevdispatch/libev/config.guess +1516 -0
  33. data/ext/revdispatch/libevdispatch/libev/config.h.in +106 -0
  34. data/ext/revdispatch/libevdispatch/libev/config.sub +1626 -0
  35. data/ext/revdispatch/libevdispatch/libev/configure +21636 -0
  36. data/ext/revdispatch/libevdispatch/libev/configure.ac +18 -0
  37. data/ext/revdispatch/libevdispatch/libev/ev++.h +779 -0
  38. data/ext/revdispatch/libevdispatch/libev/ev.3 +3276 -0
  39. data/ext/revdispatch/libevdispatch/libev/ev.c +2547 -0
  40. data/ext/revdispatch/libevdispatch/libev/ev.h +608 -0
  41. data/ext/revdispatch/libevdispatch/libev/ev.pod +3192 -0
  42. data/ext/revdispatch/libevdispatch/libev/ev_epoll.c +182 -0
  43. data/ext/revdispatch/libevdispatch/libev/ev_kqueue.c +194 -0
  44. data/ext/revdispatch/libevdispatch/libev/ev_poll.c +135 -0
  45. data/ext/revdispatch/libevdispatch/libev/ev_port.c +163 -0
  46. data/ext/revdispatch/libevdispatch/libev/ev_select.c +244 -0
  47. data/ext/revdispatch/libevdispatch/libev/ev_vars.h +157 -0
  48. data/ext/revdispatch/libevdispatch/libev/ev_win32.c +125 -0
  49. data/ext/revdispatch/libevdispatch/libev/ev_wrap.h +144 -0
  50. data/ext/revdispatch/libevdispatch/libev/event.c +404 -0
  51. data/ext/revdispatch/libevdispatch/libev/event.h +152 -0
  52. data/ext/revdispatch/libevdispatch/libev/install-sh +294 -0
  53. data/ext/revdispatch/libevdispatch/libev/libev.m4 +28 -0
  54. data/ext/revdispatch/libevdispatch/libev/ltmain.sh +6930 -0
  55. data/ext/revdispatch/libevdispatch/libev/missing +336 -0
  56. data/ext/revdispatch/libevdispatch/libev/mkinstalldirs +111 -0
  57. data/ext/revdispatch/libevdispatch/ltmain.sh +6930 -0
  58. data/ext/revdispatch/libevdispatch/missing +367 -0
  59. data/ext/revdispatch/libevdispatch/src/Makefile.am +11 -0
  60. data/ext/revdispatch/libevdispatch/src/Makefile.in +486 -0
  61. data/ext/revdispatch/libevdispatch/src/ev_dispatch.cc +264 -0
  62. data/ext/revdispatch/libevdispatch/src/ev_dispatch.h +300 -0
  63. data/ext/revdispatch/libevdispatch/src/ev_http.cc +238 -0
  64. data/ext/revdispatch/libevdispatch/src/ev_http.h +65 -0
  65. data/ext/revdispatch/libevdispatch/test/Makefile.am +16 -0
  66. data/ext/revdispatch/libevdispatch/test/Makefile.in +513 -0
  67. data/ext/revdispatch/libevdispatch/test/helper.rb +94 -0
  68. data/ext/revdispatch/libevdispatch/test/key_test.cc +52 -0
  69. data/ext/revdispatch/libevdispatch/test/next_test.cc +86 -0
  70. data/ext/revdispatch/libevdispatch/test/next_test.rb +8 -0
  71. data/ext/revdispatch/libevdispatch/test/server.rb +9 -0
  72. data/ext/revdispatch/revdispatch.cc +151 -0
  73. data/ext/revdispatch/server.rb +60 -0
  74. data/ext/revdispatch/test.rb +100 -0
  75. data/lib/evdispatch/loop.rb +16 -0
  76. data/lib/evdispatch/version.rb +9 -0
  77. data/lib/evdispatch.rb +8 -0
  78. data/log/debug.log +0 -0
  79. data/script/console +10 -0
  80. data/script/destroy +14 -0
  81. data/script/generate +14 -0
  82. data/script/txt2html +74 -0
  83. data/setup.rb +1585 -0
  84. data/tasks/deployment.rake +34 -0
  85. data/tasks/environment.rake +7 -0
  86. data/tasks/extconf/revdispatch.rake +43 -0
  87. data/tasks/extconf.rake +13 -0
  88. data/tasks/website.rake +17 -0
  89. data/test/test_evdispatch.rb +11 -0
  90. data/test/test_helper.rb +3 -0
  91. data/test/test_revdispatch_extn.rb +14 -0
  92. data/website/index.html +128 -0
  93. data/website/index.txt +55 -0
  94. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  95. data/website/stylesheets/screen.css +138 -0
  96. data/website/template.html.erb +49 -0
  97. metadata +157 -0
@@ -0,0 +1,779 @@
1
+ /*
2
+ * libev simple C++ wrapper classes
3
+ *
4
+ * Copyright (c) 2007 Marc Alexander Lehmann <libev@schmorp.de>
5
+ * 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
+ #ifndef EVPP_H__
41
+ #define EVPP_H__
42
+
43
+ #ifdef EV_H
44
+ # include EV_H
45
+ #else
46
+ # include "ev.h"
47
+ #endif
48
+
49
+ #ifndef EV_USE_STDEXCEPT
50
+ # define EV_USE_STDEXCEPT 1
51
+ #endif
52
+
53
+ #if EV_USE_STDEXCEPT
54
+ # include <stdexcept>
55
+ #endif
56
+
57
+ namespace ev {
58
+
59
+ typedef ev_tstamp tstamp;
60
+
61
+ enum {
62
+ UNDEF = EV_UNDEF,
63
+ NONE = EV_NONE,
64
+ READ = EV_READ,
65
+ WRITE = EV_WRITE,
66
+ TIMEOUT = EV_TIMEOUT,
67
+ PERIODIC = EV_PERIODIC,
68
+ SIGNAL = EV_SIGNAL,
69
+ CHILD = EV_CHILD,
70
+ STAT = EV_STAT,
71
+ IDLE = EV_IDLE,
72
+ CHECK = EV_CHECK,
73
+ PREPARE = EV_PREPARE,
74
+ FORK = EV_FORK,
75
+ EMBED = EV_EMBED,
76
+ ERROR = EV_ERROR,
77
+ };
78
+
79
+ enum
80
+ {
81
+ AUTO = EVFLAG_AUTO,
82
+ NOENV = EVFLAG_NOENV,
83
+ FORKCHECK = EVFLAG_FORKCHECK,
84
+ SELECT = EVBACKEND_SELECT,
85
+ POLL = EVBACKEND_POLL,
86
+ EPOLL = EVBACKEND_EPOLL,
87
+ KQUEUE = EVBACKEND_KQUEUE,
88
+ DEVPOLL = EVBACKEND_DEVPOLL,
89
+ PORT = EVBACKEND_PORT
90
+ };
91
+
92
+ enum
93
+ {
94
+ NONBLOCK = EVLOOP_NONBLOCK,
95
+ ONESHOT = EVLOOP_ONESHOT
96
+ };
97
+
98
+ enum how_t
99
+ {
100
+ ONE = EVUNLOOP_ONE,
101
+ ALL = EVUNLOOP_ALL
102
+ };
103
+
104
+ struct bad_loop
105
+ #if EV_USE_STDEXCEPT
106
+ : std::runtime_error
107
+ #endif
108
+ {
109
+ #if EV_USE_STDEXCEPT
110
+ bad_loop ()
111
+ : std::runtime_error ("libev event loop cannot be initialized, bad value of LIBEV_FLAGS?")
112
+ {
113
+ }
114
+ #endif
115
+ };
116
+
117
+ #ifdef EV_AX
118
+ # undef EV_AX
119
+ #endif
120
+
121
+ #ifdef EV_AX_
122
+ # undef EV_AX_
123
+ #endif
124
+
125
+ #if EV_MULTIPLICITY
126
+ # define EV_AX raw_loop
127
+ # define EV_AX_ raw_loop,
128
+ #else
129
+ # define EV_AX
130
+ # define EV_AX_
131
+ #endif
132
+
133
+ struct loop_ref
134
+ {
135
+ loop_ref (EV_P) throw ()
136
+ #if EV_MULTIPLICITY
137
+ : EV_AX (EV_A)
138
+ #endif
139
+ {
140
+ }
141
+
142
+ bool operator == (const loop_ref &other) const throw ()
143
+ {
144
+ #if EV_MULTIPLICITY
145
+ return EV_AX == other.EV_AX;
146
+ #else
147
+ return true;
148
+ #endif
149
+ }
150
+
151
+ bool operator != (const loop_ref &other) const throw ()
152
+ {
153
+ #if EV_MULTIPLICITY
154
+ return ! (*this == other);
155
+ #else
156
+ return false;
157
+ #endif
158
+ }
159
+
160
+ #if EV_MULTIPLICITY
161
+ bool operator == (struct ev_loop *other) const throw ()
162
+ {
163
+ return this->EV_AX == other;
164
+ }
165
+
166
+ bool operator != (struct ev_loop *other) const throw ()
167
+ {
168
+ return ! (*this == other);
169
+ }
170
+
171
+ bool operator == (const struct ev_loop *other) const throw ()
172
+ {
173
+ return this->EV_AX == other;
174
+ }
175
+
176
+ bool operator != (const struct ev_loop *other) const throw ()
177
+ {
178
+ return (*this == other);
179
+ }
180
+
181
+ operator struct ev_loop * () const throw ()
182
+ {
183
+ return EV_AX;
184
+ }
185
+
186
+ operator const struct ev_loop * () const throw ()
187
+ {
188
+ return EV_AX;
189
+ }
190
+
191
+ bool is_default () const throw ()
192
+ {
193
+ return EV_AX == ev_default_loop (0);
194
+ }
195
+ #endif
196
+
197
+ void loop (int flags = 0)
198
+ {
199
+ ev_loop (EV_AX_ flags);
200
+ }
201
+
202
+ void unloop (how_t how = ONE) throw ()
203
+ {
204
+ ev_unloop (EV_AX_ how);
205
+ }
206
+
207
+ void post_fork () throw ()
208
+ {
209
+ #if EV_MULTIPLICITY
210
+ ev_loop_fork (EV_AX);
211
+ #else
212
+ ev_default_fork ();
213
+ #endif
214
+ }
215
+
216
+ unsigned int count () const throw ()
217
+ {
218
+ return ev_loop_count (EV_AX);
219
+ }
220
+
221
+ unsigned int backend () const throw ()
222
+ {
223
+ return ev_backend (EV_AX);
224
+ }
225
+
226
+ tstamp now () const throw ()
227
+ {
228
+ return ev_now (EV_AX);
229
+ }
230
+
231
+ void ref () throw ()
232
+ {
233
+ ev_ref (EV_AX);
234
+ }
235
+
236
+ void unref () throw ()
237
+ {
238
+ ev_unref (EV_AX);
239
+ }
240
+
241
+ void set_io_collect_interval (tstamp interval) throw ()
242
+ {
243
+ ev_set_io_collect_interval (EV_AX_ interval);
244
+ }
245
+
246
+ void set_timeout_collect_interval (tstamp interval) throw ()
247
+ {
248
+ ev_set_timeout_collect_interval (EV_AX_ interval);
249
+ }
250
+
251
+ // function callback
252
+ void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void* arg = 0) throw ()
253
+ {
254
+ ev_once (EV_AX_ fd, events, timeout, cb, arg);
255
+ }
256
+
257
+ // method callback
258
+ template<class K, void (K::*method)(int)>
259
+ void once (int fd, int events, tstamp timeout, K *object) throw ()
260
+ {
261
+ once (fd, events, timeout, method_thunk<K, method>, object);
262
+ }
263
+
264
+ template<class K, void (K::*method)(int)>
265
+ static void method_thunk (int revents, void* arg)
266
+ {
267
+ K *obj = static_cast<K *>(arg);
268
+ (obj->*method) (revents);
269
+ }
270
+
271
+ // const method callback
272
+ template<class K, void (K::*method)(int) const>
273
+ void once (int fd, int events, tstamp timeout, const K *object) throw ()
274
+ {
275
+ once (fd, events, timeout, const_method_thunk<K, method>, object);
276
+ }
277
+
278
+ template<class K, void (K::*method)(int) const>
279
+ static void const_method_thunk (int revents, void* arg)
280
+ {
281
+ K *obj = static_cast<K *>(arg);
282
+ (obj->*method) (revents);
283
+ }
284
+
285
+ // simple method callback
286
+ template<class K, void (K::*method)()>
287
+ void once (int fd, int events, tstamp timeout, K *object) throw ()
288
+ {
289
+ once (fd, events, timeout, method_noargs_thunk<K, method>, object);
290
+ }
291
+
292
+ template<class K, void (K::*method)()>
293
+ static void method_noargs_thunk (int revents, void* arg)
294
+ {
295
+ K *obj = static_cast<K *>(arg);
296
+ (obj->*method) ();
297
+ }
298
+
299
+ // simpler function callback
300
+ template<void (*cb)(int)>
301
+ void once (int fd, int events, tstamp timeout) throw ()
302
+ {
303
+ once (fd, events, timeout, simpler_func_thunk<cb>);
304
+ }
305
+
306
+ template<void (*cb)(int)>
307
+ static void simpler_func_thunk (int revents, void* arg)
308
+ {
309
+ (*cb) (revents);
310
+ }
311
+
312
+ // simplest function callback
313
+ template<void (*cb)()>
314
+ void once (int fd, int events, tstamp timeout) throw ()
315
+ {
316
+ once (fd, events, timeout, simplest_func_thunk<cb>);
317
+ }
318
+
319
+ template<void (*cb)()>
320
+ static void simplest_func_thunk (int revents, void* arg)
321
+ {
322
+ (*cb) ();
323
+ }
324
+
325
+ void feed_fd_event (int fd, int revents) throw ()
326
+ {
327
+ ev_feed_fd_event (EV_AX_ fd, revents);
328
+ }
329
+
330
+ void feed_signal_event (int signum) throw ()
331
+ {
332
+ ev_feed_signal_event (EV_AX_ signum);
333
+ }
334
+
335
+ #if EV_MULTIPLICITY
336
+ struct ev_loop* EV_AX;
337
+ #endif
338
+
339
+ };
340
+
341
+ #if EV_MULTIPLICITY
342
+ struct dynamic_loop : loop_ref
343
+ {
344
+
345
+ dynamic_loop (unsigned int flags = AUTO) throw (bad_loop)
346
+ : loop_ref (ev_loop_new (flags))
347
+ {
348
+ if (!EV_AX)
349
+ throw bad_loop ();
350
+ }
351
+
352
+ ~dynamic_loop () throw ()
353
+ {
354
+ ev_loop_destroy (EV_AX);
355
+ EV_AX = 0;
356
+ }
357
+
358
+ private:
359
+
360
+ dynamic_loop (const dynamic_loop &);
361
+
362
+ dynamic_loop & operator= (const dynamic_loop &);
363
+
364
+ };
365
+ #endif
366
+
367
+ struct default_loop : loop_ref
368
+ {
369
+ default_loop (unsigned int flags = AUTO) throw (bad_loop)
370
+ #if EV_MULTIPLICITY
371
+ : loop_ref (ev_default_loop (flags))
372
+ #endif
373
+ {
374
+ if (
375
+ #if EV_MULTIPLICITY
376
+ !EV_AX
377
+ #else
378
+ !ev_default_loop (flags)
379
+ #endif
380
+ )
381
+ throw bad_loop ();
382
+ }
383
+
384
+ ~default_loop () throw ()
385
+ {
386
+ ev_default_destroy ();
387
+ }
388
+
389
+ private:
390
+ default_loop (const default_loop &);
391
+ default_loop &operator = (const default_loop &);
392
+ };
393
+
394
+ inline loop_ref get_default_loop () throw ()
395
+ {
396
+ #if EV_MULTIPLICITY
397
+ return ev_default_loop (0);
398
+ #else
399
+ return loop_ref ();
400
+ #endif
401
+ }
402
+
403
+ #undef EV_AX
404
+ #undef EV_AX_
405
+
406
+ #undef EV_PX
407
+ #undef EV_PX_
408
+ #if EV_MULTIPLICITY
409
+ # define EV_PX loop_ref EV_A
410
+ # define EV_PX_ loop_ref EV_A_
411
+ #else
412
+ # define EV_PX
413
+ # define EV_PX_
414
+ #endif
415
+
416
+ template<class ev_watcher, class watcher>
417
+ struct base : ev_watcher
418
+ {
419
+ #if EV_MULTIPLICITY
420
+ EV_PX;
421
+
422
+ void set (EV_PX) throw ()
423
+ {
424
+ this->EV_A = EV_A;
425
+ }
426
+ #endif
427
+
428
+ base (EV_PX) throw ()
429
+ #if EV_MULTIPLICITY
430
+ : EV_A (EV_A)
431
+ #endif
432
+ {
433
+ ev_init (this, 0);
434
+ }
435
+
436
+ void set_ (void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) throw ()
437
+ {
438
+ this->data = data;
439
+ ev_set_cb (static_cast<ev_watcher *>(this), cb);
440
+ }
441
+
442
+ // method callback
443
+ template<class K, void (K::*method)(watcher &w, int)>
444
+ void set (K *object) throw ()
445
+ {
446
+ set_ (object, method_thunk<K, method>);
447
+ }
448
+
449
+ template<class K, void (K::*method)(watcher &w, int)>
450
+ static void method_thunk (EV_P_ ev_watcher *w, int revents)
451
+ {
452
+ K *obj = static_cast<K *>(w->data);
453
+ (obj->*method) (*static_cast<watcher *>(w), revents);
454
+ }
455
+
456
+ // const method callback
457
+ template<class K, void (K::*method)(watcher &w, int) const>
458
+ void set (const K *object) throw ()
459
+ {
460
+ set_ (object, const_method_thunk<K, method>);
461
+ }
462
+
463
+ template<class K, void (K::*method)(watcher &w, int) const>
464
+ static void const_method_thunk (EV_P_ ev_watcher *w, int revents)
465
+ {
466
+ K *obj = static_cast<K *>(w->data);
467
+ (static_cast<K *>(w->data)->*method) (*static_cast<watcher *>(w), revents);
468
+ }
469
+
470
+ // function callback
471
+ template<void (*function)(watcher &w, int)>
472
+ void set (void *data = 0) throw ()
473
+ {
474
+ set_ (data, function_thunk<function>);
475
+ }
476
+
477
+ template<void (*function)(watcher &w, int)>
478
+ static void function_thunk (EV_P_ ev_watcher *w, int revents)
479
+ {
480
+ function (*static_cast<watcher *>(w), revents);
481
+ }
482
+
483
+ // simple callback
484
+ template<class K, void (K::*method)()>
485
+ void set (K *object) throw ()
486
+ {
487
+ set_ (object, method_noargs_thunk<K, method>);
488
+ }
489
+
490
+ template<class K, void (K::*method)()>
491
+ static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents)
492
+ {
493
+ K *obj = static_cast<K *>(w->data);
494
+ (obj->*method) ();
495
+ }
496
+
497
+ void operator ()(int events = EV_UNDEF)
498
+ {
499
+ return ev_cb (static_cast<ev_watcher *>(this))
500
+ (static_cast<ev_watcher *>(this), events);
501
+ }
502
+
503
+ bool is_active () const throw ()
504
+ {
505
+ return ev_is_active (static_cast<const ev_watcher *>(this));
506
+ }
507
+
508
+ bool is_pending () const throw ()
509
+ {
510
+ return ev_is_pending (static_cast<const ev_watcher *>(this));
511
+ }
512
+
513
+ void feed_event (int revents) throw ()
514
+ {
515
+ ev_feed_event (EV_A_ static_cast<const ev_watcher *>(this), revents);
516
+ }
517
+ };
518
+
519
+ inline tstamp now () throw ()
520
+ {
521
+ return ev_time ();
522
+ }
523
+
524
+ inline void delay (tstamp interval) throw ()
525
+ {
526
+ ev_sleep (interval);
527
+ }
528
+
529
+ inline int version_major () throw ()
530
+ {
531
+ return ev_version_major ();
532
+ }
533
+
534
+ inline int version_minor () throw ()
535
+ {
536
+ return ev_version_minor ();
537
+ }
538
+
539
+ inline unsigned int supported_backends () throw ()
540
+ {
541
+ return ev_supported_backends ();
542
+ }
543
+
544
+ inline unsigned int recommended_backends () throw ()
545
+ {
546
+ return ev_recommended_backends ();
547
+ }
548
+
549
+ inline unsigned int embeddable_backends () throw ()
550
+ {
551
+ return ev_embeddable_backends ();
552
+ }
553
+
554
+ inline void set_allocator (void *(*cb)(void *ptr, long size)) throw ()
555
+ {
556
+ ev_set_allocator (cb);
557
+ }
558
+
559
+ inline void set_syserr_cb (void (*cb)(const char *msg)) throw ()
560
+ {
561
+ ev_set_syserr_cb (cb);
562
+ }
563
+
564
+ #if EV_MULTIPLICITY
565
+ #define EV_CONSTRUCT(cppstem,cstem) \
566
+ (EV_PX = get_default_loop ()) throw () \
567
+ : base<ev_ ## cstem, cppstem> (EV_A) \
568
+ { \
569
+ }
570
+ #else
571
+ #define EV_CONSTRUCT(cppstem,cstem) \
572
+ () throw () \
573
+ { \
574
+ }
575
+ #endif
576
+
577
+ /* using a template here would require quite a bit more lines,
578
+ * so a macro solution was chosen */
579
+ #define EV_BEGIN_WATCHER(cppstem,cstem) \
580
+ \
581
+ struct cppstem : base<ev_ ## cstem, cppstem> \
582
+ { \
583
+ void start () throw () \
584
+ { \
585
+ ev_ ## cstem ## _start (EV_A_ static_cast<ev_ ## cstem *>(this)); \
586
+ } \
587
+ \
588
+ void stop () throw () \
589
+ { \
590
+ ev_ ## cstem ## _stop (EV_A_ static_cast<ev_ ## cstem *>(this)); \
591
+ } \
592
+ \
593
+ cppstem EV_CONSTRUCT(cppstem,cstem) \
594
+ \
595
+ ~cppstem () throw () \
596
+ { \
597
+ stop (); \
598
+ } \
599
+ \
600
+ using base<ev_ ## cstem, cppstem>::set; \
601
+ \
602
+ private: \
603
+ \
604
+ cppstem (const cppstem &o); \
605
+ \
606
+ cppstem & operator =(const cppstem &o); \
607
+ \
608
+ public:
609
+
610
+ #define EV_END_WATCHER(cppstem,cstem) \
611
+ };
612
+
613
+ EV_BEGIN_WATCHER (io, io)
614
+ void set (int fd, int events) throw ()
615
+ {
616
+ int active = is_active ();
617
+ if (active) stop ();
618
+ ev_io_set (static_cast<ev_io *>(this), fd, events);
619
+ if (active) start ();
620
+ }
621
+
622
+ void set (int events) throw ()
623
+ {
624
+ int active = is_active ();
625
+ if (active) stop ();
626
+ ev_io_set (static_cast<ev_io *>(this), fd, events);
627
+ if (active) start ();
628
+ }
629
+
630
+ void start (int fd, int events) throw ()
631
+ {
632
+ set (fd, events);
633
+ start ();
634
+ }
635
+ EV_END_WATCHER (io, io)
636
+
637
+ EV_BEGIN_WATCHER (timer, timer)
638
+ void set (ev_tstamp after, ev_tstamp repeat = 0.) throw ()
639
+ {
640
+ int active = is_active ();
641
+ if (active) stop ();
642
+ ev_timer_set (static_cast<ev_timer *>(this), after, repeat);
643
+ if (active) start ();
644
+ }
645
+
646
+ void start (ev_tstamp after, ev_tstamp repeat = 0.) throw ()
647
+ {
648
+ set (after, repeat);
649
+ start ();
650
+ }
651
+
652
+ void again () throw ()
653
+ {
654
+ ev_timer_again (EV_A_ static_cast<ev_timer *>(this));
655
+ }
656
+ EV_END_WATCHER (timer, timer)
657
+
658
+ #if EV_PERIODIC_ENABLE
659
+ EV_BEGIN_WATCHER (periodic, periodic)
660
+ void set (ev_tstamp at, ev_tstamp interval = 0.) throw ()
661
+ {
662
+ int active = is_active ();
663
+ if (active) stop ();
664
+ ev_periodic_set (static_cast<ev_periodic *>(this), at, interval, 0);
665
+ if (active) start ();
666
+ }
667
+
668
+ void start (ev_tstamp at, ev_tstamp interval = 0.) throw ()
669
+ {
670
+ set (at, interval);
671
+ start ();
672
+ }
673
+
674
+ void again () throw ()
675
+ {
676
+ ev_periodic_again (EV_A_ static_cast<ev_periodic *>(this));
677
+ }
678
+ EV_END_WATCHER (periodic, periodic)
679
+ #endif
680
+
681
+ EV_BEGIN_WATCHER (sig, signal)
682
+ void set (int signum) throw ()
683
+ {
684
+ int active = is_active ();
685
+ if (active) stop ();
686
+ ev_signal_set (static_cast<ev_signal *>(this), signum);
687
+ if (active) start ();
688
+ }
689
+
690
+ void start (int signum) throw ()
691
+ {
692
+ set (signum);
693
+ start ();
694
+ }
695
+ EV_END_WATCHER (sig, signal)
696
+
697
+ EV_BEGIN_WATCHER (child, child)
698
+ void set (int pid, int trace = 0) throw ()
699
+ {
700
+ int active = is_active ();
701
+ if (active) stop ();
702
+ ev_child_set (static_cast<ev_child *>(this), pid, trace);
703
+ if (active) start ();
704
+ }
705
+
706
+ void start (int pid, int trace = 0) throw ()
707
+ {
708
+ set (pid, trace);
709
+ start ();
710
+ }
711
+ EV_END_WATCHER (child, child)
712
+
713
+ #if EV_STAT_ENABLE
714
+ EV_BEGIN_WATCHER (stat, stat)
715
+ void set (const char *path, ev_tstamp interval = 0.) throw ()
716
+ {
717
+ int active = is_active ();
718
+ if (active) stop ();
719
+ ev_stat_set (static_cast<ev_stat *>(this), path, interval);
720
+ if (active) start ();
721
+ }
722
+
723
+ void start (const char *path, ev_tstamp interval = 0.) throw ()
724
+ {
725
+ stop ();
726
+ set (path, interval);
727
+ start ();
728
+ }
729
+
730
+ void update () throw ()
731
+ {
732
+ ev_stat_stat (EV_A_ static_cast<ev_stat *>(this));
733
+ }
734
+ EV_END_WATCHER (stat, stat)
735
+ #endif
736
+
737
+ EV_BEGIN_WATCHER (idle, idle)
738
+ void set () throw () { }
739
+ EV_END_WATCHER (idle, idle)
740
+
741
+ EV_BEGIN_WATCHER (prepare, prepare)
742
+ void set () throw () { }
743
+ EV_END_WATCHER (prepare, prepare)
744
+
745
+ EV_BEGIN_WATCHER (check, check)
746
+ void set () throw () { }
747
+ EV_END_WATCHER (check, check)
748
+
749
+ #if EV_EMBED_ENABLE
750
+ EV_BEGIN_WATCHER (embed, embed)
751
+ void start (struct ev_loop *embedded_loop) throw ()
752
+ {
753
+ stop ();
754
+ ev_embed_set (static_cast<ev_embed *>(this), embedded_loop);
755
+ start ();
756
+ }
757
+
758
+ void sweep ()
759
+ {
760
+ ev_embed_sweep (EV_A_ static_cast<ev_embed *>(this));
761
+ }
762
+ EV_END_WATCHER (embed, embed)
763
+ #endif
764
+
765
+ #if EV_FORK_ENABLE
766
+ EV_BEGIN_WATCHER (fork, fork)
767
+ void set () throw () { }
768
+ EV_END_WATCHER (fork, fork)
769
+ #endif
770
+
771
+ #undef EV_PX
772
+ #undef EV_PX_
773
+ #undef EV_CONSTRUCT
774
+ #undef EV_BEGIN_WATCHER
775
+ #undef EV_END_WATCHER
776
+ }
777
+
778
+ #endif
779
+