The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / libev / ev.h @ 90fc8d36

History | View | Annotate | Download (20.7 KB)

1 c5183738 Ryan
/*
2
 * libev native API header
3
 *
4
 * Copyright (c) 2007,2008,2009 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 EV_H__
41
#define EV_H__
42
43
#ifdef __cplusplus
44
extern "C" {
45
#endif
46
47
typedef double ev_tstamp;
48
49
/* these priorities are inclusive, higher priorities will be called earlier */
50
#ifndef EV_MINPRI
51
# define EV_MINPRI -2
52
#endif
53
#ifndef EV_MAXPRI
54
# define EV_MAXPRI +2
55
#endif
56
57
#ifndef EV_MULTIPLICITY
58
# define EV_MULTIPLICITY 1
59
#endif
60
61
#ifndef EV_PERIODIC_ENABLE
62
# define EV_PERIODIC_ENABLE 1
63
#endif
64
65
#ifndef EV_STAT_ENABLE
66
# define EV_STAT_ENABLE 1
67
#endif
68
69
#ifndef EV_IDLE_ENABLE
70
# define EV_IDLE_ENABLE 1
71
#endif
72
73
#ifndef EV_FORK_ENABLE
74
# define EV_FORK_ENABLE 1
75
#endif
76
77
#ifndef EV_EMBED_ENABLE
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
88
#endif
89
90
/*****************************************************************************/
91
92
#if EV_STAT_ENABLE
93
# ifdef _WIN32
94
#  include <time.h>
95
#  include <sys/types.h>
96
# endif
97
# include <sys/stat.h>
98
#endif
99
100
/* support multiple event loops? */
101
#if EV_MULTIPLICITY
102
struct ev_loop;
103
# define EV_P struct ev_loop *loop
104
# define EV_P_ EV_P,
105
# define EV_A loop
106
# define EV_A_ EV_A,
107
# define EV_DEFAULT_UC ev_default_loop_uc ()
108
# define EV_DEFAULT_UC_ EV_DEFAULT_UC,
109
# define EV_DEFAULT ev_default_loop (0)
110
# define EV_DEFAULT_ EV_DEFAULT,
111
#else
112
# define EV_P void
113
# define EV_P_
114
# define EV_A
115
# define EV_A_
116
# define EV_DEFAULT
117
# define EV_DEFAULT_
118
# define EV_DEFAULT_UC
119
# define EV_DEFAULT_UC_
120
# undef EV_EMBED_ENABLE
121
#endif
122
123
#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3
124
# define EV_INLINE static inline
125
#else
126
# define EV_INLINE static
127
#endif
128
129
/*****************************************************************************/
130
131
/* eventmask, revents, events... */
132
#define EV_UNDEF            -1 /* guaranteed to be invalid */
133
#define EV_NONE           0x00 /* no events */
134
#define EV_READ           0x01 /* ev_io detected read will not block */
135
#define EV_WRITE          0x02 /* ev_io detected write will not block */
136
#define EV_IOFDSET        0x80 /* internal use only */
137
#define EV_TIMEOUT  0x00000100 /* timer timed out */
138
#define EV_PERIODIC 0x00000200 /* periodic timer timed out */
139
#define EV_SIGNAL   0x00000400 /* signal was received */
140
#define EV_CHILD    0x00000800 /* child/pid had status change */
141
#define EV_STAT     0x00001000 /* stat data changed */
142
#define EV_IDLE     0x00002000 /* event loop is idling */
143
#define EV_PREPARE  0x00004000 /* event loop about to poll */
144
#define EV_CHECK    0x00008000 /* event loop finished poll */
145
#define EV_EMBED    0x00010000 /* embedded event loop needs sweep */
146
#define EV_FORK     0x00020000 /* event loop resumed in child */
147
#define EV_ASYNC    0x00040000 /* async intra-loop signal */
148
#define EV_ERROR    0x80000000 /* sent when an error occurs */
149
150
/* can be used to add custom fields to all watchers, while losing binary compatibility */
151
#ifndef EV_COMMON
152
# define EV_COMMON void *data;
153
#endif
154
#ifndef EV_PROTOTYPES
155
# define EV_PROTOTYPES 1
156
#endif
157
158
#define EV_VERSION_MAJOR 3
159
#define EV_VERSION_MINOR 0
160
161
#ifndef EV_CB_DECLARE
162
# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents);
163
#endif
164
#ifndef EV_CB_INVOKE
165
# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents))
166
#endif
167
168
/*
169
 * struct member types:
170
 * private: you may look at them, but not change them,
171
 *          and they might not mean anything to you.
172
 * ro: can be read anytime, but only changed when the watcher isn't active.
173
 * rw: can be read and modified anytime, even when the watcher is active.
174
 *
175
 * some internal details that might be helpful for debugging:
176
 *
177
 * active is either 0, which means the watcher is not active,
178
 *           or the array index of the watcher (periodics, timers)
179
 *           or the array index + 1 (most other watchers)
180
 *           or simply 1 for watchers that aren't in some array.
181
 * pending is either 0, in which case the watcher isn't,
182
 *           or the array index + 1 in the pendings array.
183
 */
