nio4r 1.2.1 → 2.5.3

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 (57) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/workflow.yml +43 -0
  3. data/.gitignore +1 -0
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +70 -31
  6. data/CHANGES.md +190 -42
  7. data/Gemfile +8 -4
  8. data/Guardfile +10 -0
  9. data/README.md +102 -147
  10. data/Rakefile +3 -4
  11. data/examples/echo_server.rb +3 -2
  12. data/ext/libev/Changes +44 -13
  13. data/ext/libev/README +2 -1
  14. data/ext/libev/ev.c +314 -225
  15. data/ext/libev/ev.h +90 -88
  16. data/ext/libev/ev_epoll.c +30 -16
  17. data/ext/libev/ev_kqueue.c +19 -9
  18. data/ext/libev/ev_linuxaio.c +642 -0
  19. data/ext/libev/ev_poll.c +19 -11
  20. data/ext/libev/ev_port.c +13 -6
  21. data/ext/libev/ev_select.c +4 -2
  22. data/ext/libev/ev_vars.h +14 -3
  23. data/ext/libev/ev_wrap.h +16 -0
  24. data/ext/nio4r/bytebuffer.c +429 -0
  25. data/ext/nio4r/extconf.rb +17 -30
  26. data/ext/nio4r/monitor.c +113 -49
  27. data/ext/nio4r/nio4r.h +11 -13
  28. data/ext/nio4r/org/nio4r/ByteBuffer.java +293 -0
  29. data/ext/nio4r/org/nio4r/Monitor.java +175 -0
  30. data/ext/nio4r/org/nio4r/Nio4r.java +22 -391
  31. data/ext/nio4r/org/nio4r/Selector.java +299 -0
  32. data/ext/nio4r/selector.c +155 -68
  33. data/lib/nio.rb +4 -4
  34. data/lib/nio/bytebuffer.rb +229 -0
  35. data/lib/nio/monitor.rb +73 -11
  36. data/lib/nio/selector.rb +64 -21
  37. data/lib/nio/version.rb +1 -1
  38. data/nio4r.gemspec +34 -20
  39. data/{tasks → rakelib}/extension.rake +4 -0
  40. data/{tasks → rakelib}/rspec.rake +2 -0
  41. data/{tasks → rakelib}/rubocop.rake +2 -0
  42. data/spec/nio/acceptables_spec.rb +5 -5
  43. data/spec/nio/bytebuffer_spec.rb +354 -0
  44. data/spec/nio/monitor_spec.rb +128 -79
  45. data/spec/nio/selectables/pipe_spec.rb +12 -3
  46. data/spec/nio/selectables/ssl_socket_spec.rb +61 -29
  47. data/spec/nio/selectables/tcp_socket_spec.rb +47 -34
  48. data/spec/nio/selectables/udp_socket_spec.rb +24 -7
  49. data/spec/nio/selector_spec.rb +65 -16
  50. data/spec/spec_helper.rb +12 -3
  51. data/spec/support/selectable_examples.rb +45 -18
  52. metadata +33 -23
  53. data/.rubocop_todo.yml +0 -35
  54. data/.travis.yml +0 -27
  55. data/LICENSE.txt +0 -20
  56. data/ext/libev/README.embed +0 -3
  57. 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,14 +43,15 @@
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
 
@@ -211,7 +212,7 @@ struct ev_loop;
211
212
  /*****************************************************************************/
212
213
 
213
214
  #define EV_VERSION_MAJOR 4
214
- #define EV_VERSION_MINOR 22
215
+ #define EV_VERSION_MINOR 27
215
216
 
216
217
  /* eventmask, revents, events... */
217
218
  enum {
@@ -339,7 +340,7 @@ typedef struct ev_periodic
339
340
 
340
341
  ev_tstamp offset; /* rw */
341
342
  ev_tstamp interval; /* rw */
342
- 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 */
343
344
  } ev_periodic;
344
345
 
345
346
  /* invoked when the given signal has been received */
