cool.io 1.0.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/test.yaml +54 -0
- data/.gitignore +30 -0
- data/.rspec +3 -0
- data/{CHANGES → CHANGES.md} +175 -79
- data/{README.markdown → README.md} +43 -49
- data/Rakefile +44 -69
- data/appveyor.yml +18 -0
- data/cool.io.gemspec +18 -131
- data/examples/callbacked_echo_server.rb +24 -0
- data/ext/cool.io/buffer.c +781 -0
- data/ext/cool.io/cool.io.h +13 -0
- data/ext/cool.io/cool.io_ext.c +1 -0
- data/ext/cool.io/ev_wrap.h +4 -2
- data/ext/cool.io/extconf.rb +27 -16
- data/ext/cool.io/iowatcher.c +17 -8
- data/ext/cool.io/loop.c +36 -84
- data/ext/cool.io/stat_watcher.c +103 -25
- data/ext/cool.io/timer_watcher.c +3 -3
- data/ext/cool.io/utils.c +5 -0
- data/ext/cool.io/watcher.h +1 -1
- data/ext/libev/Changes +152 -3
- data/ext/libev/LICENSE +2 -1
- data/ext/libev/README +8 -8
- data/ext/libev/ev.c +1719 -348
- data/ext/libev/ev.h +146 -118
- data/ext/libev/ev_epoll.c +71 -20
- data/ext/libev/ev_kqueue.c +36 -16
- data/ext/libev/ev_poll.c +14 -11
- data/ext/libev/ev_port.c +43 -18
- data/ext/libev/ev_select.c +82 -25
- data/ext/libev/ev_vars.h +28 -21
- data/ext/libev/ev_win32.c +19 -10
- data/ext/libev/ev_wrap.h +166 -152
- data/ext/libev/test_libev_win32.c +1 -1
- data/gems.rb +9 -0
- data/lib/cool.io/async_watcher.rb +1 -1
- data/lib/cool.io/custom_require.rb +9 -0
- data/lib/cool.io/dns_resolver.rb +30 -22
- data/lib/cool.io/dsl.rb +32 -28
- data/lib/cool.io/io.rb +55 -35
- data/lib/cool.io/iowatcher.rb +1 -1
- data/lib/cool.io/listener.rb +35 -17
- data/lib/cool.io/loop.rb +17 -25
- data/lib/cool.io/meta.rb +6 -5
- data/lib/cool.io/server.rb +5 -4
- data/lib/cool.io/socket.rb +41 -30
- data/lib/cool.io/timer_watcher.rb +1 -1
- data/lib/cool.io/version.rb +7 -0
- data/lib/cool.io.rb +11 -10
- data/lib/coolio.rb +1 -1
- data/libev_ruby_gil.diff +175 -0
- data/libev_win_select.diff +130 -0
- data/spec/async_watcher_spec.rb +5 -5
- data/spec/dns_spec.rb +27 -8
- data/spec/iobuffer_spec.rb +147 -0
- data/spec/spec_helper.rb +15 -1
- data/spec/stat_watcher_spec.rb +81 -0
- data/spec/tcp_server_spec.rb +225 -0
- data/spec/tcp_socket_spec.rb +185 -0
- data/spec/timer_watcher_spec.rb +23 -19
- data/spec/udp_socket_spec.rb +58 -0
- data/spec/unix_listener_spec.rb +8 -8
- data/spec/unix_server_spec.rb +10 -8
- metadata +109 -112
- data/VERSION +0 -1
- data/examples/httpclient.rb +0 -38
- data/ext/http11_client/.gitignore +0 -5
- data/ext/http11_client/LICENSE +0 -31
- data/ext/http11_client/ext_help.h +0 -14
- data/ext/http11_client/extconf.rb +0 -6
- data/ext/http11_client/http11_client.c +0 -300
- data/ext/http11_client/http11_parser.c +0 -403
- data/ext/http11_client/http11_parser.h +0 -48
- data/ext/http11_client/http11_parser.rl +0 -173
- data/lib/cool.io/eventmachine.rb +0 -234
- data/lib/cool.io/http_client.rb +0 -419
- data/lib/rev.rb +0 -4
- data/spec/possible_tests/schedules_other_threads.rb +0 -48
- data/spec/possible_tests/test_on_resolve_failed.rb +0 -9
- data/spec/possible_tests/test_resolves.rb +0 -27
- data/spec/possible_tests/test_write_during_resolve.rb +0 -27
- data/spec/possible_tests/works_straight.rb +0 -71
data/ext/libev/ev.h
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* libev native API header
|
|
3
3
|
*
|
|
4
|
-
* Copyright (c) 2007,2008,2009,2010 Marc Alexander Lehmann <libev@schmorp.de>
|
|
4
|
+
* Copyright (c) 2007,2008,2009,2010,2011,2012,2015 Marc Alexander Lehmann <libev@schmorp.de>
|
|
5
5
|
* All rights reserved.
|
|
6
6
|
*
|
|
7
7
|
* Redistribution and use in source and binary forms, with or without modifica-
|
|
8
8
|
* tion, are permitted provided that the following conditions are met:
|
|
9
|
-
*
|
|
9
|
+
*
|
|
10
10
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
11
11
|
* this list of conditions and the following disclaimer.
|
|
12
|
-
*
|
|
12
|
+
*
|
|
13
13
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
14
14
|
* notice, this list of conditions and the following disclaimer in the
|
|
15
15
|
* documentation and/or other materials provided with the distribution.
|
|
16
|
-
*
|
|
16
|
+
*
|
|
17
17
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
18
18
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
|
|
19
19
|
* CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
@@ -42,8 +42,14 @@
|
|
|
42
42
|
|
|
43
43
|
#ifdef __cplusplus
|
|
44
44
|
# define EV_CPP(x) x
|
|
45
|
+
# if __cplusplus >= 201103L
|
|
46
|
+
# define EV_THROW noexcept
|
|
47
|
+
# else
|
|
48
|
+
# define EV_THROW throw ()
|
|
49
|
+
# endif
|
|
45
50
|
#else
|
|
46
51
|
# define EV_CPP(x)
|
|
52
|
+
# define EV_THROW
|
|
47
53
|
#endif
|
|
48
54
|
|
|
49
55
|
EV_CPP(extern "C" {)
|
|
@@ -56,7 +62,11 @@ EV_CPP(extern "C" {)
|
|
|
56
62
|
#endif
|
|
57
63
|
|
|
58
64
|
#ifndef EV_FEATURES
|
|
59
|
-
#
|
|
65
|
+
# if defined __OPTIMIZE_SIZE__
|
|
66
|
+
# define EV_FEATURES 0x7c
|
|
67
|
+
# else
|
|
68
|
+
# define EV_FEATURES 0x7f
|
|
69
|
+
# endif
|
|
60
70
|
#endif
|
|
61
71
|
|
|
62
72
|
#define EV_FEATURE_CODE ((EV_FEATURES) & 1)
|
|
@@ -142,6 +152,8 @@ EV_CPP(extern "C" {)
|
|
|
142
152
|
|
|
143
153
|
typedef double ev_tstamp;
|
|
144
154
|
|
|
155
|
+
#include <string.h> /* for memmove */
|
|
156
|
+
|
|
145
157
|
#ifndef EV_ATOMIC_T
|
|
146
158
|
# include <signal.h>
|
|
147
159
|
# define EV_ATOMIC_T sig_atomic_t volatile
|
|
@@ -185,7 +197,13 @@ struct ev_loop;
|
|
|
185
197
|
# define EV_INLINE static
|
|
186
198
|
#endif
|
|
187
199
|
|
|
188
|
-
|
|
200
|
+
#ifdef EV_API_STATIC
|
|
201
|
+
# define EV_API_DECL static
|
|
202
|
+
#else
|
|
203
|
+
# define EV_API_DECL extern
|
|
204
|
+
#endif
|
|
205
|
+
|
|
206
|
+
/* EV_PROTOTYPES can be used to switch of prototype declarations */
|
|
189
207
|
#ifndef EV_PROTOTYPES
|
|
190
208
|
# define EV_PROTOTYPES 1
|
|
191
209
|
#endif
|
|
@@ -193,33 +211,33 @@ struct ev_loop;
|
|
|
193
211
|
/*****************************************************************************/
|
|
194
212
|
|
|
195
213
|
#define EV_VERSION_MAJOR 4
|
|
196
|
-
#define EV_VERSION_MINOR
|
|
214
|
+
#define EV_VERSION_MINOR 24
|
|
197
215
|
|
|
198
216
|
/* eventmask, revents, events... */
|
|
199
217
|
enum {
|
|
200
|
-
EV_UNDEF = 0xFFFFFFFF, /* guaranteed to be invalid */
|
|
201
|
-
EV_NONE =
|
|
202
|
-
EV_READ =
|
|
203
|
-
EV_WRITE =
|
|
204
|
-
EV__IOFDSET =
|
|
205
|
-
EV_IO =
|
|
206
|
-
EV_TIMER =
|
|
218
|
+
EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */
|
|
219
|
+
EV_NONE = 0x00, /* no events */
|
|
220
|
+
EV_READ = 0x01, /* ev_io detected read will not block */
|
|
221
|
+
EV_WRITE = 0x02, /* ev_io detected write will not block */
|
|
222
|
+
EV__IOFDSET = 0x80, /* internal use only */
|
|
223
|
+
EV_IO = EV_READ, /* alias for type-detection */
|
|
224
|
+
EV_TIMER = 0x00000100, /* timer timed out */
|
|
207
225
|
#if EV_COMPAT3
|
|
208
|
-
EV_TIMEOUT =
|
|
209
|
-
#endif
|
|
210
|
-
EV_PERIODIC =
|
|
211
|
-
EV_SIGNAL =
|
|
212
|
-
EV_CHILD =
|
|
213
|
-
EV_STAT =
|
|
214
|
-
EV_IDLE =
|
|
215
|
-
EV_PREPARE =
|
|
216
|
-
EV_CHECK =
|
|
217
|
-
EV_EMBED =
|
|
218
|
-
EV_FORK =
|
|
219
|
-
EV_CLEANUP =
|
|
220
|
-
EV_ASYNC =
|
|
221
|
-
EV_CUSTOM =
|
|
222
|
-
EV_ERROR = 0x80000000 /* sent when an error occurs */
|
|
226
|
+
EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */
|
|
227
|
+
#endif
|
|
228
|
+
EV_PERIODIC = 0x00000200, /* periodic timer timed out */
|
|
229
|
+
EV_SIGNAL = 0x00000400, /* signal was received */
|
|
230
|
+
EV_CHILD = 0x00000800, /* child/pid had status change */
|
|
231
|
+
EV_STAT = 0x00001000, /* stat data changed */
|
|
232
|
+
EV_IDLE = 0x00002000, /* event loop is idling */
|
|
233
|
+
EV_PREPARE = 0x00004000, /* event loop about to poll */
|
|
234
|
+
EV_CHECK = 0x00008000, /* event loop finished poll */
|
|
235
|
+
EV_EMBED = 0x00010000, /* embedded event loop needs sweep */
|
|
236
|
+
EV_FORK = 0x00020000, /* event loop resumed in child */
|
|
237
|
+
EV_CLEANUP = 0x00040000, /* event loop resumed in child */
|
|
238
|
+
EV_ASYNC = 0x00080000, /* async intra-loop signal */
|
|
239
|
+
EV_CUSTOM = 0x01000000, /* for use by user code */
|
|
240
|
+
EV_ERROR = (int)0x80000000 /* sent when an error occurs */
|
|
223
241
|
};
|
|
224
242
|
|
|
225
243
|
/* can be used to add custom fields to all watchers, while losing binary compatibility */
|
|
@@ -321,7 +339,7 @@ typedef struct ev_periodic
|
|
|
321
339
|
|
|
322
340
|
ev_tstamp offset; /* rw */
|
|
323
341
|
ev_tstamp interval; /* rw */
|
|
324
|
-
ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now); /* rw */
|
|
342
|
+
ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_THROW; /* rw */
|
|
325
343
|
} ev_periodic;
|
|
326
344
|
|
|
327
345
|
/* invoked when the given signal has been received */
|
|
@@ -491,30 +509,32 @@ enum {
|
|
|
491
509
|
#if EV_COMPAT3
|
|
492
510
|
EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */
|
|
493
511
|
#endif
|
|
494
|
-
EVFLAG_SIGNALFD = 0x00200000U
|
|
512
|
+
EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */
|
|
513
|
+
EVFLAG_NOSIGMASK = 0x00400000U /* avoid modifying the signal mask */
|
|
495
514
|
};
|
|
496
515
|
|
|
497
516
|
/* method bits to be ored together */
|
|
498
517
|
enum {
|
|
499
|
-
EVBACKEND_SELECT = 0x00000001U, /* about anywhere */
|
|
500
|
-
EVBACKEND_POLL = 0x00000002U, /* !win */
|
|
518
|
+
EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */
|
|
519
|
+
EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */
|
|
501
520
|
EVBACKEND_EPOLL = 0x00000004U, /* linux */
|
|
502
|
-
EVBACKEND_KQUEUE = 0x00000008U, /* bsd */
|
|
521
|
+
EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */
|
|
503
522
|
EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */
|
|
504
523
|
EVBACKEND_PORT = 0x00000020U, /* solaris 10 */
|
|
505
|
-
EVBACKEND_ALL = 0x0000003FU
|
|
524
|
+
EVBACKEND_ALL = 0x0000003FU, /* all known backends */
|
|
525
|
+
EVBACKEND_MASK = 0x0000FFFFU /* all future backends */
|
|
506
526
|
};
|
|
507
527
|
|
|
508
528
|
#if EV_PROTOTYPES
|
|
509
|
-
int ev_version_major (void);
|
|
510
|
-
int ev_version_minor (void);
|
|
529
|
+
EV_API_DECL int ev_version_major (void) EV_THROW;
|
|
530
|
+
EV_API_DECL int ev_version_minor (void) EV_THROW;
|
|
511
531
|
|
|
512
|
-
unsigned int ev_supported_backends (void);
|
|
513
|
-
unsigned int ev_recommended_backends (void);
|
|
514
|
-
unsigned int ev_embeddable_backends (void);
|
|
532
|
+
EV_API_DECL unsigned int ev_supported_backends (void) EV_THROW;
|
|
533
|
+
EV_API_DECL unsigned int ev_recommended_backends (void) EV_THROW;
|
|
534
|
+
EV_API_DECL unsigned int ev_embeddable_backends (void) EV_THROW;
|
|
515
535
|
|
|
516
|
-
ev_tstamp ev_time (void);
|
|
517
|
-
void ev_sleep (ev_tstamp delay); /* sleep for a while */
|
|
536
|
+
EV_API_DECL ev_tstamp ev_time (void) EV_THROW;
|
|
537
|
+
EV_API_DECL void ev_sleep (ev_tstamp delay) EV_THROW; /* sleep for a while */
|
|
518
538
|
|
|
519
539
|
/* Sets the allocation function to use, works like realloc.
|
|
520
540
|
* It is used to allocate and free memory.
|
|
@@ -522,22 +542,26 @@ void ev_sleep (ev_tstamp delay); /* sleep for a while */
|
|
|
522
542
|
* or take some potentially destructive action.
|
|
523
543
|
* The default is your system realloc function.
|
|
524
544
|
*/
|
|
525
|
-
void ev_set_allocator (void *(*cb)(void *ptr, long size));
|
|
545
|
+
EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW;
|
|
526
546
|
|
|
527
547
|
/* set the callback function to call on a
|
|
528
548
|
* retryable syscall error
|
|
529
549
|
* (such as failed select, poll, epoll_wait)
|
|
530
550
|
*/
|
|
531
|
-
void ev_set_syserr_cb (void (*cb)(const char *msg));
|
|
551
|
+
EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW;
|
|
532
552
|
|
|
533
553
|
#if EV_MULTIPLICITY
|
|
534
554
|
|
|
535
555
|
/* the default loop is the only one that handles signals and child watchers */
|
|
536
556
|
/* you can call this as often as you like */
|
|
537
|
-
struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0));
|
|
557
|
+
EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW;
|
|
558
|
+
|
|
559
|
+
#ifdef EV_API_STATIC
|
|
560
|
+
EV_API_DECL struct ev_loop *ev_default_loop_ptr;
|
|
561
|
+
#endif
|
|
538
562
|
|
|
539
563
|
EV_INLINE struct ev_loop *
|
|
540
|
-
ev_default_loop_uc_ (void)
|
|
564
|
+
ev_default_loop_uc_ (void) EV_THROW
|
|
541
565
|
{
|
|
542
566
|
extern struct ev_loop *ev_default_loop_ptr;
|
|
543
567
|
|
|
@@ -545,31 +569,31 @@ ev_default_loop_uc_ (void)
|
|
|
545
569
|
}
|
|
546
570
|
|
|
547
571
|
EV_INLINE int
|
|
548
|
-
ev_is_default_loop (EV_P)
|
|
572
|
+
ev_is_default_loop (EV_P) EV_THROW
|
|
549
573
|
{
|
|
550
574
|
return EV_A == EV_DEFAULT_UC;
|
|
551
575
|
}
|
|
552
576
|
|
|
553
577
|
/* create and destroy alternative loops that don't handle signals */
|
|
554
|
-
struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0));
|
|
578
|
+
EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_THROW;
|
|
555
579
|
|
|
556
|
-
ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
|
|
580
|
+
EV_API_DECL ev_tstamp ev_now (EV_P) EV_THROW; /* time w.r.t. timers and the eventloop, updated after each poll */
|
|
557
581
|
|
|
558
582
|
#else
|
|
559
583
|
|
|
560
|
-
int ev_default_loop (unsigned int flags EV_CPP (= 0)); /* returns true when successful */
|
|
584
|
+
EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW; /* returns true when successful */
|
|
585
|
+
|
|
586
|
+
EV_API_DECL ev_tstamp ev_rt_now;
|
|
561
587
|
|
|
562
588
|
EV_INLINE ev_tstamp
|
|
563
|
-
ev_now (void)
|
|
589
|
+
ev_now (void) EV_THROW
|
|
564
590
|
{
|
|
565
|
-
extern ev_tstamp ev_rt_now;
|
|
566
|
-
|
|
567
591
|
return ev_rt_now;
|
|
568
592
|
}
|
|
569
593
|
|
|
570
594
|
/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */
|
|
571
595
|
EV_INLINE int
|
|
572
|
-
ev_is_default_loop (void)
|
|
596
|
+
ev_is_default_loop (void) EV_THROW
|
|
573
597
|
{
|
|
574
598
|
return 1;
|
|
575
599
|
}
|
|
@@ -577,23 +601,23 @@ ev_is_default_loop (void)
|
|
|
577
601
|
#endif /* multiplicity */
|
|
578
602
|
|
|
579
603
|
/* destroy event loops, also works for the default loop */
|
|
580
|
-
void ev_loop_destroy (EV_P);
|
|
604
|
+
EV_API_DECL void ev_loop_destroy (EV_P);
|
|
581
605
|
|
|
582
606
|
/* this needs to be called after fork, to duplicate the loop */
|
|
583
607
|
/* when you want to re-use it in the child */
|
|
584
608
|
/* you can call it in either the parent or the child */
|
|
585
609
|
/* you can actually call it at any time, anywhere :) */
|
|
586
|
-
void ev_loop_fork (EV_P);
|
|
610
|
+
EV_API_DECL void ev_loop_fork (EV_P) EV_THROW;
|
|
587
611
|
|
|
588
|
-
unsigned int ev_backend (EV_P); /* backend in use by loop */
|
|
612
|
+
EV_API_DECL unsigned int ev_backend (EV_P) EV_THROW; /* backend in use by loop */
|
|
589
613
|
|
|
590
|
-
void ev_now_update (EV_P); /* update event loop time */
|
|
614
|
+
EV_API_DECL void ev_now_update (EV_P) EV_THROW; /* update event loop time */
|
|
591
615
|
|
|
592
616
|
#if EV_WALK_ENABLE
|
|
593
617
|
/* walk (almost) all watchers in the loop of a given type, invoking the */
|
|
594
618
|
/* callback on every such watcher. The callback might stop the watcher, */
|
|
595
619
|
/* but do nothing else with the loop */
|
|
596
|
-
void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w));
|
|
620
|
+
EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW;
|
|
597
621
|
#endif
|
|
598
622
|
|
|
599
623
|
#endif /* prototypes */
|
|
@@ -612,45 +636,47 @@ enum {
|
|
|
612
636
|
};
|
|
613
637
|
|
|
614
638
|
#if EV_PROTOTYPES
|
|
615
|
-
|
|
616
|
-
void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)); /* break out of the loop */
|
|
639
|
+
EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0));
|
|
640
|
+
EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_THROW; /* break out of the loop */
|
|
617
641
|
|
|
618
642
|
/*
|
|
619
643
|
* ref/unref can be used to add or remove a refcount on the mainloop. every watcher
|
|
620
644
|
* keeps one reference. if you have a long-running watcher you never unregister that
|
|
621
645
|
* should not keep ev_loop from running, unref() after starting, and ref() before stopping.
|
|
622
646
|
*/
|
|
623
|
-
void ev_ref (EV_P);
|
|
624
|
-
void ev_unref (EV_P);
|
|
647
|
+
EV_API_DECL void ev_ref (EV_P) EV_THROW;
|
|
648
|
+
EV_API_DECL void ev_unref (EV_P) EV_THROW;
|
|
625
649
|
|
|
626
650
|
/*
|
|
627
651
|
* convenience function, wait for a single event, without registering an event watcher
|
|
628
652
|
* if timeout is < 0, do wait indefinitely
|
|
629
653
|
*/
|
|
630
|
-
void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg);
|
|
654
|
+
EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_THROW;
|
|
631
655
|
|
|
632
656
|
# if EV_FEATURE_API
|
|
633
|
-
unsigned int ev_iteration (EV_P); /* number of loop iterations */
|
|
634
|
-
unsigned int ev_depth (EV_P); /* #ev_loop enters - #ev_loop leaves */
|
|
635
|
-
void ev_verify (EV_P); /* abort if loop data corrupted */
|
|
657
|
+
EV_API_DECL unsigned int ev_iteration (EV_P) EV_THROW; /* number of loop iterations */
|
|
658
|
+
EV_API_DECL unsigned int ev_depth (EV_P) EV_THROW; /* #ev_loop enters - #ev_loop leaves */
|
|
659
|
+
EV_API_DECL void ev_verify (EV_P) EV_THROW; /* abort if loop data corrupted */
|
|
636
660
|
|
|
637
|
-
void ev_set_io_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
|
|
638
|
-
void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
|
|
661
|
+
EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */
|
|
662
|
+
EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */
|
|
639
663
|
|
|
640
664
|
/* advanced stuff for threading etc. support, see docs */
|
|
641
|
-
void ev_set_userdata (EV_P_ void *data);
|
|
642
|
-
void *ev_userdata (EV_P);
|
|
643
|
-
|
|
644
|
-
void
|
|
665
|
+
EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_THROW;
|
|
666
|
+
EV_API_DECL void *ev_userdata (EV_P) EV_THROW;
|
|
667
|
+
typedef void (*ev_loop_callback)(EV_P);
|
|
668
|
+
EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW;
|
|
669
|
+
/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */
|
|
670
|
+
EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW;
|
|
645
671
|
|
|
646
|
-
unsigned int ev_pending_count (EV_P); /* number of pending events, if any */
|
|
647
|
-
void ev_invoke_pending (EV_P); /* invoke all pending watchers */
|
|
672
|
+
EV_API_DECL unsigned int ev_pending_count (EV_P) EV_THROW; /* number of pending events, if any */
|
|
673
|
+
EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */
|
|
648
674
|
|
|
649
675
|
/*
|
|
650
676
|
* stop/start the timer handling.
|
|
651
677
|
*/
|
|
652
|
-
void ev_suspend (EV_P);
|
|
653
|
-
void ev_resume (EV_P);
|
|
678
|
+
EV_API_DECL void ev_suspend (EV_P) EV_THROW;
|
|
679
|
+
EV_API_DECL void ev_resume (EV_P) EV_THROW;
|
|
654
680
|
#endif
|
|
655
681
|
|
|
656
682
|
#endif
|
|
@@ -695,7 +721,8 @@ void ev_resume (EV_P);
|
|
|
695
721
|
#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */
|
|
696
722
|
#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */
|
|
697
723
|
|
|
698
|
-
#define
|
|
724
|
+
#define ev_cb_(ev) (ev)->cb /* rw */
|
|
725
|
+
#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb)
|
|
699
726
|
|
|
700
727
|
#if EV_MINPRI == EV_MAXPRI
|
|
701
728
|
# define ev_priority(ev) ((ev), EV_MINPRI)
|
|
@@ -708,93 +735,94 @@ void ev_resume (EV_P);
|
|
|
708
735
|
#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at)
|
|
709
736
|
|
|
710
737
|
#ifndef ev_set_cb
|
|
711
|
-
# define ev_set_cb(ev,cb_)
|
|
738
|
+
# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev))))
|
|
712
739
|
#endif
|
|
713
740
|
|
|
714
741
|
/* stopping (enabling, adding) a watcher does nothing if it is already running */
|
|
715
|
-
/* stopping (disabling, deleting) a watcher does nothing unless
|
|
742
|
+
/* stopping (disabling, deleting) a watcher does nothing unless it's already running */
|
|
716
743
|
#if EV_PROTOTYPES
|
|
717
744
|
|
|
718
|
-
/* feeds an event into a watcher as if the event actually
|
|
745
|
+
/* feeds an event into a watcher as if the event actually occurred */
|
|
719
746
|
/* accepts any ev_watcher type */
|
|
720
|
-
void ev_feed_event (EV_P_ void *w, int revents);
|
|
721
|
-
void ev_feed_fd_event (EV_P_ int fd, int revents);
|
|
747
|
+
EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_THROW;
|
|
748
|
+
EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW;
|
|
722
749
|
#if EV_SIGNAL_ENABLE
|
|
723
|
-
void
|
|
750
|
+
EV_API_DECL void ev_feed_signal (int signum) EV_THROW;
|
|
751
|
+
EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_THROW;
|
|
724
752
|
#endif
|
|
725
|
-
void ev_invoke (EV_P_ void *w, int revents);
|
|
726
|
-
int ev_clear_pending (EV_P_ void *w);
|
|
753
|
+
EV_API_DECL void ev_invoke (EV_P_ void *w, int revents);
|
|
754
|
+
EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_THROW;
|
|
727
755
|
|
|
728
|
-
void ev_io_start (EV_P_ ev_io *w);
|
|
729
|
-
void ev_io_stop (EV_P_ ev_io *w);
|
|
756
|
+
EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_THROW;
|
|
757
|
+
EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_THROW;
|
|
730
758
|
|
|
731
|
-
void ev_timer_start (EV_P_ ev_timer *w);
|
|
732
|
-
void ev_timer_stop (EV_P_ ev_timer *w);
|
|
759
|
+
EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_THROW;
|
|
760
|
+
EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_THROW;
|
|
733
761
|
/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
|
|
734
|
-
void ev_timer_again (EV_P_ ev_timer *w);
|
|
762
|
+
EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_THROW;
|
|
735
763
|
/* return remaining time */
|
|
736
|
-
ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w);
|
|
764
|
+
EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW;
|
|
737
765
|
|
|
738
766
|
#if EV_PERIODIC_ENABLE
|
|
739
|
-
void ev_periodic_start (EV_P_ ev_periodic *w);
|
|
740
|
-
void ev_periodic_stop (EV_P_ ev_periodic *w);
|
|
741
|
-
void ev_periodic_again (EV_P_ ev_periodic *w);
|
|
767
|
+
EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW;
|
|
768
|
+
EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW;
|
|
769
|
+
EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW;
|
|
742
770
|
#endif
|
|
743
771
|
|
|
744
772
|
/* only supported in the default loop */
|
|
745
773
|
#if EV_SIGNAL_ENABLE
|
|
746
|
-
void ev_signal_start (EV_P_ ev_signal *w);
|
|
747
|
-
void ev_signal_stop (EV_P_ ev_signal *w);
|
|
774
|
+
EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_THROW;
|
|
775
|
+
EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_THROW;
|
|
748
776
|
#endif
|
|
749
777
|
|
|
750
778
|
/* only supported in the default loop */
|
|
751
779
|
# if EV_CHILD_ENABLE
|
|
752
|
-
void ev_child_start (EV_P_ ev_child *w);
|
|
753
|
-
void ev_child_stop (EV_P_ ev_child *w);
|
|
780
|
+
EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_THROW;
|
|
781
|
+
EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_THROW;
|
|
754
782
|
# endif
|
|
755
783
|
|
|
756
784
|
# if EV_STAT_ENABLE
|
|
757
|
-
void ev_stat_start (EV_P_ ev_stat *w);
|
|
758
|
-
void ev_stat_stop (EV_P_ ev_stat *w);
|
|
759
|
-
void ev_stat_stat (EV_P_ ev_stat *w);
|
|
785
|
+
EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_THROW;
|
|
786
|
+
EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_THROW;
|
|
787
|
+
EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_THROW;
|
|
760
788
|
# endif
|
|
761
789
|
|
|
762
790
|
# if EV_IDLE_ENABLE
|
|
763
|
-
void ev_idle_start (EV_P_ ev_idle *w);
|
|
764
|
-
void ev_idle_stop (EV_P_ ev_idle *w);
|
|
791
|
+
EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_THROW;
|
|
792
|
+
EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_THROW;
|
|
765
793
|
# endif
|
|
766
794
|
|
|
767
795
|
#if EV_PREPARE_ENABLE
|
|
768
|
-
void ev_prepare_start (EV_P_ ev_prepare *w);
|
|
769
|
-
void ev_prepare_stop (EV_P_ ev_prepare *w);
|
|
796
|
+
EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_THROW;
|
|
797
|
+
EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW;
|
|
770
798
|
#endif
|
|
771
799
|
|
|
772
800
|
#if EV_CHECK_ENABLE
|
|
773
|
-
void ev_check_start (EV_P_ ev_check *w);
|
|
774
|
-
void ev_check_stop (EV_P_ ev_check *w);
|
|
801
|
+
EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_THROW;
|
|
802
|
+
EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_THROW;
|
|
775
803
|
#endif
|
|
776
804
|
|
|
777
805
|
# if EV_FORK_ENABLE
|
|
778
|
-
void ev_fork_start (EV_P_ ev_fork *w);
|
|
779
|
-
void ev_fork_stop (EV_P_ ev_fork *w);
|
|
806
|
+
EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_THROW;
|
|
807
|
+
EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_THROW;
|
|
780
808
|
# endif
|
|
781
809
|
|
|
782
810
|
# if EV_CLEANUP_ENABLE
|
|
783
|
-
void ev_cleanup_start (EV_P_ ev_cleanup *w);
|
|
784
|
-
void ev_cleanup_stop (EV_P_ ev_cleanup *w);
|
|
811
|
+
EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW;
|
|
812
|
+
EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW;
|
|
785
813
|
# endif
|
|
786
814
|
|
|
787
815
|
# if EV_EMBED_ENABLE
|
|
788
816
|
/* only supported when loop to be embedded is in fact embeddable */
|
|
789
|
-
void ev_embed_start (EV_P_ ev_embed *w);
|
|
790
|
-
void ev_embed_stop (EV_P_ ev_embed *w);
|
|
791
|
-
void ev_embed_sweep (EV_P_ ev_embed *w);
|
|
817
|
+
EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_THROW;
|
|
818
|
+
EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_THROW;
|
|
819
|
+
EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_THROW;
|
|
792
820
|
# endif
|
|
793
821
|
|
|
794
822
|
# if EV_ASYNC_ENABLE
|
|
795
|
-
void ev_async_start (EV_P_ ev_async *w);
|
|
796
|
-
void ev_async_stop (EV_P_ ev_async *w);
|
|
797
|
-
void ev_async_send (EV_P_ ev_async *w);
|
|
823
|
+
EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_THROW;
|
|
824
|
+
EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_THROW;
|
|
825
|
+
EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_THROW;
|
|
798
826
|
# endif
|
|
799
827
|
|
|
800
828
|
#if EV_COMPAT3
|