184
185
/* shared by all watchers */
186
#define EV_WATCHER(type)                        \
187
  int active; /* private */                        \
188
  int pending; /* private */                        \
189
  int priority; /* private */                        \
190
  EV_COMMON /* rw */                                \
191
  EV_CB_DECLARE (type) /* private */
192
193
#define EV_WATCHER_LIST(type)                        \
194
  EV_WATCHER (type)                                \
195
  struct ev_watcher_list *next; /* private */
196
197
#define EV_WATCHER_TIME(type)                        \
198
  EV_WATCHER (type)                                \
199
  ev_tstamp at;     /* private */
200
201
/* base class, nothing to see here unless you subclass */
202
typedef struct ev_watcher
203
{
204
  EV_WATCHER (ev_watcher)
205
} ev_watcher;
206
207
/* base class, nothing to see here unless you subclass */
208
typedef struct ev_watcher_list
209
{
210
  EV_WATCHER_LIST (ev_watcher_list)
211
} ev_watcher_list;
212
213
/* base class, nothing to see here unless you subclass */
214
typedef struct ev_watcher_time
215
{
216
  EV_WATCHER_TIME (ev_watcher_time)
217
} ev_watcher_time;
218
219
/* invoked when fd is either EV_READable or EV_WRITEable */
220
/* revent EV_READ, EV_WRITE */
221
typedef struct ev_io
222
{
223
  EV_WATCHER_LIST (ev_io)
224
225
  int fd;     /* ro */
226
  int events; /* ro */
227
} ev_io;
228
229
/* invoked after a specific time, repeatable (based on monotonic clock) */
230
/* revent EV_TIMEOUT */
231
typedef struct ev_timer
232
{
233
  EV_WATCHER_TIME (ev_timer)
234
235
  ev_tstamp repeat; /* rw */
236
} ev_timer;
237
238
/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */
239
/* revent EV_PERIODIC */
240
typedef struct ev_periodic
241
{
242
  EV_WATCHER_TIME (ev_periodic)
243
244
  ev_tstamp offset; /* rw */
245
  ev_tstamp interval; /* rw */
246
  ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now); /* rw */