@@ -515,26 +516,27 @@ enum {
515
516
 
516
517
  /* method bits to be ored together */
517
518
  enum {
518
- EVBACKEND_SELECT = 0x00000001U, /* about anywhere */
519
- EVBACKEND_POLL = 0x00000002U, /* !win */
520
- EVBACKEND_EPOLL = 0x00000004U, /* linux */
521
- EVBACKEND_KQUEUE = 0x00000008U, /* bsd */
522
- EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */
523
- EVBACKEND_PORT = 0x00000020U, /* solaris 10 */
524
- EVBACKEND_ALL = 0x0000003FU, /* all known backends */
525
- 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 */
526
528
  };
527
529
 
528
530
  #if EV_PROTOTYPES
529
- EV_API_DECL int ev_version_major (void) EV_THROW;
530
- 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;
531
533
 
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;
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;
535
537
 
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 */
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 */
538
540
 
539
541
  /* Sets the allocation function to use, works like realloc.
540
542
  * It is used to allocate and free memory.
@@ -542,26 +544,26 @@ EV_API_DECL void ev_sleep (ev_tstamp delay) EV_THROW; /* sleep for a while */
542
544
  * or take some potentially destructive action.
543
545
  * The default is your system realloc function.
544
546
  */
545
- 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;
546
548
 
547
549
  /* set the callback function to call on a
548
550
  * retryable syscall error
549
551
  * (such as failed select, poll, epoll_wait)
550
552
  */
551
- 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;
552
554
 
553
555
  #if EV_MULTIPLICITY
554
556
 
555
557
  /* the default loop is the only one that handles signals and child watchers */
556
558
  /* you can call this as often as you like */
557
- 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;
558
560
 
559
561
  #ifdef EV_API_STATIC
560
562
  EV_API_DECL struct ev_loop *ev_default_loop_ptr;
561
563
  #endif
562
564
 
563
565
  EV_INLINE struct ev_loop *
564
- ev_default_loop_uc_ (void) EV_THROW
566
+ ev_default_loop_uc_ (void) EV_NOEXCEPT
565
567
  {
566
568
  extern struct ev_loop *ev_default_loop_ptr;
567
569
 
@@ -569,31 +571,31 @@ ev_default_loop_uc_ (void) EV_THROW
569
571
  }
570
572
 
571
573
  EV_INLINE int
572
- ev_is_default_loop (EV_P) EV_THROW
574
+ ev_is_default_loop (EV_P) EV_NOEXCEPT
573
575
  {
574
576
  return EV_A == EV_DEFAULT_UC;
575
577
  }
576
578
 
577
579
  /* create and destroy alternative loops that don't handle signals */
578
- 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;
579
581
 
580
- 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 */
581
583
 
582
584
  #else
583
585
 
584
- 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 */
585
587
 
586
588
  EV_API_DECL ev_tstamp ev_rt_now;
587
589
 
588
590
  EV_INLINE ev_tstamp
589
- ev_now (void) EV_THROW
591
+ ev_now (void) EV_NOEXCEPT
590
592
  {
591
593
  return ev_rt_now;
592
594
  }
593
595
 
594
596
  /* looks weird, but ev_is_default_loop (EV_A) still works if this exists */
595
597
  EV_INLINE int
596
- ev_is_default_loop (void) EV_THROW
598
+ ev_is_default_loop (void) EV_NOEXCEPT
597
599
  {
598
600
  return 1;
599
601
  }
@@ -607,17 +609,17 @@ EV_API_DECL void ev_loop_destroy (EV_P);
607
609
  /* when you want to re-use it in the child */
608
610
  /* you can call it in either the parent or the child */
609
611
  /* you can actually call it at any time, anywhere :) */
610
- EV_API_DECL void ev_loop_fork (EV_P) EV_THROW;
612
+ EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT;
611
613
 
612
- 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 */
613
615
 
614
- 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 */
615
617
 
616
618
  #if EV_WALK_ENABLE
617
619
  /* walk (almost) all watchers in the loop of a given type, invoking the */
618
620
  /* callback on every such watcher. The callback might stop the watcher, */
619
621
  /* but do nothing else with the loop */
620
- 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;
621
623
  #endif
622
624
 
623
625
  #endif /* prototypes */
@@ -637,46 +639,46 @@ enum {
637
639
 
638
640
  #if EV_PROTOTYPES
639
641
  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 */
642
+ EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */
641
643
 
642
644
  /*
643
645
  * ref/unref can be used to add or remove a refcount on the mainloop. every watcher
644
646
  * keeps one reference. if you have a long-running watcher you never unregister that
645
647
  * should not keep ev_loop from running, unref() after starting, and ref() before stopping.
646
648
  */
647
- EV_API_DECL void ev_ref (EV_P) EV_THROW;
648
- 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;
649
651
 
650
652
  /*
651
653
  * convenience function, wait for a single event, without registering an event watcher
652
654
  * if timeout is < 0, do wait indefinitely
653
655
  */
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;
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;
655
657
 
656
658
  # if EV_FEATURE_API
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 */
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 */
660
662
 
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 */
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 */
663
665
 
664
666
  /* advanced stuff for threading etc. support, see docs */
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
+ EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT;
668
+ EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT;
667
669
  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;
670
+ EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT;
669
671
  /* 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;
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;
671
673
 
672
- 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 */
673
675
  EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */
674
676
 
675
677
  /*
676
678
  * stop/start the timer handling.
677
679
  */
678
- EV_API_DECL void ev_suspend (EV_P) EV_THROW;
679
- 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;
680
682
  #endif
681
683
 
682
684
  #endif
@@ -744,85 +746,85 @@ EV_API_DECL void ev_resume (EV_P) EV_THROW;
744
746
 
745
747
  /* feeds an event into a watcher as if the event actually occurred */
746
748
  /* accepts any ev_watcher type */
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;
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;
749
751
  #if EV_SIGNAL_ENABLE
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;
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;
752
754
  #endif
753
755
  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;
756
+ EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT;
755
757
 
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;
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;
758
760
 
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;
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;
761
763
  /* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
762
- 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;
763
765
  /* return remaining time */
764
- 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;
765
767
 
766
768
  #if EV_PERIODIC_ENABLE
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;
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;
770
772
  #endif
771
773
 
772
774
  /* only supported in the default loop */
773
775
  #if EV_SIGNAL_ENABLE
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;
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;
776
778
  #endif
777
779
 
778
780
  /* only supported in the default loop */
779
781
  # if EV_CHILD_ENABLE
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;
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;
782
784
  # endif
783
785
 
784
786
  # if EV_STAT_ENABLE
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;
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;
788
790
  # endif
789
791
 
790
792
  # if EV_IDLE_ENABLE
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;
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;
793
795
  # endif
794
796
 
795
797
  #if EV_PREPARE_ENABLE
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;
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;
798
800
  #endif
799
801
 
800
802
  #if EV_CHECK_ENABLE
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;
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;
803
805
  #endif
804
806
 
805
807
  # if EV_FORK_ENABLE
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;
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;
808
810
  # endif
809
811
 
810
812
  # if EV_CLEANUP_ENABLE
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;
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;
813
815
  # endif
814
816
 
815
817
  # if EV_EMBED_ENABLE
816
818
  /* only supported when loop to be embedded is in fact embeddable */
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;
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;
820
822
  # endif
821
823
 
822
824
  # if EV_ASYNC_ENABLE
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;
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;
826
828
  # endif
827
829
 
828
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,20 +237,32 @@ epoll_poll (EV_P_ ev_tstamp timeout)
235
237
  }
236
238
  }
