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.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/ext/libev/Changes +232 -3
  4. data/ext/libev/LICENSE +2 -1
  5. data/ext/libev/README +11 -10
  6. data/ext/libev/ev.c +2249 -473
  7. data/ext/libev/ev.h +165 -135
  8. data/ext/libev/ev_epoll.c +68 -36
  9. data/ext/libev/ev_iouring.c +694 -0
  10. data/ext/libev/ev_kqueue.c +44 -18
  11. data/ext/libev/ev_linuxaio.c +620 -0
  12. data/ext/libev/ev_poll.c +28 -20
  13. data/ext/libev/ev_port.c +23 -10
  14. data/ext/libev/ev_select.c +18 -12
  15. data/ext/libev/ev_vars.h +65 -19
  16. data/ext/libev/ev_win32.c +16 -7
  17. data/ext/libev/ev_wrap.h +236 -160
  18. data/ext/nio4r/.clang-format +16 -0
  19. data/ext/nio4r/bytebuffer.c +465 -0
  20. data/ext/nio4r/extconf.rb +44 -35
  21. data/ext/nio4r/libev.h +3 -4
  22. data/ext/nio4r/monitor.c +186 -54
  23. data/ext/nio4r/nio4r.h +17 -23
  24. data/ext/nio4r/nio4r_ext.c +11 -3
  25. data/ext/nio4r/org/nio4r/ByteBuffer.java +295 -0
  26. data/ext/nio4r/org/nio4r/Monitor.java +176 -0
  27. data/ext/nio4r/org/nio4r/Nio4r.java +104 -0
  28. data/ext/nio4r/org/nio4r/Selector.java +297 -0
  29. data/ext/nio4r/selector.c +350 -182
  30. data/lib/nio/bytebuffer.rb +235 -0
  31. data/lib/nio/monitor.rb +100 -8
  32. data/lib/nio/selector.rb +110 -44
  33. data/lib/nio/version.rb +8 -1
  34. data/lib/nio.rb +47 -16
  35. data/lib/nio4r.rb +7 -0
  36. data/license.md +80 -0
  37. data/readme.md +91 -0
  38. data/releases.md +343 -0
  39. data.tar.gz.sig +2 -0
  40. metadata +114 -79
  41. metadata.gz.sig +0 -0
  42. data/.gitignore +0 -20
  43. data/.rspec +0 -4
  44. data/.travis.yml +0 -7
  45. data/CHANGES.md +0 -10
  46. data/Gemfile +0 -4
  47. data/LICENSE.txt +0 -20
  48. data/README.md +0 -171
  49. data/Rakefile +0 -9
  50. data/examples/echo_server.rb +0 -38
  51. data/ext/libev/README.embed +0 -3
  52. data/ext/libev/test_libev_win32.c +0 -123
  53. data/lib/nio/jruby/monitor.rb +0 -42
  54. data/lib/nio/jruby/selector.rb +0 -135
  55. data/nio4r.gemspec +0 -22
  56. data/spec/nio/monitor_spec.rb +0 -46
  57. data/spec/nio/selector_spec.rb +0 -269
  58. data/spec/spec_helper.rb +0 -3
  59. data/tasks/extension.rake +0 -10
  60. 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,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>
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
- # define EV_FEATURES 0x7f
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
- typedef double ev_tstamp;
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 4
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 = 0x00, /* no events */
202
- EV_READ = 0x01, /* ev_io detected read will not block */
203
- EV_WRITE = 0x02, /* ev_io detected write will not block */
204
- EV__IOFDSET = 0x80, /* internal use only */
205
- EV_IO = EV_READ, /* alias for type-detection */
206
- EV_TIMER = 0x00000100, /* timer timed out */
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 = EV_TIMER, /* pre 4.0 API compatibility */
209
- #endif
210
- EV_PERIODIC = 0x00000200, /* periodic timer timed out */
211
- EV_SIGNAL = 0x00000400, /* signal was received */
212
- EV_CHILD = 0x00000800, /* child/pid had status change */
213
- EV_STAT = 0x00001000, /* stat data changed */
214
- EV_IDLE = 0x00002000, /* event loop is idling */
215
- EV_PREPARE = 0x00004000, /* event loop about to poll */
216
- EV_CHECK = 0x00008000, /* event loop finished poll */
217
- EV_EMBED = 0x00010000, /* embedded event loop needs sweep */
218
- EV_FORK = 0x00020000, /* event loop resumed in child */
219
- EV_CLEANUP = 0x00040000, /* event loop resumed in child */
220
- EV_ASYNC = 0x00080000, /* async intra-loop signal */
221
- EV_CUSTOM = 0x01000000, /* for use by user code */
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 = 0x00000000U, /* not quite a mask */
503
+ EVFLAG_AUTO = 0x00000000U, /* not quite a mask */
486
504
  /* flag bits */
487
- EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */
488
- EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */
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 = 0x00100000U, /* do not attempt to use inotify */
508
+ EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */
491
509
  #if EV_COMPAT3
492
- EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */
510
+ EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */
493
511
  #endif
494
- EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */
495
- EVFLAG_NOSIGMASK = 0x00400000U /* avoid modifying the signal mask */
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 = 0x00000001U, /* about anywhere */
501
- EVBACKEND_POLL = 0x00000002U, /* !win */
502
- EVBACKEND_EPOLL = 0x00000004U, /* linux */
503
- EVBACKEND_KQUEUE = 0x00000008U, /* bsd */
504
- EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */
505
- EVBACKEND_PORT = 0x00000020U, /* solaris 10 */
506
- EVBACKEND_ALL = 0x0000003FU, /* all known backends */
507
- EVBACKEND_MASK = 0x0000FFFFU /* all future backends */
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, long size));
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
- void ev_run (EV_P_ int flags EV_CPP (= 0));
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
- void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P));
646
- void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P));
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 ev_cb(ev) (ev)->cb /* rw */
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
- # define ev_set_cb(ev,cb_) ev_cb (ev) = (cb_)
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 its already running */
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 occured */
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
-