nio4r 2.3.1 → 2.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/workflow.yml +43 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +37 -11
  5. data/CHANGES.md +40 -0
  6. data/Gemfile +5 -6
  7. data/README.md +53 -7
  8. data/Rakefile +0 -2
  9. data/examples/echo_server.rb +2 -2
  10. data/ext/libev/Changes +35 -0
  11. data/ext/libev/README +2 -1
  12. data/ext/libev/ev.c +213 -151
  13. data/ext/libev/ev.h +95 -88
  14. data/ext/libev/ev_epoll.c +26 -15
  15. data/ext/libev/ev_kqueue.c +11 -5
  16. data/ext/libev/ev_linuxaio.c +642 -0
  17. data/ext/libev/ev_poll.c +13 -8
  18. data/ext/libev/ev_port.c +5 -2
  19. data/ext/libev/ev_vars.h +14 -3
  20. data/ext/libev/ev_wrap.h +16 -0
  21. data/ext/nio4r/extconf.rb +2 -0
  22. data/ext/nio4r/monitor.c +1 -0
  23. data/ext/nio4r/nio4r.h +1 -1
  24. data/ext/nio4r/org/nio4r/Selector.java +5 -1
  25. data/ext/nio4r/selector.c +5 -5
  26. data/lib/nio.rb +3 -3
  27. data/lib/nio/bytebuffer.rb +4 -0
  28. data/lib/nio/monitor.rb +10 -8
  29. data/lib/nio/selector.rb +3 -1
  30. data/lib/nio/version.rb +1 -1
  31. data/nio4r.gemspec +10 -2
  32. data/{tasks → rakelib}/extension.rake +2 -0
  33. data/{tasks → rakelib}/rspec.rake +0 -0
  34. data/{tasks → rakelib}/rubocop.rake +0 -0
  35. data/spec/nio/acceptables_spec.rb +3 -5
  36. data/spec/nio/bytebuffer_spec.rb +2 -4
  37. data/spec/nio/monitor_spec.rb +2 -2
  38. data/spec/nio/selectables/ssl_socket_spec.rb +50 -20
  39. data/spec/nio/selectables/tcp_socket_spec.rb +23 -17
  40. data/spec/nio/selectables/udp_socket_spec.rb +13 -8
  41. data/spec/nio/selector_spec.rb +34 -16
  42. data/spec/spec_helper.rb +4 -16
  43. data/spec/support/selectable_examples.rb +37 -17
  44. metadata +18 -17
  45. data/.travis.yml +0 -36
  46. data/LICENSE.txt +0 -20
  47. data/appveyor.yml +0 -27
  48. data/ext/libev/README.embed +0 -3
  49. data/ext/libev/test_libev_win32.c +0 -123
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev native API header
3
3
  *
4
- * Copyright (c) 2007,2008,2009,2010,2011,2012,2015 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007-2019 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-
@@ -43,19 +43,25 @@
43
43
  #ifdef __cplusplus
44
44
  # define EV_CPP(x) x
45
45
  # if __cplusplus >= 201103L
46
- # define EV_THROW noexcept
46
+ # define EV_NOEXCEPT noexcept
47
47
  # else
48
- # define EV_THROW throw ()
48
+ # define EV_NOEXCEPT
49
49
  # endif
50
50
  #else
51
51
  # define EV_CPP(x)
52
- # define EV_THROW
52
+ # define EV_NOEXCEPT
53
53
  #endif
54
+ #define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */
54
55
 