237
239
 
238
- int inline_size
239
- epoll_init (EV_P_ int flags)
240
+ static int
241
+ epoll_epoll_create (void)
240
242
  {
241
- #ifdef EPOLL_CLOEXEC
242
- backend_fd = epoll_create1 (EPOLL_CLOEXEC);
243
+ int fd;
244
+
245
+ #if defined EPOLL_CLOEXEC && !defined __ANDROID__
246
+ fd = epoll_create1 (EPOLL_CLOEXEC);
243
247
 
244
- if (backend_fd < 0 && (errno == EINVAL || errno == ENOSYS))
248
+ if (fd < 0 && (errno == EINVAL || errno == ENOSYS))
245
249
  #endif
246
- backend_fd = epoll_create (256);
250
+ {
251
+ fd = epoll_create (256);
247
252
 
248
- if (backend_fd < 0)
249
- return 0;
253
+ if (fd >= 0)
254
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
255
+ }
250
256
 
251
- 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;
252
266
 
253
267
  backend_mintime = 1e-3; /* epoll does sometimes return early, this is just to avoid the worst */
254
268
  backend_modify = epoll_modify;
@@ -260,23 +274,23 @@ epoll_init (EV_P_ int flags)
260
274
  return EVBACKEND_EPOLL;
261
275
  }
262
276
 
263
- void inline_size
277
+ inline_size
278
+ void
264
279
  epoll_destroy (EV_P)
265
280
  {
266
281
  ev_free (epoll_events);
267
282
  array_free (epoll_eperm, EMPTY);
268
283
  }
269
284
 
270
- void inline_size
285
+ inline_size
286
+ void
271
287
  epoll_fork (EV_P)
272
288
  {
273
289
  close (backend_fd);
274
290
 
275
- while ((backend_fd = epoll_create (256)) < 0)
291
+ while ((backend_fd = epoll_epoll_create ()) < 0)
276
292
  ev_syserr ("(libev) epoll_create");
277
293
 
278
- fcntl (backend_fd, F_SETFD, FD_CLOEXEC);
279
-
280
294
  fd_rearm_all (EV_A);
281
295
  }
282
296