247
} ev_periodic;
248
249
/* invoked when the given signal has been received */
250
/* revent EV_SIGNAL */
251
typedef struct ev_signal
252
{
253
  EV_WATCHER_LIST (ev_signal)
254
255
  int signum; /* ro */
256
} ev_signal;
257
258
/* invoked when sigchld is received and waitpid indicates the given pid */
259
/* revent EV_CHILD */
260
/* does not support priorities */
261
typedef struct ev_child
262
{
263
  EV_WATCHER_LIST (ev_child)
264
265
  int flags;   /* private */
266
  int pid;     /* ro */
267
  int rpid;    /* rw, holds the received pid */
268
  int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */
269
} ev_child;
270
271
#if EV_STAT_ENABLE
272
/* st_nlink = 0 means missing file or other error */
273
# ifdef _WIN32
274
typedef struct _stati64 ev_statdata;
275
# else
276
typedef struct stat ev_statdata;
277
# endif
278
279
/* invoked each time the stat data changes for a given path */
280
/* revent EV_STAT */
281
typedef struct ev_stat
282
{
283
  EV_WATCHER_LIST (ev_stat)
284
285
  ev_timer timer;     /* private */
286
  ev_tstamp interval; /* ro */
287
  const char *path;   /* ro */
288
  ev_statdata prev;   /* ro */
289
  ev_statdata attr;   /* ro */
290
291
  int wd; /* wd for inotify, fd for kqueue */
292
} ev_stat;
293
#endif
294
295
#if EV_IDLE_ENABLE
296
/* invoked when the nothing else needs to be done, keeps the process from blocking */
297
/* revent EV_IDLE */
298
typedef struct ev_idle
299
{
300
  EV_WATCHER (ev_idle)
301
} ev_idle;
302
#endif
303
304
/* invoked for each run of the mainloop, just before the blocking call */
305
/* you can still change events in any way you like */
306
/* revent EV_PREPARE */
307
typedef struct ev_prepare
308
{
309
  EV_WATCHER (ev_prepare)
310
} ev_prepare;
311
312
/* invoked for each run of the mainloop, just after the blocking call */
313
/* revent EV_CHECK */
314
typedef struct ev_check
315
{
316
  EV_WATCHER (ev_check)
317
} ev_check;
318
319
#if EV_FORK_ENABLE
320
/* the callback gets invoked before check in the child process when a fork was detected */
321
typedef struct ev_fork
322
{
323
  EV_WATCHER (ev_fork)
324
} ev_fork;
325
#endif
326
327
#if EV_EMBED_ENABLE
328
/* used to embed an event loop inside another */
329
/* the callback gets invoked when the event loop has handled events, and can be 0 */
330
typedef struct ev_embed
331
{
332
  EV_WATCHER (ev_embed)
333
334
  struct ev_loop *other; /* ro */
335
  ev_io io;              /* private */
336
  ev_prepare prepare;    /* private */
337
  ev_check check;        /* unused */
338
  ev_timer timer;        /* unused */
339
  ev_periodic periodic;  /* unused */
340
  ev_idle idle;          /* unused */
341
  ev_fork fork;          /* private */
342
} ev_embed;
343
#endif
344
345
#if EV_ASYNC_ENABLE
346
/* invoked when somebody calls ev_async_send on the watcher */
347
/* revent EV_ASYNC */
348
typedef struct ev_async
349
{
350
  EV_WATCHER (ev_async)
351
352
  EV_ATOMIC_T sent; /* private */
353
} ev_async;
354
355
# define ev_async_pending(w) ((w)->sent + 0)
356
#endif
357
358
/* the presence of this union forces similar struct layout */
359
union ev_any_watcher
360
{
361
  struct ev_watcher w;
362
  struct ev_watcher_list wl;
363
364
  struct ev_io io;
365
  struct ev_timer timer;
366
  struct ev_periodic periodic;
367
  struct ev_signal signal;
368
  struct ev_child child;
369
#if EV_STAT_ENABLE
370
  struct ev_stat stat;
371
#endif
372
#if EV_IDLE_ENABLE
373
  struct ev_idle idle;
374
#endif
375
  struct ev_prepare prepare;
376
  struct ev_check check;
377
#if EV_FORK_ENABLE
378
  struct ev_fork fork;
379
#endif
380
#if EV_EMBED_ENABLE
381
  struct ev_embed embed;
382
#endif
383
#if EV_ASYNC_ENABLE
384
  struct ev_async async;
385
#endif
386
};
387
388
/* bits for ev_default_loop and ev_loop_new */
389
/* the default */
390
#define EVFLAG_AUTO       0x00000000U /* not quite a mask */
391
/* flag bits */
392
#define EVFLAG_NOENV      0x01000000U /* do NOT consult environment */
393
#define EVFLAG_FORKCHECK  0x02000000U /* check for a fork in each iteration */
394
/* method bits to be ored together */
395
#define EVBACKEND_SELECT  0x00000001U /* about anywhere */
396
#define EVBACKEND_POLL    0x00000002U /* !win */
397
#define EVBACKEND_EPOLL   0x00000004U /* linux */
398
#define EVBACKEND_KQUEUE  0x00000008U /* bsd */
399
#define EVBACKEND_DEVPOLL 0x00000010U /* solaris 8 */ /* NYI */
400
#define EVBACKEND_PORT    0x00000020U /* solaris 10 */
401
402
#if EV_PROTOTYPES
403
int ev_version_major (void);
404
int ev_version_minor (void);
405
406
unsigned int ev_supported_backends (void);
407
unsigned int ev_recommended_backends (void);
408
unsigned int ev_embeddable_backends (void);
409
410
ev_tstamp ev_time (void);
411
void ev_sleep (ev_tstamp delay); /* sleep for a while */
412
413
/* Sets the allocation function to use, works like realloc.
414
 * It is used to allocate and free memory.
415
 * If it returns zero when memory needs to be allocated, the library might abort
416
 * or take some potentially destructive action.
417
 * The default is your system realloc function.
418
 */