55
56
  EV_CPP(extern "C" {)
56
57
 
57
58
  /*****************************************************************************/
58
59
 
60
+ /* pre-4.0 compatibility */
61
+ #ifndef EV_COMPAT3
62
+ # define EV_COMPAT3 1
63
+ #endif
64
+
59
65
  #ifndef EV_FEATURES
60
66
  # if defined __OPTIMIZE_SIZE__
61
67
  # define EV_FEATURES 0x7c
@@ -206,7 +212,7 @@ struct ev_loop;
206
212
  /*****************************************************************************/
207
213
 
208
214
  #define EV_VERSION_MAJOR 4
209
- #define EV_VERSION_MINOR 24
215
+ #define EV_VERSION_MINOR 27
210
216
 
211
217
  /* eventmask, revents, events... */
212
218
  enum {
@@ -334,7 +340,7 @@ typedef struct ev_periodic
334
340
 
335
341
  ev_tstamp offset; /* rw */
336
342
  ev_tstamp interval; /* rw */
337
- ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_THROW; /* rw */
343
+ ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */
338
344
  } ev_periodic;
339
345
 
340
346
  /* invoked when the given signal has been received */
@@ -510,26 +516,27 @@ enum {
510
516
 
511
517
  /* method bits to be ored together */
512
518
  enum {
513
- EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */
514
- EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */
515
- EVBACKEND_EPOLL = 0x00000004U, /* linux */
516
- EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */
517
- EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */
518
- EVBACKEND_PORT = 0x00000020U, /* solaris 10 */
519
- EVBACKEND_ALL = 0x0000003FU, /* all known backends */
520
- 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, /* Linuix AIO */
526
+ EVBACKEND_ALL = 0x0000007FU, /* all known backends */
527
+ EVBACKEND_MASK = 0x0000FFFFU /* all future backends */
521
528
  };
522
529
 
523
530
  #if EV_PROTOTYPES
524
- EV_API_DECL int ev_version_major (void) EV_THROW;
525
- EV_API_DECL int ev_version_minor (void) EV_THROW;
531
+ EV_API_DECL int ev_version_major (void) EV_NOEXCEPT;
532
+ EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT;
526
533
 
527
- EV_API_DECL unsigned int ev_supported_backends (void) EV_THROW;
528
- EV_API_DECL unsigned int ev_recommended_backends (void) EV_THROW;
529
- EV_API_DECL unsigned int ev_embeddable_backends (void) EV_THROW;
534
+ EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT;
535
+ EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT;
536
+ EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT;
530
537
 
531
- EV_API_DECL ev_tstamp ev_time (void) EV_THROW;
532
- EV_API_DECL void ev_sleep (ev_tstamp delay) EV_THROW; /* sleep for a while */
538
+ EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT;
539
+ EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */
533
540
 
534
541
  /* Sets the allocation function to use, works like realloc.
535
542
  * It is used to allocate and free memory.
@@ -537,26 +544,26 @@ EV_API_DECL void ev_sleep (ev_tstamp delay) EV_THROW; /* sleep for a while */
537
544
  * or take some potentially destructive action.
538
545
  * The default is your system realloc function.
539
546
  */
540
- EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW;
547
+ EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, size_t size) EV_NOEXCEPT) EV_NOEXCEPT;
541
548
 
542
549
  /* set the callback function to call on a
543
550
  * retryable syscall error
544
551
  * (such as failed select, poll, epoll_wait)
545
552
  */
546
- EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW;
553
+ EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT;
547
554
 
548
555
  #if EV_MULTIPLICITY
549
556
 
550
557
  /* the default loop is the only one that handles signals and child watchers */
551
558
  /* you can call this as often as you like */
552
- EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW;
559
+ EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT;
553
560
 
554
561
  #ifdef EV_API_STATIC
555
562
  EV_API_DECL struct ev_loop *ev_default_loop_ptr;
556
563
  #endif
557
564
 
558
565
  EV_INLINE struct ev_loop *
559
- ev_default_loop_uc_ (void) EV_THROW
566
+ ev_default_loop_uc_ (void) EV_NOEXCEPT
560
567
  {
561
568
  extern struct ev_loop *ev_default_loop_ptr;
562
569
 
@@ -564,31 +571,31 @@ ev_default_loop_uc_ (void) EV_THROW
564
571
  }
565
572
 
566
573
  EV_INLINE int
567
- ev_is_default_loop (EV_P) EV_THROW
574
+ ev_is_default_loop (EV_P) EV_NOEXCEPT
568
575
  {
569
576
  return EV_A == EV_DEFAULT_UC;
570
577
  }
571
578
 
572
579
  /* create and destroy alternative loops that don't handle signals */
573
- EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_THROW;
580
+ EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT;
574
581
 
575
- EV_API_DECL ev_tstamp ev_now (EV_P) EV_THROW; /* time w.r.t. timers and the eventloop, updated after each poll */
582
+ EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */
576
583
 
577
584
  #else
578
585
 
