1 | /* |
1 | /* |
|
|
2 | * libev native API header |
|
|
3 | * |
2 | * Copyright (c) 2007 Marc Alexander Lehmann <libev@schmorp.de> |
4 | * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de> |
3 | * All rights reserved. |
5 | * All rights reserved. |
4 | * |
6 | * |
5 | * Redistribution and use in source and binary forms, with or without |
7 | * Redistribution and use in source and binary forms, with or without modifica- |
6 | * modification, are permitted provided that the following conditions are |
8 | * tion, are permitted provided that the following conditions are met: |
7 | * 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. |
8 | * |
27 | * |
9 | * * Redistributions of source code must retain the above copyright |
28 | * Alternatively, the contents of this file may be used under the terms of |
10 | * notice, this list of conditions and the following disclaimer. |
29 | * the GNU General Public License ("GPL") version 2 or any later version, |
11 | * |
30 | * in which case the provisions of the GPL are applicable instead of |
12 | * * Redistributions in binary form must reproduce the above |
31 | * the above. If you wish to allow the use of your version of this file |
13 | * copyright notice, this list of conditions and the following |
32 | * only under the terms of the GPL and not to allow others to use your |
14 | * disclaimer in the documentation and/or other materials provided |
33 | * version of this file under the BSD license, indicate your decision |
15 | * with the distribution. |
34 | * by deleting the provisions above and replace them with the notice |
16 | * |
35 | * and other provisions required by the GPL. If you do not delete the |
17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
36 | * provisions above, a recipient may use your version of this file under |
18 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
37 | * either the BSD or the GPL. |
19 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
|
20 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
|
21 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
|
22 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
|
23 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
|
24 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
|
25 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
|
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
|
27 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
28 | */ |
38 | */ |
29 | |
39 | |
30 | #ifndef EV_H__ |
40 | #ifndef EV_H__ |
31 | #define EV_H__ |
41 | #define EV_H__ |
32 | |
42 | |
… | |
… | |
64 | # define EV_FORK_ENABLE 1 |
74 | # define EV_FORK_ENABLE 1 |
65 | #endif |
75 | #endif |
66 | |
76 | |
67 | #ifndef EV_EMBED_ENABLE |
77 | #ifndef EV_EMBED_ENABLE |
68 | # define EV_EMBED_ENABLE 1 |
78 | # define EV_EMBED_ENABLE 1 |
|
|
79 | #endif |
|
|
80 | |
|
|
81 | #ifndef EV_ASYNC_ENABLE |
|
|
82 | # define EV_ASYNC_ENABLE 1 |
|
|
83 | #endif |
|
|
84 | |
|
|
85 | #ifndef EV_ATOMIC_T |
|
|
86 | # include <signal.h> |
|
|
87 | # define EV_ATOMIC_T sig_atomic_t volatile |
69 | #endif |
88 | #endif |
70 | |
89 | |
71 | /*****************************************************************************/ |
90 | /*****************************************************************************/ |
72 | |
91 | |
73 | #if EV_STAT_ENABLE |
92 | #if EV_STAT_ENABLE |
… | |
… | |
108 | #define EV_IDLE 0x00002000L /* event loop is idling */ |
127 | #define EV_IDLE 0x00002000L /* event loop is idling */ |
109 | #define EV_PREPARE 0x00004000L /* event loop about to poll */ |
128 | #define EV_PREPARE 0x00004000L /* event loop about to poll */ |
110 | #define EV_CHECK 0x00008000L /* event loop finished poll */ |
129 | #define EV_CHECK 0x00008000L /* event loop finished poll */ |
111 | #define EV_EMBED 0x00010000L /* embedded event loop needs sweep */ |
130 | #define EV_EMBED 0x00010000L /* embedded event loop needs sweep */ |
112 | #define EV_FORK 0x00020000L /* event loop resumed in child */ |
131 | #define EV_FORK 0x00020000L /* event loop resumed in child */ |
|
|
132 | #define EV_ASYNC 0x00040000L /* async intra-loop signal */ |
113 | #define EV_ERROR 0x80000000L /* sent when an error occurs */ |
133 | #define EV_ERROR 0x80000000L /* sent when an error occurs */ |
114 | |
134 | |
115 | /* can be used to add custom fields to all watchers, while losing binary compatibility */ |
135 | /* can be used to add custom fields to all watchers, while losing binary compatibility */ |
116 | #ifndef EV_COMMON |
136 | #ifndef EV_COMMON |
117 | # define EV_COMMON void *data; |
137 | # define EV_COMMON void *data; |
118 | #endif |
138 | #endif |
119 | #ifndef EV_PROTOTYPES |
139 | #ifndef EV_PROTOTYPES |
120 | # define EV_PROTOTYPES 1 |
140 | # define EV_PROTOTYPES 1 |
121 | #endif |
141 | #endif |
122 | |
142 | |
123 | #define EV_VERSION_MAJOR 2 |
143 | #define EV_VERSION_MAJOR 3 |
124 | #define EV_VERSION_MINOR 0 |
144 | #define EV_VERSION_MINOR 0 |
125 | |
145 | |
126 | #ifndef EV_CB_DECLARE |
146 | #ifndef EV_CB_DECLARE |
127 | # define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); |
147 | # define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); |
128 | #endif |
148 | #endif |
… | |
… | |
215 | /* does not support priorities */ |
235 | /* does not support priorities */ |
216 | typedef struct ev_child |
236 | typedef struct ev_child |
217 | { |
237 | { |
218 | EV_WATCHER_LIST (ev_child) |
238 | EV_WATCHER_LIST (ev_child) |
219 | |
239 | |
|
|
240 | int flags; /* private */ |
220 | int pid; /* ro */ |
241 | int pid; /* ro */ |
221 | int rpid; /* rw, holds the received pid */ |
242 | int rpid; /* rw, holds the received pid */ |
222 | int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ |
243 | int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ |
223 | } ev_child; |
244 | } ev_child; |
224 | |
245 | |
… | |
… | |
294 | ev_idle idle; /* unused */ |
315 | ev_idle idle; /* unused */ |
295 | ev_fork fork; /* unused */ |
316 | ev_fork fork; /* unused */ |
296 | } ev_embed; |
317 | } ev_embed; |
297 | #endif |
318 | #endif |
298 | |
319 | |
|
|
320 | #if EV_ASYNC_ENABLE |
|
|
321 | /* invoked when somebody calls ev_async_send on the watcher */ |
|
|
322 | /* revent EV_ASYNC */ |
|
|
323 | typedef struct ev_async |
|
|
324 | { |
|
|
325 | EV_WATCHER (ev_async) |
|
|
326 | |
|
|
327 | EV_ATOMIC_T sent; /* private */ |
|
|
328 | } ev_async; |
|
|
329 | |
|
|
330 | # define ev_async_pending(w) (((w)->sent + 0) |
|
|
331 | #endif |
|
|
332 | |
299 | /* the presence of this union forces similar struct layout */ |
333 | /* the presence of this union forces similar struct layout */ |
300 | union ev_any_watcher |
334 | union ev_any_watcher |
301 | { |
335 | { |
302 | struct ev_watcher w; |
336 | struct ev_watcher w; |
303 | struct ev_watcher_list wl; |
337 | struct ev_watcher_list wl; |
… | |
… | |
318 | #if EV_FORK_ENABLE |
352 | #if EV_FORK_ENABLE |
319 | struct ev_fork fork; |
353 | struct ev_fork fork; |
320 | #endif |
354 | #endif |
321 | #if EV_EMBED_ENABLE |
355 | #if EV_EMBED_ENABLE |
322 | struct ev_embed embed; |
356 | struct ev_embed embed; |
|
|
357 | #endif |
|
|
358 | #if EV_ASYND_ENABLE |
|
|
359 | struct ev_async async; |
323 | #endif |
360 | #endif |
324 | }; |
361 | }; |
325 | |
362 | |
326 | /* bits for ev_default_loop and ev_loop_new */ |
363 | /* bits for ev_default_loop and ev_loop_new */ |
327 | /* the default */ |
364 | /* the default */ |
… | |
… | |
395 | |
432 | |
396 | return ev_rt_now; |
433 | return ev_rt_now; |
397 | } |
434 | } |
398 | # endif |
435 | # endif |
399 | |
436 | |
|
|
437 | static int |
|
|
438 | ev_is_default_loop (EV_P) |
|
|
439 | { |
|
|
440 | #if EV_MULTIPLICITY |
|
|
441 | extern struct ev_loop *ev_default_loop_ptr; |
|
|
442 | |
|
|
443 | return !!(EV_A == ev_default_loop_ptr); |
|
|
444 | #else |
|
|
445 | return 1; |
|
|
446 | #endif |
|
|
447 | } |
|
|
448 | |
400 | void ev_default_destroy (void); /* destroy the default loop */ |
449 | void ev_default_destroy (void); /* destroy the default loop */ |
401 | /* this needs to be called after fork, to duplicate the default loop */ |
450 | /* this needs to be called after fork, to duplicate the default loop */ |
402 | /* if you create alternative loops you have to call ev_loop_fork on them */ |
451 | /* if you create alternative loops you have to call ev_loop_fork on them */ |
403 | /* you can call it in either the parent or the child */ |
452 | /* you can call it in either the parent or the child */ |
404 | /* you can actually call it at any time, anywhere :) */ |
453 | /* you can actually call it at any time, anywhere :) */ |
… | |
… | |
445 | |
494 | |
446 | #define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV_IOFDSET; } while (0) |
495 | #define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV_IOFDSET; } while (0) |
447 | #define ev_timer_set(ev,after_,repeat_) do { (ev)->at = (after_); (ev)->repeat = (repeat_); } while (0) |
496 | #define ev_timer_set(ev,after_,repeat_) do { (ev)->at = (after_); (ev)->repeat = (repeat_); } while (0) |
448 | #define ev_periodic_set(ev,ofs_,ival_,res_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb= (res_); } while (0) |
497 | #define ev_periodic_set(ev,ofs_,ival_,res_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb= (res_); } while (0) |
449 | #define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) |
498 | #define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) |
450 | #define ev_child_set(ev,pid_) do { (ev)->pid = (pid_); } while (0) |
499 | #define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0) |
451 | #define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) |
500 | #define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) |
452 | #define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ |
501 | #define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ |
453 | #define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ |
502 | #define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ |
454 | #define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ |
503 | #define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ |
455 | #define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) |
504 | #define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) |
456 | #define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ |
505 | #define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ |
|
|
506 | #define ev_async_set(ev) do { (ev)->sent = 0; } while (0) |
457 | |
507 | |
458 | #define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) |
508 | #define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) |
459 | #define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) |
509 | #define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) |
460 | #define ev_periodic_init(ev,cb,at,ival,res) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(at),(ival),(res)); } while (0) |
510 | #define ev_periodic_init(ev,cb,at,ival,res) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(at),(ival),(res)); } while (0) |
461 | #define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) |
511 | #define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) |
462 | #define ev_child_init(ev,cb,pid) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid)); } while (0) |
512 | #define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0) |
463 | #define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) |
513 | #define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) |
464 | #define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) |
514 | #define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) |
465 | #define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) |
515 | #define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) |
466 | #define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) |
516 | #define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) |
467 | #define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) |
517 | #define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) |
468 | #define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) |
518 | #define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) |
|
|
519 | #define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0) |
469 | |
520 | |
470 | #define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ |
521 | #define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ |
471 | #define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ |
522 | #define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ |
472 | |
523 | |
473 | #define ev_priority(ev) ((((ev_watcher *)(void *)(ev))->priority) + 0) |
524 | #define ev_priority(ev) ((((ev_watcher *)(void *)(ev))->priority) + 0) |
… | |
… | |
539 | void ev_embed_start (EV_P_ ev_embed *w); |
590 | void ev_embed_start (EV_P_ ev_embed *w); |
540 | void ev_embed_stop (EV_P_ ev_embed *w); |
591 | void ev_embed_stop (EV_P_ ev_embed *w); |
541 | void ev_embed_sweep (EV_P_ ev_embed *w); |
592 | void ev_embed_sweep (EV_P_ ev_embed *w); |
542 | # endif |
593 | # endif |
543 | |
594 | |
|
|
595 | # if EV_ASYNC_ENABLE |
|
|
596 | void ev_async_start (EV_P_ ev_async *w); |
|
|
597 | void ev_async_stop (EV_P_ ev_async *w); |
|
|
598 | void ev_async_send (EV_P_ ev_async *w); |
|
|
599 | # endif |
|
|
600 | |
544 | #endif |
601 | #endif |
545 | |
602 | |
546 | #ifdef __cplusplus |
603 | #ifdef __cplusplus |
547 | } |
604 | } |
548 | #endif |
605 | #endif |