419
void ev_set_allocator (void *(*cb)(void *ptr, long size));
420
421
/* set the callback function to call on a
422
 * retryable syscall error
423
 * (such as failed select, poll, epoll_wait)
424
 */
425
void ev_set_syserr_cb (void (*cb)(const char *msg));
426
427
#if EV_MULTIPLICITY
428
EV_INLINE struct ev_loop *
429
ev_default_loop_uc (void)
430
{
431
  extern struct ev_loop *ev_default_loop_ptr;
432
433
  return ev_default_loop_ptr;
434
}
435
436
/* the default loop is the only one that handles signals and child watchers */
437
/* you can call this as often as you like */
438
EV_INLINE struct ev_loop *
439
ev_default_loop (unsigned int flags)
440
{
441
  struct ev_loop *loop = ev_default_loop_uc ();
442
443
  if (!loop)
444
    {
445
      extern struct ev_loop *ev_default_loop_init (unsigned int flags);
446
447
      loop = ev_default_loop_init (flags);
448
    }
449
450
  return loop;
451
}
452
453
/* create and destroy alternative loops that don't handle signals */
454
struct ev_loop *ev_loop_new (unsigned int flags);
455
void ev_loop_destroy (EV_P);
456
void ev_loop_fork (EV_P);
457
void ev_loop_verify (EV_P);
458
459
ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
460
void ev_now_update (EV_P);
461
462
#else
463
464
int ev_default_loop (unsigned int flags); /* returns true when successful */
465
466
EV_INLINE ev_tstamp
467
ev_now (void)
468
{
469
  extern ev_tstamp ev_rt_now;
470
471
  return ev_rt_now;
472
}
473
#endif /* multiplicity */
474
475
EV_INLINE int
476
ev_is_default_loop (EV_P)
477
{
478
#if EV_MULTIPLICITY
479
  extern struct ev_loop *ev_default_loop_ptr;
480
481
  return !!(EV_A == ev_default_loop_ptr);
482
#else
483
  return 1;
484
#endif
485
}
486
487
void ev_default_destroy (void); /* destroy the default loop */
488
/* this needs to be called after fork, to duplicate the default loop */
489
/* if you create alternative loops you have to call ev_loop_fork on them */
490
/* you can call it in either the parent or the child */
491
/* you can actually call it at any time, anywhere :) */
492
void ev_default_fork (void);
493
494
unsigned int ev_backend (EV_P);    /* backend in use by loop */
495
unsigned int ev_loop_count (EV_P); /* number of loop iterations */
496
#endif /* prototypes */
497
498
#define EVLOOP_NONBLOCK        1 /* do not block/wait */
499
#define EVLOOP_ONESHOT        2 /* block *once* only */
500
#define EVUNLOOP_CANCEL 0 /* undo unloop */
501
#define EVUNLOOP_ONE    1 /* unloop once */
502
#define EVUNLOOP_ALL    2 /* unloop all loops */
503
504
#if EV_PROTOTYPES
505
void ev_loop (EV_P_ int flags);
506
void ev_unloop (EV_P_ int how); /* set to 1 to break out of event loop, set to 2 to break out of all event loops */
507
508
void ev_set_io_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
509
void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
510
511
/*
512
 * ref/unref can be used to add or remove a refcount on the mainloop. every watcher
513
 * keeps one reference. if you have a long-runing watcher you never unregister that
514
 * should not keep ev_loop from running, unref() after starting, and ref() before stopping.
515
 */
