nio4r 0.2.0 → 2.7.5
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
- checksums.yaml.gz.sig +0 -0
- data/ext/libev/Changes +232 -3
- data/ext/libev/LICENSE +2 -1
- data/ext/libev/README +11 -10
- data/ext/libev/ev.c +2249 -473
- data/ext/libev/ev.h +165 -135
- data/ext/libev/ev_epoll.c +68 -36
- data/ext/libev/ev_iouring.c +694 -0
- data/ext/libev/ev_kqueue.c +44 -18
- data/ext/libev/ev_linuxaio.c +620 -0
- data/ext/libev/ev_poll.c +28 -20
- data/ext/libev/ev_port.c +23 -10
- data/ext/libev/ev_select.c +18 -12
- data/ext/libev/ev_vars.h +65 -19
- data/ext/libev/ev_win32.c +16 -7
- data/ext/libev/ev_wrap.h +236 -160
- data/ext/nio4r/.clang-format +16 -0
- data/ext/nio4r/bytebuffer.c +465 -0
- data/ext/nio4r/extconf.rb +44 -35
- data/ext/nio4r/libev.h +3 -4
- data/ext/nio4r/monitor.c +186 -54
- data/ext/nio4r/nio4r.h +17 -23
- data/ext/nio4r/nio4r_ext.c +11 -3
- data/ext/nio4r/org/nio4r/ByteBuffer.java +295 -0
- data/ext/nio4r/org/nio4r/Monitor.java +176 -0
- data/ext/nio4r/org/nio4r/Nio4r.java +104 -0
- data/ext/nio4r/org/nio4r/Selector.java +297 -0
- data/ext/nio4r/selector.c +350 -182
- data/lib/nio/bytebuffer.rb +235 -0
- data/lib/nio/monitor.rb +100 -8
- data/lib/nio/selector.rb +110 -44
- data/lib/nio/version.rb +8 -1
- data/lib/nio.rb +47 -16
- data/lib/nio4r.rb +7 -0
- data/license.md +80 -0
- data/readme.md +91 -0
- data/releases.md +343 -0
- data.tar.gz.sig +2 -0
- metadata +114 -79
- metadata.gz.sig +0 -0
- data/.gitignore +0 -20
- data/.rspec +0 -4
- data/.travis.yml +0 -7
- data/CHANGES.md +0 -10
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -20
- data/README.md +0 -171
- data/Rakefile +0 -9
- data/examples/echo_server.rb +0 -38
- data/ext/libev/README.embed +0 -3
- data/ext/libev/test_libev_win32.c +0 -123
- data/lib/nio/jruby/monitor.rb +0 -42
- data/lib/nio/jruby/selector.rb +0 -135
- data/nio4r.gemspec +0 -22
- data/spec/nio/monitor_spec.rb +0 -46
- data/spec/nio/selector_spec.rb +0 -269
- data/spec/spec_helper.rb +0 -3
- data/tasks/extension.rake +0 -10
- data/tasks/rspec.rake +0 -7
data/ext/libev/ev.h
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* libev native API header
|
|
3
3
|
*
|
|
4
|
-
* Copyright (c) 2007
|
|
4
|
+
* Copyright (c) 2007-2020 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-
|
|
@@ -42,9 +42,16 @@
|
|
|
42
42
|
|
|
43
43
|
#ifdef __cplusplus
|
|
44
44
|
# define EV_CPP(x) x
|
|
45
|
+
# if __cplusplus >= 201103L
|
|
46
|
+
# define EV_NOEXCEPT noexcept
|
|
47
|
+
# else
|
|
48
|
+
# define EV_NOEXCEPT
|
|
49
|
+
# endif
|
|
45
50
|
#else
|
|
46
51
|
# define EV_CPP(x)
|
|
52
|
+
# define EV_NOEXCEPT
|
|
47
53
|
#endif
|
|
54
|
+
#define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */
|
|
48
55
|
|
|
49
56
|
EV_CPP(extern "C" {)
|
|
50
57
|
|
|
@@ -56,7 +63,11 @@ EV_CPP(extern "C" {)
|
|
|
56
63
|
#endif
|
|
57
64
|
|
|
58
65
|
#ifndef EV_FEATURES
|
|
59
|
-
#
|
|
66
|
+
# if defined __OPTIMIZE_SIZE__
|
|
67
|
+
# define EV_FEATURES 0x7c
|
|
68
|
+
# else
|
|
69
|
+
# define EV_FEATURES 0x7f
|
|
70
|
+
# endif
|
|
60
71
|
#endif
|
|
61
72
|
|
|
62
73
|
#define EV_FEATURE_CODE ((EV_FEATURES) & 1)
|
|
@@ -140,7 +151,12 @@ EV_CPP(extern "C" {)
|
|
|
140
151
|
|
|
141
152
|
/*****************************************************************************/
|
|
142
153
|
|
|
143
|
-
|
|
154
|
+
#ifndef EV_TSTAMP_T
|
|
155
|
+
# define EV_TSTAMP_T double
|
|
156
|
+
#endif
|
|
157
|
+
typedef EV_TSTAMP_T ev_tstamp;
|
|
158
|
+
|
|
159
|
+
#include <string.h> /* for memmove */
|
|
144
160
|
|
|
145
161
|
#ifndef EV_ATOMIC_T
|
|
146
162
|
# include <signal.h>
|
|
@@ -185,6 +201,12 @@ struct ev_loop;
|
|
|
185
201
|
# define EV_INLINE static
|
|
186
202
|
#endif
|
|
187
203
|
|
|
204
|
+
#ifdef EV_API_STATIC
|
|
205
|
+
# define EV_API_DECL static
|
|
206
|
+
#else
|
|
207
|
+
# define EV_API_DECL extern
|
|
208
|
+
#endif
|
|
209
|
+
|
|
188
210
|
/* EV_PROTOTYPES can be used to switch of prototype declarations */
|
|
189
211
|
#ifndef EV_PROTOTYPES
|
|
190
212
|
# define EV_PROTOTYPES 1
|
|
@@ -193,33 +215,33 @@ struct ev_loop;
|
|
|
193
215
|
/*****************************************************************************/
|
|
194
216
|
|
|
195
217
|
#define EV_VERSION_MAJOR 4
|
|
196
|
-
#define EV_VERSION_MINOR
|
|
218
|
+
#define EV_VERSION_MINOR 33
|
|
197
219
|
|
|
198
220
|
/* eventmask, revents, events... */
|
|
199
221
|
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 =
|
|
222
|
+
EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */
|
|
223
|
+
EV_NONE = 0x00, /* no events */
|
|
224
|
+
EV_READ = 0x01, /* ev_io detected read will not block */
|
|
225
|
+
EV_WRITE = 0x02, /* ev_io detected write will not block */
|
|
226
|
+
EV__IOFDSET = 0x80, /* internal use only */
|
|
227
|
+
EV_IO = EV_READ, /* alias for type-detection */
|
|
228
|
+
EV_TIMER = 0x00000100, /* timer timed out */
|
|
207
229
|
#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 */
|
|
230
|
+
EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */
|
|
231
|
+
#endif
|
|
232
|
+
EV_PERIODIC = 0x00000200, /* periodic timer timed out */
|
|
233
|
+
EV_SIGNAL = 0x00000400, /* signal was received */
|
|
234
|
+
EV_CHILD = 0x00000800, /* child/pid had status change */
|
|
235
|
+
EV_STAT = 0x00001000, /* stat data changed */
|
|
236
|
+
EV_IDLE = 0x00002000, /* event loop is idling */
|
|
237
|
+
EV_PREPARE = 0x00004000, /* event loop about to poll */
|
|
238
|
+
EV_CHECK = 0x00008000, /* event loop finished poll */
|
|
239
|
+
EV_EMBED = 0x00010000, /* embedded event loop needs sweep */
|
|
240
|
+
EV_FORK = 0x00020000, /* event loop resumed in child */
|
|
241
|
+
EV_CLEANUP = 0x00040000, /* event loop resumed in child */
|
|
242
|
+
EV_ASYNC = 0x00080000, /* async intra-loop signal */
|
|
243
|
+
EV_CUSTOM = 0x01000000, /* for use by user code */
|
|
244
|
+
EV_ERROR = (int)0x80000000 /* sent when an error occurs */
|
|
223
245
|
};
|
|
224
246
|
|
|
225
247
|
/* can be used to add custom fields to all watchers, while losing binary compatibility */
|
|
@@ -321,7 +343,7 @@ typedef struct ev_periodic
|
|
|
321
343
|
|
|
322
344
|
ev_tstamp offset; /* rw */
|
|
323
345
|
ev_tstamp interval; /* rw */
|
|
324
|
-
ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now); /* rw */
|
|
346
|
+
ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */
|
|
325
347
|
} ev_periodic;
|
|
326
348
|
|
|
327
349
|
/* invoked when the given signal has been received */
|
|
@@ -370,14 +392,12 @@ typedef struct ev_stat
|
|
|
370
392
|
} ev_stat;
|
|
371
393
|
#endif
|
|
372
394
|
|
|
373
|
-
#if EV_IDLE_ENABLE
|
|
374
395
|
/* invoked when the nothing else needs to be done, keeps the process from blocking */
|
|
375
396
|
/* revent EV_IDLE */
|
|
376
397
|
typedef struct ev_idle
|
|
377
398
|
{
|
|
378
399
|
EV_WATCHER (ev_idle)
|
|
379
400
|
} ev_idle;
|
|
380
|
-
#endif
|
|
381
401
|
|
|
382
402
|
/* invoked for each run of the mainloop, just before the blocking call */
|
|
383
403
|
/* you can still change events in any way you like */
|
|
@@ -394,23 +414,19 @@ typedef struct ev_check
|
|
|
394
414
|
EV_WATCHER (ev_check)
|
|
395
415
|
} ev_check;
|
|
396
416
|
|
|
397
|
-
#if EV_FORK_ENABLE
|
|
398
417
|
/* the callback gets invoked before check in the child process when a fork was detected */
|
|
399
418
|
/* revent EV_FORK */
|
|
400
419
|
typedef struct ev_fork
|
|
401
420
|
{
|
|
402
421
|
EV_WATCHER (ev_fork)
|
|
403
422
|
} ev_fork;
|
|
404
|
-
#endif
|
|
405
423
|
|
|
406
|
-
#if EV_CLEANUP_ENABLE
|
|
407
424
|
/* is invoked just before the loop gets destroyed */
|
|
408
425
|
/* revent EV_CLEANUP */
|
|
409
426
|
typedef struct ev_cleanup
|
|
410
427
|
{
|
|
411
428
|
EV_WATCHER (ev_cleanup)
|
|
412
429
|
} ev_cleanup;
|
|
413
|
-
#endif
|
|
414
430
|
|
|
415
431
|
#if EV_EMBED_ENABLE
|
|
416
432
|
/* used to embed an event loop inside another */
|
|
@@ -420,16 +436,18 @@ typedef struct ev_embed
|
|
|
420
436
|
EV_WATCHER (ev_embed)
|
|
421
437
|
|
|
422
438
|
struct ev_loop *other; /* ro */
|
|
439
|
+
#undef EV_IO_ENABLE
|
|
440
|
+
#define EV_IO_ENABLE 1
|
|
423
441
|
ev_io io; /* private */
|
|
442
|
+
#undef EV_PREPARE_ENABLE
|
|
443
|
+
#define EV_PREPARE_ENABLE 1
|
|
424
444
|
ev_prepare prepare; /* private */
|
|
425
445
|
ev_check check; /* unused */
|
|
426
446
|
ev_timer timer; /* unused */
|
|
427
447
|
ev_periodic periodic; /* unused */
|
|
428
448
|
ev_idle idle; /* unused */
|
|
429
449
|
ev_fork fork; /* private */
|
|
430
|
-
#if EV_CLEANUP_ENABLE
|
|
431
450
|
ev_cleanup cleanup; /* unused */
|
|
432
|
-
#endif
|
|
433
451
|
} ev_embed;
|
|
434
452
|
#endif
|
|
435
453
|
|
|
@@ -482,41 +500,44 @@ union ev_any_watcher
|
|
|
482
500
|
/* flag bits for ev_default_loop and ev_loop_new */
|
|
483
501
|
enum {
|
|
484
502
|
/* the default */
|
|
485
|
-
EVFLAG_AUTO
|
|
503
|
+
EVFLAG_AUTO = 0x00000000U, /* not quite a mask */
|
|
486
504
|
/* flag bits */
|
|
487
|
-
EVFLAG_NOENV
|
|
488
|
-
EVFLAG_FORKCHECK
|
|
505
|
+
EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */
|
|
506
|
+
EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */
|
|
489
507
|
/* debugging/feature disable */
|
|
490
|
-
EVFLAG_NOINOTIFY
|
|
508
|
+
EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */
|
|
491
509
|
#if EV_COMPAT3
|
|
492
|
-
EVFLAG_NOSIGFD
|
|
510
|
+
EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */
|
|
493
511
|
#endif
|
|
494
|
-
EVFLAG_SIGNALFD
|
|
495
|
-
EVFLAG_NOSIGMASK
|
|
512
|
+
EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */
|
|
513
|
+
EVFLAG_NOSIGMASK = 0x00400000U, /* avoid modifying the signal mask */
|
|
514
|
+
EVFLAG_NOTIMERFD = 0x00800000U /* avoid creating a timerfd */
|
|
496
515
|
};
|
|
497
516
|
|
|
498
517
|
/* method bits to be ored together */
|
|
499
518
|
enum {
|
|
500
|
-
EVBACKEND_SELECT
|
|
501
|
-
EVBACKEND_POLL
|
|
502
|
-
EVBACKEND_EPOLL
|
|
503
|
-
EVBACKEND_KQUEUE
|
|
504
|
-
EVBACKEND_DEVPOLL
|
|
505
|
-
EVBACKEND_PORT
|
|
506
|
-
|
|
507
|
-
|
|
519
|
+
EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */
|
|
520
|
+
EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */
|
|
521
|
+
EVBACKEND_EPOLL = 0x00000004U, /* linux */
|
|
522
|
+
EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */
|
|
523
|
+
EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */
|
|
524
|
+
EVBACKEND_PORT = 0x00000020U, /* solaris 10 */
|
|
525
|
+
EVBACKEND_LINUXAIO = 0x00000040U, /* linux AIO, 4.19+ */
|
|
526
|
+
EVBACKEND_IOURING = 0x00000080U, /* linux io_uring, 5.1+ */
|
|
527
|
+
EVBACKEND_ALL = 0x000000FFU, /* all known backends */
|
|
528
|
+
EVBACKEND_MASK = 0x0000FFFFU /* all future backends */
|
|
508
529
|
};
|
|
509
530
|
|
|
510
531
|
#if EV_PROTOTYPES
|
|
511
|
-
int ev_version_major (void);
|
|
512
|
-
int ev_version_minor (void);
|
|
532
|
+
EV_API_DECL int ev_version_major (void) EV_NOEXCEPT;
|
|
533
|
+
EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT;
|
|
513
534
|
|
|
514
|
-
unsigned int ev_supported_backends (void);
|
|
515
|
-
unsigned int ev_recommended_backends (void);
|
|
516
|
-
unsigned int ev_embeddable_backends (void);
|
|
535
|
+
EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT;
|
|
536
|
+
EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT;
|
|
537
|
+
EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT;
|
|
517
538
|
|
|
518
|
-
ev_tstamp ev_time (void);
|
|
519
|
-
void ev_sleep (ev_tstamp delay); /* sleep for a while */
|
|
539
|
+
EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT;
|
|
540
|
+
EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */
|
|
520
541
|
|
|
521
542
|
/* Sets the allocation function to use, works like realloc.
|
|
522
543
|
* It is used to allocate and free memory.
|
|
@@ -524,22 +545,26 @@ void ev_sleep (ev_tstamp delay); /* sleep for a while */
|
|
|
524
545
|
* or take some potentially destructive action.
|
|
525
546
|
* The default is your system realloc function.
|
|
526
547
|
*/
|
|
527
|
-
void ev_set_allocator (void *(*cb)(void *ptr,
|
|
548
|
+
EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, size_t size) EV_NOEXCEPT) EV_NOEXCEPT;
|
|
528
549
|
|
|
529
550
|
/* set the callback function to call on a
|
|
530
551
|
* retryable syscall error
|
|
531
552
|
* (such as failed select, poll, epoll_wait)
|
|
532
553
|
*/
|
|
533
|
-
void ev_set_syserr_cb (void (*cb)(const char *msg));
|
|
554
|
+
EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT;
|
|
534
555
|
|
|
535
556
|
#if EV_MULTIPLICITY
|
|
536
557
|
|
|
537
558
|
/* the default loop is the only one that handles signals and child watchers */
|
|
538
559
|
/* you can call this as often as you like */
|
|
539
|
-
struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0));
|
|
560
|
+
EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT;
|
|
561
|
+
|
|
562
|
+
#ifdef EV_API_STATIC
|
|
563
|
+
EV_API_DECL struct ev_loop *ev_default_loop_ptr;
|
|
564
|
+
#endif
|
|
540
565
|
|
|
541
566
|
EV_INLINE struct ev_loop *
|
|
542
|
-
ev_default_loop_uc_ (void)
|
|
567
|
+
ev_default_loop_uc_ (void) EV_NOEXCEPT
|
|
543
568
|
{
|
|
544
569
|
extern struct ev_loop *ev_default_loop_ptr;
|
|
545
570
|
|
|
@@ -547,31 +572,31 @@ ev_default_loop_uc_ (void)
|
|
|
547
572
|
}
|
|
548
573
|
|
|
549
574
|
EV_INLINE int
|
|
550
|
-
ev_is_default_loop (EV_P)
|
|
575
|
+
ev_is_default_loop (EV_P) EV_NOEXCEPT
|
|
551
576
|
{
|
|
552
577
|
return EV_A == EV_DEFAULT_UC;
|
|
553
578
|
}
|
|
554
579
|
|
|
555
580
|
/* create and destroy alternative loops that don't handle signals */
|
|
556
|
-
struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0));
|
|
581
|
+
EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT;
|
|
557
582
|
|
|
558
|
-
ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
|
|
583
|
+
EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */
|
|
559
584
|
|
|
560
585
|
#else
|
|
561
586
|
|
|
562
|
-
int ev_default_loop (unsigned int flags EV_CPP (= 0)); /* returns true when successful */
|
|
587
|
+
EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */
|
|
588
|
+
|
|
589
|
+
EV_API_DECL ev_tstamp ev_rt_now;
|
|
563
590
|
|
|
564
591
|
EV_INLINE ev_tstamp
|
|
565
|
-
ev_now (void)
|
|
592
|
+
ev_now (void) EV_NOEXCEPT
|
|
566
593
|
{
|
|
567
|
-
extern ev_tstamp ev_rt_now;
|
|
568
|
-
|
|
569
594
|
return ev_rt_now;
|
|
570
595
|
}
|
|
571
596
|
|
|
572
597
|
/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */
|
|
573
598
|
EV_INLINE int
|
|
574
|
-
ev_is_default_loop (void)
|
|
599
|
+
ev_is_default_loop (void) EV_NOEXCEPT
|
|
575
600
|
{
|
|
576
601
|
return 1;
|
|
577
602
|
}
|
|
@@ -579,23 +604,23 @@ ev_is_default_loop (void)
|
|
|
579
604
|
#endif /* multiplicity */
|
|
580
605
|
|
|
581
606
|
/* destroy event loops, also works for the default loop */
|
|
582
|
-
void ev_loop_destroy (EV_P);
|
|
607
|
+
EV_API_DECL void ev_loop_destroy (EV_P);
|
|
583
608
|
|
|
584
609
|
/* this needs to be called after fork, to duplicate the loop */
|
|
585
610
|
/* when you want to re-use it in the child */
|
|
586
611
|
/* you can call it in either the parent or the child */
|
|
587
612
|
/* you can actually call it at any time, anywhere :) */
|
|
588
|
-
void ev_loop_fork (EV_P);
|
|
613
|
+
EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT;
|
|
589
614
|
|
|
590
|
-
unsigned int ev_backend (EV_P); /* backend in use by loop */
|
|
615
|
+
EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */
|
|
591
616
|
|
|
592
|
-
void ev_now_update (EV_P); /* update event loop time */
|
|
617
|
+
EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */
|
|
593
618
|
|
|
594
619
|
#if EV_WALK_ENABLE
|
|
595
620
|
/* walk (almost) all watchers in the loop of a given type, invoking the */
|
|
596
621
|
/* callback on every such watcher. The callback might stop the watcher, */
|
|
597
622
|
/* but do nothing else with the loop */
|
|
598
|
-
void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w));
|
|
623
|
+
EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT;
|
|
599
624
|
#endif
|
|
600
625
|
|
|
601
626
|
#endif /* prototypes */
|
|
@@ -614,45 +639,48 @@ enum {
|
|
|
614
639
|
};
|
|
615
640
|
|
|
616
641
|
#if EV_PROTOTYPES
|
|
617
|
-
|
|
618
|
-
void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)); /* break out of the loop */
|
|
642
|
+
EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0));
|
|
643
|
+
EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */
|
|
619
644
|
|
|
620
645
|
/*
|
|
621
646
|
* ref/unref can be used to add or remove a refcount on the mainloop. every watcher
|
|
622
647
|
* keeps one reference. if you have a long-running watcher you never unregister that
|
|
623
648
|
* should not keep ev_loop from running, unref() after starting, and ref() before stopping.
|
|
624
649
|
*/
|
|
625
|
-
void ev_ref (EV_P);
|
|
626
|
-
void ev_unref (EV_P);
|
|
650
|
+
EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT;
|
|
651
|
+
EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT;
|
|
627
652
|
|
|
628
653
|
/*
|
|
629
654
|
* convenience function, wait for a single event, without registering an event watcher
|
|
630
655
|
* if timeout is < 0, do wait indefinitely
|
|
631
656
|
*/
|
|
632
|
-
void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg);
|
|
657
|
+
EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT;
|
|
658
|
+
|
|
659
|
+
EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */
|
|
633
660
|
|
|
634
661
|
# if EV_FEATURE_API
|
|
635
|
-
unsigned int ev_iteration (EV_P); /* number of loop iterations */
|
|
636
|
-
unsigned int ev_depth (EV_P); /* #ev_loop enters - #ev_loop leaves */
|
|
637
|
-
void ev_verify (EV_P); /* abort if loop data corrupted */
|
|
662
|
+
EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */
|
|
663
|
+
EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */
|
|
664
|
+
EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */
|
|
638
665
|
|
|
639
|
-
void ev_set_io_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
|
|
640
|
-
void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
|
|
666
|
+
EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */
|
|
667
|
+
EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */
|
|
641
668
|
|
|
642
669
|
/* advanced stuff for threading etc. support, see docs */
|
|
643
|
-
void ev_set_userdata (EV_P_ void *data);
|
|
644
|
-
void *ev_userdata (EV_P);
|
|
645
|
-
|
|
646
|
-
void
|
|
670
|
+
EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT;
|
|
671
|
+
EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT;
|
|
672
|
+
typedef void (*ev_loop_callback)(EV_P);
|
|
673
|
+
EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT;
|
|
674
|
+
/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */
|
|
675
|
+
EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT;
|
|
647
676
|
|
|
648
|
-
unsigned int ev_pending_count (EV_P); /* number of pending events, if any */
|
|
649
|
-
void ev_invoke_pending (EV_P); /* invoke all pending watchers */
|
|
677
|
+
EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */
|
|
650
678
|
|
|
651
679
|
/*
|
|
652
680
|
* stop/start the timer handling.
|
|
653
681
|
*/
|
|
654
|
-
void ev_suspend (EV_P);
|
|
655
|
-
void ev_resume (EV_P);
|
|
682
|
+
EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT;
|
|
683
|
+
EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT;
|
|
656
684
|
#endif
|
|
657
685
|
|
|
658
686
|
#endif
|
|
@@ -666,6 +694,7 @@ void ev_resume (EV_P);
|
|
|
666
694
|
ev_set_cb ((ev), cb_); \
|
|
667
695
|
} while (0)
|
|
668
696
|
|
|
697
|
+
#define ev_io_modify(ev,events_) do { (ev)->events = (ev)->events & EV__IOFDSET | (events_); } while (0)
|
|
669
698
|
#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0)
|
|
670
699
|
#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0)
|
|
671
700
|
#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0)
|
|
@@ -697,7 +726,8 @@ void ev_resume (EV_P);
|
|
|
697
726
|
#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */
|
|
698
727
|
#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */
|
|
699
728
|
|
|
700
|
-
#define
|
|
729
|
+
#define ev_cb_(ev) (ev)->cb /* rw */
|
|
730
|
+
#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb)
|
|
701
731
|
|
|
702
732
|
#if EV_MINPRI == EV_MAXPRI
|
|
703
733
|
# define ev_priority(ev) ((ev), EV_MINPRI)
|
|
@@ -710,94 +740,95 @@ void ev_resume (EV_P);
|
|
|
710
740
|
#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at)
|
|
711
741
|
|
|
712
742
|
#ifndef ev_set_cb
|
|
713
|
-
|
|
743
|
+
/* memmove is used here to avoid strict aliasing violations, and hopefully is optimized out by any reasonable compiler */
|
|
744
|
+
# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev))))
|
|
714
745
|
#endif
|
|
715
746
|
|
|
716
747
|
/* stopping (enabling, adding) a watcher does nothing if it is already running */
|
|
717
|
-
/* stopping (disabling, deleting) a watcher does nothing unless
|
|
748
|
+
/* stopping (disabling, deleting) a watcher does nothing unless it's already running */
|
|
718
749
|
#if EV_PROTOTYPES
|
|
719
750
|
|
|
720
|
-
/* feeds an event into a watcher as if the event actually
|
|
751
|
+
/* feeds an event into a watcher as if the event actually occurred */
|
|
721
752
|
/* accepts any ev_watcher type */
|
|
722
|
-
void ev_feed_event (EV_P_ void *w, int revents);
|
|
723
|
-
void ev_feed_fd_event (EV_P_ int fd, int revents);
|
|
753
|
+
EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT;
|
|
754
|
+
EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT;
|
|
724
755
|
#if EV_SIGNAL_ENABLE
|
|
725
|
-
void ev_feed_signal (int signum);
|
|
726
|
-
void ev_feed_signal_event (EV_P_ int signum);
|
|
756
|
+
EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT;
|
|
757
|
+
EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT;
|
|
727
758
|
#endif
|
|
728
|
-
void ev_invoke (EV_P_ void *w, int revents);
|
|
729
|
-
int ev_clear_pending (EV_P_ void *w);
|
|
759
|
+
EV_API_DECL void ev_invoke (EV_P_ void *w, int revents);
|
|
760
|
+
EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT;
|
|
730
761
|
|
|
731
|
-
void ev_io_start (EV_P_ ev_io *w);
|
|
732
|
-
void ev_io_stop (EV_P_ ev_io *w);
|
|
762
|
+
EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT;
|
|
763
|
+
EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT;
|
|
733
764
|
|
|
734
|
-
void ev_timer_start (EV_P_ ev_timer *w);
|
|
735
|
-
void ev_timer_stop (EV_P_ ev_timer *w);
|
|
765
|
+
EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT;
|
|
766
|
+
EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT;
|
|
736
767
|
/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
|
|
737
|
-
void ev_timer_again (EV_P_ ev_timer *w);
|
|
768
|
+
EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT;
|
|
738
769
|
/* return remaining time */
|
|
739
|
-
ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w);
|
|
770
|
+
EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT;
|
|
740
771
|
|
|
741
772
|
#if EV_PERIODIC_ENABLE
|
|
742
|
-
void ev_periodic_start (EV_P_ ev_periodic *w);
|
|
743
|
-
void ev_periodic_stop (EV_P_ ev_periodic *w);
|
|
744
|
-
void ev_periodic_again (EV_P_ ev_periodic *w);
|
|
773
|
+
EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT;
|
|
774
|
+
EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT;
|
|
775
|
+
EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT;
|
|
745
776
|
#endif
|
|
746
777
|
|
|
747
778
|
/* only supported in the default loop */
|
|
748
779
|
#if EV_SIGNAL_ENABLE
|
|
749
|
-
void ev_signal_start (EV_P_ ev_signal *w);
|
|
750
|
-
void ev_signal_stop (EV_P_ ev_signal *w);
|
|
780
|
+
EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT;
|
|
781
|
+
EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT;
|
|
751
782
|
#endif
|
|
752
783
|
|
|
753
784
|
/* only supported in the default loop */
|
|
754
785
|
# if EV_CHILD_ENABLE
|
|
755
|
-
void ev_child_start (EV_P_ ev_child *w);
|
|
756
|
-
void ev_child_stop (EV_P_ ev_child *w);
|
|
786
|
+
EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT;
|
|
787
|
+
EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT;
|
|
757
788
|
# endif
|
|
758
789
|
|
|
759
790
|
# if EV_STAT_ENABLE
|
|
760
|
-
void ev_stat_start (EV_P_ ev_stat *w);
|
|
761
|
-
void ev_stat_stop (EV_P_ ev_stat *w);
|
|
762
|
-
void ev_stat_stat (EV_P_ ev_stat *w);
|
|
791
|
+
EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT;
|
|
792
|
+
EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT;
|
|
793
|
+
EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT;
|
|
763
794
|
# endif
|
|
764
795
|
|
|
765
796
|
# if EV_IDLE_ENABLE
|
|
766
|
-
void ev_idle_start (EV_P_ ev_idle *w);
|
|
767
|
-
void ev_idle_stop (EV_P_ ev_idle *w);
|
|
797
|
+
EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT;
|
|
798
|
+
EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT;
|
|
768
799
|
# endif
|
|
769
800
|
|
|
770
801
|
#if EV_PREPARE_ENABLE
|
|
771
|
-
void ev_prepare_start (EV_P_ ev_prepare *w);
|
|
772
|
-
void ev_prepare_stop (EV_P_ ev_prepare *w);
|
|
802
|
+
EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT;
|
|
803
|
+
EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT;
|
|
773
804
|
#endif
|
|
774
805
|
|
|
775
806
|
#if EV_CHECK_ENABLE
|
|
776
|
-
void ev_check_start (EV_P_ ev_check *w);
|
|
777
|
-
void ev_check_stop (EV_P_ ev_check *w);
|
|
807
|
+
EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT;
|
|
808
|
+
EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT;
|
|
778
809
|
#endif
|
|
779
810
|
|
|
780
811
|
# if EV_FORK_ENABLE
|
|
781
|
-
void ev_fork_start (EV_P_ ev_fork *w);
|
|
782
|
-
void ev_fork_stop (EV_P_ ev_fork *w);
|
|
812
|
+
EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT;
|
|
813
|
+
EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT;
|
|
783
814
|
# endif
|
|
784
815
|
|
|
785
816
|
# if EV_CLEANUP_ENABLE
|
|
786
|
-
void ev_cleanup_start (EV_P_ ev_cleanup *w);
|
|
787
|
-
void ev_cleanup_stop (EV_P_ ev_cleanup *w);
|
|
817
|
+
EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT;
|
|
818
|
+
EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT;
|
|
788
819
|
# endif
|
|
789
820
|
|
|
790
821
|
# if EV_EMBED_ENABLE
|
|
791
822
|
/* only supported when loop to be embedded is in fact embeddable */
|
|
792
|
-
void ev_embed_start (EV_P_ ev_embed *w);
|
|
793
|
-
void ev_embed_stop (EV_P_ ev_embed *w);
|
|
794
|
-
void ev_embed_sweep (EV_P_ ev_embed *w);
|
|
823
|
+
EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT;
|
|
824
|
+
EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT;
|
|
825
|
+
EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT;
|
|
795
826
|
# endif
|
|
796
827
|
|
|
797
828
|
# if EV_ASYNC_ENABLE
|
|
798
|
-
void ev_async_start (EV_P_ ev_async *w);
|
|
799
|
-
void ev_async_stop (EV_P_ ev_async *w);
|
|
800
|
-
void ev_async_send (EV_P_ ev_async *w);
|
|
829
|
+
EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT;
|
|
830
|
+
EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT;
|
|
831
|
+
EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT;
|
|
801
832
|
# endif
|
|
802
833
|
|
|
803
834
|
#if EV_COMPAT3
|
|
@@ -826,4 +857,3 @@ void ev_async_send (EV_P_ ev_async *w);
|
|
|
826
857
|
EV_CPP(})
|
|
827
858
|
|
|
828
859
|
#endif
|
|
829
|
-
|