nio4r 1.2.1 → 2.5.3

Sign up to get free protection for your applications and to get access to all the features.
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