516
void ev_ref   (EV_P);
517
void ev_unref (EV_P);
518
519
/* convenience function, wait for a single event, without registering an event watcher */
520
/* if timeout is < 0, do wait indefinitely */
521
void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg);
522
#endif
523
524
/* these may evaluate ev multiple times, and the other arguments at most once */
525
/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */
526
#define ev_init(ev,cb_) do {                        \
527
  ((ev_watcher *)(void *)(ev))->active   =        \
528
  ((ev_watcher *)(void *)(ev))->pending  =        \
529
  ((ev_watcher *)(void *)(ev))->priority = 0;        \
530
  ev_set_cb ((ev), cb_);                        \
531
} while (0)
532
533
#define ev_io_set(ev,fd_,events_)           do { (ev)->fd = (fd_); (ev)->events = (events_) | EV_IOFDSET; } while (0)
534
#define ev_timer_set(ev,after_,repeat_)     do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0)
535
#define ev_periodic_set(ev,ofs_,ival_,res_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb= (res_); } while (0)
536
#define ev_signal_set(ev,signum_)           do { (ev)->signum = (signum_); } while (0)
537
#define ev_child_set(ev,pid_,trace_)        do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0)
538
#define ev_stat_set(ev,path_,interval_)     do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0)
539
#define ev_idle_set(ev)                     /* nop, yes, this is a serious in-joke */
540
#define ev_prepare_set(ev)                  /* nop, yes, this is a serious in-joke */
541
#define ev_check_set(ev)                    /* nop, yes, this is a serious in-joke */
542
#define ev_embed_set(ev,other_)             do { (ev)->other = (other_); } while (0)
543
#define ev_fork_set(ev)                     /* nop, yes, this is a serious in-joke */
544
#define ev_async_set(ev)                    do { (ev)->sent = 0; } while (0)
545
546
#define ev_io_init(ev,cb,fd,events)         do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)
547
#define ev_timer_init(ev,cb,after,repeat)   do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0)
548
#define ev_periodic_init(ev,cb,at,ival,res) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(at),(ival),(res)); } while (0)
549
#define ev_signal_init(ev,cb,signum)        do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0)
550
#define ev_child_init(ev,cb,pid,trace)      do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0)
551
#define ev_stat_init(ev,cb,path,interval)   do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0)
552
#define ev_idle_init(ev,cb)                 do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0)
553
#define ev_prepare_init(ev,cb)              do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0)
554
#define ev_check_init(ev,cb)                do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0)
555
#define ev_embed_init(ev,cb,other)          do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0)
556
#define ev_fork_init(ev,cb)                 do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0)
557
#define ev_async_init(ev,cb)                do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0)
558
559
#define ev_is_pending(ev)                   (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */
560
#define ev_is_active(ev)                    (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */
561
562
#define ev_priority(ev)                     ((((ev_watcher *)(void *)(ev))->priority) + 0)
563
#define ev_cb(ev)                           (ev)->cb /* rw */
564
#define ev_set_priority(ev,pri)             ((ev_watcher *)(void *)(ev))->priority = (pri)
565
566
#define ev_periodic_at(ev)                  (((ev_watcher_time *)(ev))->at + 0.)
567
568
#ifndef ev_set_cb
569
# define ev_set_cb(ev,cb_)                  ev_cb (ev) = (cb_)
570
#endif
571
572
/* stopping (enabling, adding) a watcher does nothing if it is already running */
573
/* stopping (disabling, deleting) a watcher does nothing unless its already running */
574
#if EV_PROTOTYPES
575
576
/* feeds an event into a watcher as if the event actually occured */
577
/* accepts any ev_watcher type */
578
void ev_feed_event     (EV_P_ void *w, int revents);
579
void ev_feed_fd_event  (EV_P_ int fd, int revents);
580
void ev_feed_signal_event (EV_P_ int signum);
581
void ev_invoke         (EV_P_ void *w, int revents);
582
int  ev_clear_pending  (EV_P_ void *w);
583
584
void ev_io_start       (EV_P_ ev_io *w);
585
void ev_io_stop        (EV_P_ ev_io *w);
586
587
void ev_timer_start    (EV_P_ ev_timer *w);
588
void ev_timer_stop     (EV_P_ ev_timer *w);
589
/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
590
void ev_timer_again    (EV_P_ ev_timer *w);
591
592
#if EV_PERIODIC_ENABLE
593
void ev_periodic_start (EV_P_ ev_periodic *w);
594
void ev_periodic_stop  (EV_P_ ev_periodic *w);
595
void ev_periodic_again (EV_P_ ev_periodic *w);
596
#endif
597
598
/* only supported in the default loop */
599
void ev_signal_start   (EV_P_ ev_signal *w);
600
void ev_signal_stop    (EV_P_ ev_signal *w);
601
602
/* only supported in the default loop */
603
void ev_child_start    (EV_P_ ev_child *w);
604
void ev_child_stop     (EV_P_ ev_child *w);
605
606
# if EV_STAT_ENABLE
607
void ev_stat_start     (EV_P_ ev_stat *w);
608
void ev_stat_stop      (EV_P_ ev_stat *w);
609
void ev_stat_stat      (EV_P_ ev_stat *w);
610
# endif
611
612
# if EV_IDLE_ENABLE
613
void ev_idle_start     (EV_P_ ev_idle *w);
614
void ev_idle_stop      (EV_P_ ev_idle *w);
615
# endif
616
617
void ev_prepare_start  (EV_P_ ev_prepare *w);
618
void ev_prepare_stop   (EV_P_ ev_prepare *w);
619
620
void ev_check_start    (EV_P_ ev_check *w);
621
void ev_check_stop     (EV_P_ ev_check *w);
622
623
# if EV_FORK_ENABLE
624
void ev_fork_start     (EV_P_ ev_fork *w);
625
void ev_fork_stop      (EV_P_ ev_fork *w);
626
# endif
627
628
# if EV_EMBED_ENABLE
629
/* only supported when loop to be embedded is in fact embeddable */
630
void ev_embed_start    (EV_P_ ev_embed *w);
631
void ev_embed_stop     (EV_P_ ev_embed *w);
632
void ev_embed_sweep    (EV_P_ ev_embed *w);
633
# endif
634
635
# if EV_ASYNC_ENABLE
636
void ev_async_start    (EV_P_ ev_async *w);
637
void ev_async_stop     (EV_P_ ev_async *w);
638
void ev_async_send     (EV_P_ ev_async *w);
639
# endif
640
641
#endif
642
643
#ifdef __cplusplus
644
}
645
#endif
646
647
#endif