579
- EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW; /* returns true when successful */
586
+ EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */
580
587
 
581
588
  EV_API_DECL ev_tstamp ev_rt_now;
582
589
 
583
590
  EV_INLINE ev_tstamp
584
- ev_now (void) EV_THROW
591
+ ev_now (void) EV_NOEXCEPT
585
592
  {
586
593
  return ev_rt_now;
587
594
  }
588
595
 
589
596
  /* looks weird, but ev_is_default_loop (EV_A) still works if this exists */
590
597
  EV_INLINE int
591
- ev_is_default_loop (void) EV_THROW
598
+ ev_is_default_loop (void) EV_NOEXCEPT
592
599
  {
593
600
  return 1;
594
601
  }
@@ -602,17 +609,17 @@ EV_API_DECL void ev_loop_destroy (EV_P);
602
609
  /* when you want to re-use it in the child */
603
610
  /* you can call it in either the parent or the child */
604
611
  /* you can actually call it at any time, anywhere :) */
605
- EV_API_DECL void ev_loop_fork (EV_P) EV_THROW;
612
+ EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT;
606
613
 
607
- EV_API_DECL unsigned int ev_backend (EV_P) EV_THROW; /* backend in use by loop */
614
+ EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */
608
615
 
609
- EV_API_DECL void ev_now_update (EV_P) EV_THROW; /* update event loop time */
616
+ EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */
610
617
 
611
618
  #if EV_WALK_ENABLE
612
619
  /* walk (almost) all watchers in the loop of a given type, invoking the */
613
620
  /* callback on every such watcher. The callback might stop the watcher, */
614
621
  /* but do nothing else with the loop */
615
- EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW;
622
+ EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT;
616
623
  #endif
617
624
 
618
625
  #endif /* prototypes */
@@ -632,46 +639,46 @@ enum {
632
639
 
633
640
  #if EV_PROTOTYPES
634
641
  EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0));
635
- EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_THROW; /* break out of the loop */
642
+ EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */
636
643
 
637
644
  /*
638
645
  * ref/unref can be used to add or remove a refcount on the mainloop. every watcher
639
646
  * keeps one reference. if you have a long-running watcher you never unregister that
640
647
  * should not keep ev_loop from running, unref() after starting, and ref() before stopping.
641
648
  */
642
- EV_API_DECL void ev_ref (EV_P) EV_THROW;
643
- EV_API_DECL void ev_unref (EV_P) EV_THROW;
649
+ EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT;
650
+ EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT;
644
651
 
645
652
  /*
646
653
  * convenience function, wait for a single event, without registering an event watcher
647
654
  * if timeout is < 0, do wait indefinitely
648
655
  */
649
- 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;
656
+ 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;
650
657
 
651
658
  # if EV_FEATURE_API
652
- EV_API_DECL unsigned int ev_iteration (EV_P) EV_THROW; /* number of loop iterations */
653
- EV_API_DECL unsigned int ev_depth (EV_P) EV_THROW; /* #ev_loop enters - #ev_loop leaves */
654
- EV_API_DECL void ev_verify (EV_P) EV_THROW; /* abort if loop data corrupted */
659
+ EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */
660
+ EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */
661
+ EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */
655
662
 
656
- EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */
657
- EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */
663
+ EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */
664
+ EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */
658
665
 
659
666
  /* advanced stuff for threading etc. support, see docs */
660
- EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_THROW;
661
- EV_API_DECL void *ev_userdata (EV_P) EV_THROW;
667
+ EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT;
668
+ EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT;
662
669
  typedef void (*ev_loop_callback)(EV_P);
663
- EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW;
670
+ EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT;
664
671
  /* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */
665
- 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;
672
+ 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;
666
673
 
667
- EV_API_DECL unsigned int ev_pending_count (EV_P) EV_THROW; /* number of pending events, if any */
674
+ EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */
668
675
  EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */
669
676
 
670
677
  /*
671
678
  * stop/start the timer handling.
672
679
  */
673
- EV_API_DECL void ev_suspend (EV_P) EV_THROW;
674
- EV_API_DECL void ev_resume (EV_P) EV_THROW;
680
+ EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT;
681
+ EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT;
675
682
  #endif
676
683
 
677
684
  #endif
@@ -739,85 +746,85 @@ EV_API_DECL void ev_resume (EV_P) EV_THROW;
739
746
 
740
747
  /* feeds an event into a watcher as if the event actually occurred */
741
748
  /* accepts any ev_watcher type */
742
- EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_THROW;
743
- EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW;
749
+ EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT;
750
+ EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT;
744
751
  #if EV_SIGNAL_ENABLE
745
- EV_API_DECL void ev_feed_signal (int signum) EV_THROW;
746
- EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_THROW;
752
+ EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT;
753
+ EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT;
747
754
  #endif
748
755
  EV_API_DECL void ev_invoke (EV_P_ void *w, int revents);
749
- EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_THROW;
756
+ EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT;
750
757
 
751
- EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_THROW;
752
- EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_THROW;
758
+ EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT;
759
+ EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT;
753
760
 
754
- EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_THROW;
755
- EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_THROW;
761
+ EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT;
762
+ EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT;
756
763
  /* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
757
- EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_THROW;
764
+ EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT;
758
765
  /* return remaining time */
759
- EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW;
766
+ EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT;
760
767
 
761
768
  #if EV_PERIODIC_ENABLE
762
- EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW;
763
- EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW;
764
- EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW;
769
+ EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT;
770
+ EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT;
771
+ EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT;
765
772
  #endif
766
773
 
767
774
  /* only supported in the default loop */
768
775
  #if EV_SIGNAL_ENABLE
769
- EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_THROW;
770
- EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_THROW;
776
+ EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT;
777
+ EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT;
771
778
  #endif
772
779
 
773
780
  /* only supported in the default loop */
774
781
  # if EV_CHILD_ENABLE
775
- EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_THROW;
776
- EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_THROW;
782
+ EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT;
783
+ EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT;
777
784
  # endif
778
785
 
779
786
  # if EV_STAT_ENABLE
780
- EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_THROW;
781
- EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_THROW;
782
- EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_THROW;
787
+ EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT;
788
+ EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT;
789
+ EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT;
783
790
  # endif
784
791
 
785
792
  # if EV_IDLE_ENABLE
786
- EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_THROW;
787
- EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_THROW;
793
+ EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT;
794
+ EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT;
788
795
  # endif
789
796
 
790
797
  #if EV_PREPARE_ENABLE
791
- EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_THROW;
792
- EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW;
798
+ EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT;
799
+ EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT;
793
800
  #endif
794
801
 
795
802
  #if EV_CHECK_ENABLE
796
- EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_THROW;
797
- EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_THROW;
803
+ EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT;
804
+ EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT;
798
805
  #endif
799
806
 
800
807
  # if EV_FORK_ENABLE
801
- EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_THROW;
802
- EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_THROW;
808
+ EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT;
809
+ EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT;
803
810
  # endif
804
811
 
805
812
  # if EV_CLEANUP_ENABLE
806
- EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW;
807
- EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW;
813
+ EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT;
814
+ EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT;
808
815
  # endif
809
816
 
810
817
  # if EV_EMBED_ENABLE
811
818
  /* only supported when loop to be embedded is in fact embeddable */
812
- EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_THROW;
813
- EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_THROW;
814
- EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_THROW;
819
+ EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT;
820
+ EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT;
821
+ EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT;
815
822
  # endif
816
823
 
817
824
  # if EV_ASYNC_ENABLE
818
- EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_THROW;
819
- EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_THROW;
820
- EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_THROW;
825
+ EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT;
826
+ EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT;
827
+ EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT;
821
828
  # endif
822
829
 
823
830
  #if EV_COMPAT3
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev epoll fd activity backend
3
3
  *
4
- * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009,2010,2011,2016,2017,2019 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-
@@ -124,12 +124,14 @@ epoll_modify (EV_P_ int fd, int oev, int nev)
124
124
  /* add fd to epoll_eperms, if not already inside */
125
125
  if (!(oldmask & EV_EMASK_EPERM))
126
126
  {
127
- array_needsize (int, epoll_eperms, epoll_epermmax, epoll_epermcnt + 1, EMPTY2);
127
+ array_needsize (int, epoll_eperms, epoll_epermmax, epoll_epermcnt + 1, array_needsize_noinit);
128
128
  epoll_eperms [epoll_epermcnt++] = fd;
129
129
  }
130
130
 
131
131
  return;
132
132
  }
133
+ else
134
+ assert (("libev: I/O watcher with invalid fd found in epoll_ctl", errno != EBADF && errno != ELOOP && errno != EINVAL));
133
135
 
134
136
  fd_kill (EV_A_ fd);
135
137
 
@@ -235,21 +237,32 @@ epoll_poll (EV_P_ ev_tstamp timeout)
235
237
  }
236
238
  }
237
239
 
238
- inline_size
239
- int
240
- epoll_init (EV_P_ int flags)
240
+ static int
241
+ epoll_epoll_create (void)
241
242
  {
242
- #ifdef EPOLL_CLOEXEC
243
- backend_fd = epoll_create1 (EPOLL_CLOEXEC);
243
+ int fd;
244
+
245
+ #if defined EPOLL_CLOEXEC && !defined __ANDROID__
246
+ fd = epoll_create1 (EPOLL_CLOEXEC);
244
247
 
245
- if (backend_fd < 0 && (errno == EINVAL || errno == ENOSYS))
248
+ if (fd < 0 && (errno == EINVAL || errno == ENOSYS))
246
249
  #endif
247
- backend_fd = epoll_create (256);
250
+ {
251
+ fd = epoll_create (256);
248
252
 
249
- if (backend_fd < 0)
250
- return 0;
253
+ if (fd >= 0)
254
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
255
+ }
251
256
 
252
- fcntl (backend_fd, F_SETFD, FD_CLOEXEC);
257
+ return fd;
258
+ }
259
+
260
+ inline_size
261
+ int
262
+ epoll_init (EV_P_ int flags)
263
+ {
264
+ if ((backend_fd = epoll_epoll_create ()) < 0)
265
+ return 0;
253
266
 
254
267
  backend_mintime = 1e-3; /* epoll does sometimes return early, this is just to avoid the worst */
255
268
  backend_modify = epoll_modify;
@@ -275,11 +288,9 @@ epoll_fork (EV_P)
275
288
  {
276
289
  close (backend_fd);
277
290
 
278
- while ((backend_fd = epoll_create (256)) < 0)
291
+ while ((backend_fd = epoll_epoll_create ()) < 0)
279
292
  ev_syserr ("(libev) epoll_create");
280
293
 
281
- fcntl (backend_fd, F_SETFD, FD_CLOEXEC);
282
-
283
294
  fd_rearm_all (EV_A);
284
295
  }
285
296
 
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev kqueue backend
3
3
  *
4
- * Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2016,2019 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-
@@ -48,7 +48,7 @@ void
48
48
  kqueue_change (EV_P_ int fd, int filter, int flags, int fflags)
49
49
  {
50
50
  ++kqueue_changecnt;
51
- array_needsize (struct kevent, kqueue_changes, kqueue_changemax, kqueue_changecnt, EMPTY2);
51
+ array_needsize (struct kevent, kqueue_changes, kqueue_changemax, kqueue_changecnt, array_needsize_noinit);
52
52
 
53
53
  EV_SET (&kqueue_changes [kqueue_changecnt - 1], fd, filter, flags, fflags, 0, 0);
54
54
  }
@@ -106,7 +106,7 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
106
106
  if (expect_false (res < 0))
107
107
  {
108
108
  if (errno != EINTR)
109
- ev_syserr ("(libev) kevent");
109
+ ev_syserr ("(libev) kqueue kevent");
110
110
 
111
111
  return;
112
112
  }
@@ -129,10 +129,16 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
129
129
  if (fd_valid (fd))
130
130
  kqueue_modify (EV_A_ fd, 0, anfds [fd].events);
131
131
  else
132
- fd_kill (EV_A_ fd);
132
+ {
133
+ assert (("libev: kqueue found invalid fd", 0));
134
+ fd_kill (EV_A_ fd);
135
+ }
133
136
  }
134
137
  else /* on all other errors, we error out on the fd */
135
- fd_kill (EV_A_ fd);
138
+ {
139
+ assert (("libev: kqueue found invalid fd", 0));
140
+ fd_kill (EV_A_ fd);
141
+ }
136
142
  }
137
143
  }
138
144
  else