nio4r 0.4.6 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -46,6 +46,8 @@
46
46
  # define EV_CPP(x)
47
47
  #endif
48
48
 
49
+ #define EV_THROW EV_CPP(throw())
50
+
49
51
  EV_CPP(extern "C" {)
50
52
 
51
53
  /*****************************************************************************/
@@ -56,7 +58,11 @@ EV_CPP(extern "C" {)
56
58
  #endif
57
59
 
58
60
  #ifndef EV_FEATURES
59
- # define EV_FEATURES 0x7f
61
+ # if defined __OPTIMIZE_SIZE__
62
+ # define EV_FEATURES 0x7c
63
+ # else
64
+ # define EV_FEATURES 0x7f
65
+ # endif
60
66
  #endif
61
67
 
62
68
  #define EV_FEATURE_CODE ((EV_FEATURES) & 1)
@@ -199,33 +205,33 @@ struct ev_loop;
199
205
  /*****************************************************************************/
200
206
 
201
207
  #define EV_VERSION_MAJOR 4
202
- #define EV_VERSION_MINOR 11
208
+ #define EV_VERSION_MINOR 15
203
209
 
204
210
  /* eventmask, revents, events... */
205
211
  enum {
206
- EV_UNDEF = 0xFFFFFFFF, /* guaranteed to be invalid */
207
- EV_NONE = 0x00, /* no events */
208
- EV_READ = 0x01, /* ev_io detected read will not block */
209
- EV_WRITE = 0x02, /* ev_io detected write will not block */
210
- EV__IOFDSET = 0x80, /* internal use only */
211
- EV_IO = EV_READ, /* alias for type-detection */
212
- EV_TIMER = 0x00000100, /* timer timed out */
212
+ EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */
213
+ EV_NONE = 0x00, /* no events */
214
+ EV_READ = 0x01, /* ev_io detected read will not block */
215
+ EV_WRITE = 0x02, /* ev_io detected write will not block */
216
+ EV__IOFDSET = 0x80, /* internal use only */
217
+ EV_IO = EV_READ, /* alias for type-detection */
218
+ EV_TIMER = 0x00000100, /* timer timed out */
213
219
  #if EV_COMPAT3
214
- EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */
215
- #endif
216
- EV_PERIODIC = 0x00000200, /* periodic timer timed out */
217
- EV_SIGNAL = 0x00000400, /* signal was received */
218
- EV_CHILD = 0x00000800, /* child/pid had status change */
219
- EV_STAT = 0x00001000, /* stat data changed */
220
- EV_IDLE = 0x00002000, /* event loop is idling */
221
- EV_PREPARE = 0x00004000, /* event loop about to poll */
222
- EV_CHECK = 0x00008000, /* event loop finished poll */
223
- EV_EMBED = 0x00010000, /* embedded event loop needs sweep */
224
- EV_FORK = 0x00020000, /* event loop resumed in child */
225
- EV_CLEANUP = 0x00040000, /* event loop resumed in child */
226
- EV_ASYNC = 0x00080000, /* async intra-loop signal */
227
- EV_CUSTOM = 0x01000000, /* for use by user code */
228
- EV_ERROR = 0x80000000 /* sent when an error occurs */
220
+ EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */
221
+ #endif
222
+ EV_PERIODIC = 0x00000200, /* periodic timer timed out */
223
+ EV_SIGNAL = 0x00000400, /* signal was received */
224
+ EV_CHILD = 0x00000800, /* child/pid had status change */
225
+ EV_STAT = 0x00001000, /* stat data changed */
226
+ EV_IDLE = 0x00002000, /* event loop is idling */
227
+ EV_PREPARE = 0x00004000, /* event loop about to poll */
228
+ EV_CHECK = 0x00008000, /* event loop finished poll */
229
+ EV_EMBED = 0x00010000, /* embedded event loop needs sweep */
230
+ EV_FORK = 0x00020000, /* event loop resumed in child */
231
+ EV_CLEANUP = 0x00040000, /* event loop resumed in child */
232
+ EV_ASYNC = 0x00080000, /* async intra-loop signal */
233
+ EV_CUSTOM = 0x01000000, /* for use by user code */
234
+ EV_ERROR = (int)0x80000000 /* sent when an error occurs */
229
235
  };
230
236
 
231
237
  /* can be used to add custom fields to all watchers, while losing binary compatibility */
@@ -327,7 +333,7 @@ typedef struct ev_periodic
327
333
 
328
334
  ev_tstamp offset; /* rw */
329
335
  ev_tstamp interval; /* rw */
330
- ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now); /* rw */
336
+ ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_THROW; /* rw */
331
337
  } ev_periodic;
332
338
 
333
339
  /* invoked when the given signal has been received */
@@ -514,15 +520,15 @@ enum {
514
520
  };
515
521
 
516
522
  #if EV_PROTOTYPES
517
- EV_API_DECL int ev_version_major (void);
518
- EV_API_DECL int ev_version_minor (void);
523
+ EV_API_DECL int ev_version_major (void) EV_THROW;
524
+ EV_API_DECL int ev_version_minor (void) EV_THROW;
519
525
 
520
- EV_API_DECL unsigned int ev_supported_backends (void);
521
- EV_API_DECL unsigned int ev_recommended_backends (void);
522
- EV_API_DECL unsigned int ev_embeddable_backends (void);
526
+ EV_API_DECL unsigned int ev_supported_backends (void) EV_THROW;
527
+ EV_API_DECL unsigned int ev_recommended_backends (void) EV_THROW;
528
+ EV_API_DECL unsigned int ev_embeddable_backends (void) EV_THROW;
523
529
 
524
- EV_API_DECL ev_tstamp ev_time (void);
525
- EV_API_DECL void ev_sleep (ev_tstamp delay); /* sleep for a while */
530
+ EV_API_DECL ev_tstamp ev_time (void) EV_THROW;
531
+ EV_API_DECL void ev_sleep (ev_tstamp delay) EV_THROW; /* sleep for a while */
526
532
 
527
533
  /* Sets the allocation function to use, works like realloc.
528
534
  * It is used to allocate and free memory.
@@ -530,26 +536,26 @@ EV_API_DECL void ev_sleep (ev_tstamp delay); /* sleep for a while */
530
536
  * or take some potentially destructive action.
531
537
  * The default is your system realloc function.
532
538
  */
533
- EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size));
539
+ EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW;
534
540
 
535
541
  /* set the callback function to call on a
536
542
  * retryable syscall error
537
543
  * (such as failed select, poll, epoll_wait)
538
544
  */
539
- EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg));
545
+ EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW;
540
546
 
541
547
  #if EV_MULTIPLICITY
542
548
 
543
549
  /* the default loop is the only one that handles signals and child watchers */
544
550
  /* you can call this as often as you like */
545
- EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0));
551
+ EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW;
546
552
 
547
553
  #ifdef EV_API_STATIC
548
554
  EV_API_DECL struct ev_loop *ev_default_loop_ptr;
549
555
  #endif
550
556
 
551
557
  EV_INLINE struct ev_loop *
552
- ev_default_loop_uc_ (void)
558
+ ev_default_loop_uc_ (void) EV_THROW
553
559
  {
554
560
  extern struct ev_loop *ev_default_loop_ptr;
555
561
 
@@ -557,31 +563,31 @@ ev_default_loop_uc_ (void)
557
563
  }
558
564
 
559
565
  EV_INLINE int
560
- ev_is_default_loop (EV_P)
566
+ ev_is_default_loop (EV_P) EV_THROW
561
567
  {
562
568
  return EV_A == EV_DEFAULT_UC;
563
569
  }
564
570
 
565
571
  /* create and destroy alternative loops that don't handle signals */
566
- EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0));
572
+ EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_THROW;
567
573
 
568
- EV_API_DECL ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
574
+ EV_API_DECL ev_tstamp ev_now (EV_P) EV_THROW; /* time w.r.t. timers and the eventloop, updated after each poll */
569
575
 
570
576
  #else
571
577
 
572
- EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)); /* returns true when successful */
578
+ EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW; /* returns true when successful */
573
579
 
574
580
  EV_API_DECL ev_tstamp ev_rt_now;
575
581
 
576
582
  EV_INLINE ev_tstamp
577
- ev_now (void)
583
+ ev_now (void) EV_THROW
578
584
  {
579
585
  return ev_rt_now;
580
586
  }
581
587
 
582
588
  /* looks weird, but ev_is_default_loop (EV_A) still works if this exists */
583
589
  EV_INLINE int
584
- ev_is_default_loop (void)
590
+ ev_is_default_loop (void) EV_THROW
585
591
  {
586
592
  return 1;
587
593
  }
@@ -595,17 +601,17 @@ EV_API_DECL void ev_loop_destroy (EV_P);
595
601
  /* when you want to re-use it in the child */
596
602
  /* you can call it in either the parent or the child */
597
603
  /* you can actually call it at any time, anywhere :) */
598
- EV_API_DECL void ev_loop_fork (EV_P);
604
+ EV_API_DECL void ev_loop_fork (EV_P) EV_THROW;
599
605
 
600
- EV_API_DECL unsigned int ev_backend (EV_P); /* backend in use by loop */
606
+ EV_API_DECL unsigned int ev_backend (EV_P) EV_THROW; /* backend in use by loop */
601
607
 
602
- EV_API_DECL void ev_now_update (EV_P); /* update event loop time */
608
+ EV_API_DECL void ev_now_update (EV_P) EV_THROW; /* update event loop time */
603
609
 
604
610
  #if EV_WALK_ENABLE
605
611
  /* walk (almost) all watchers in the loop of a given type, invoking the */
606
612
  /* callback on every such watcher. The callback might stop the watcher, */
607
613
  /* but do nothing else with the loop */
608
- EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w));
614
+ EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW;
609
615
  #endif
610
616
 
611
617
  #endif /* prototypes */
@@ -624,45 +630,45 @@ enum {
624
630
  };
625
631
 
626
632
  #if EV_PROTOTYPES
627
- EV_API_DECL void ev_run (EV_P_ int flags EV_CPP (= 0));
628
- EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)); /* break out of the loop */
633
+ EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0));
634
+ EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_THROW; /* break out of the loop */
629
635
 
630
636
  /*
631
637
  * ref/unref can be used to add or remove a refcount on the mainloop. every watcher
632
638
  * keeps one reference. if you have a long-running watcher you never unregister that
633
639
  * should not keep ev_loop from running, unref() after starting, and ref() before stopping.
634
640
  */
635
- EV_API_DECL void ev_ref (EV_P);
636
- EV_API_DECL void ev_unref (EV_P);
641
+ EV_API_DECL void ev_ref (EV_P) EV_THROW;
642
+ EV_API_DECL void ev_unref (EV_P) EV_THROW;
637
643
 
638
644
  /*
639
645
  * convenience function, wait for a single event, without registering an event watcher
640
646
  * if timeout is < 0, do wait indefinitely
641
647
  */
642
- EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg);
648
+ 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;
643
649
 
644
650
  # if EV_FEATURE_API
645
- EV_API_DECL unsigned int ev_iteration (EV_P); /* number of loop iterations */
646
- EV_API_DECL unsigned int ev_depth (EV_P); /* #ev_loop enters - #ev_loop leaves */
647
- EV_API_DECL void ev_verify (EV_P); /* abort if loop data corrupted */
651
+ EV_API_DECL unsigned int ev_iteration (EV_P) EV_THROW; /* number of loop iterations */
652
+ EV_API_DECL unsigned int ev_depth (EV_P) EV_THROW; /* #ev_loop enters - #ev_loop leaves */
653
+ EV_API_DECL void ev_verify (EV_P) EV_THROW; /* abort if loop data corrupted */
648
654
 
649
- EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
650
- EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
655
+ EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */
656
+ EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */
651
657
 
652
658
  /* advanced stuff for threading etc. support, see docs */
653
- EV_API_DECL void ev_set_userdata (EV_P_ void *data);
654
- EV_API_DECL void *ev_userdata (EV_P);
655
- EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P));
656
- EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P));
659
+ EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_THROW;
660
+ EV_API_DECL void *ev_userdata (EV_P) EV_THROW;
661
+ EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P)) EV_THROW;
662
+ EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P) EV_THROW) EV_THROW;
657
663
 
658
- EV_API_DECL unsigned int ev_pending_count (EV_P); /* number of pending events, if any */
664
+ EV_API_DECL unsigned int ev_pending_count (EV_P) EV_THROW; /* number of pending events, if any */
659
665
  EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */
660
666
 
661
667
  /*
662
668
  * stop/start the timer handling.
663
669
  */
664
- EV_API_DECL void ev_suspend (EV_P);
665
- EV_API_DECL void ev_resume (EV_P);
670
+ EV_API_DECL void ev_suspend (EV_P) EV_THROW;
671
+ EV_API_DECL void ev_resume (EV_P) EV_THROW;
666
672
  #endif
667
673
 
668
674
  #endif
@@ -729,85 +735,85 @@ EV_API_DECL void ev_resume (EV_P);
729
735
 
730
736
  /* feeds an event into a watcher as if the event actually occurred */
731
737
  /* accepts any ev_watcher type */
732
- EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents);
733
- EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents);
738
+ EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_THROW;
739
+ EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW;
734
740
  #if EV_SIGNAL_ENABLE
735
- EV_API_DECL void ev_feed_signal (int signum);
736
- EV_API_DECL void ev_feed_signal_event (EV_P_ int signum);
741
+ EV_API_DECL void ev_feed_signal (int signum) EV_THROW;
742
+ EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_THROW;
737
743
  #endif
738
744
  EV_API_DECL void ev_invoke (EV_P_ void *w, int revents);
739
- EV_API_DECL int ev_clear_pending (EV_P_ void *w);
745
+ EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_THROW;
740
746
 
741
- EV_API_DECL void ev_io_start (EV_P_ ev_io *w);
742
- EV_API_DECL void ev_io_stop (EV_P_ ev_io *w);
747
+ EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_THROW;
748
+ EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_THROW;
743
749
 
744
- EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w);
745
- EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w);
750
+ EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_THROW;
751
+ EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_THROW;
746
752
  /* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
747
- EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w);
753
+ EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_THROW;
748
754
  /* return remaining time */
749
- EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w);
755
+ EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW;
750
756
 
751
757
  #if EV_PERIODIC_ENABLE
752
- EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w);
753
- EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w);
754
- EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w);
758
+ EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW;
759
+ EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW;
760
+ EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW;
755
761
  #endif
756
762
 
757
763
  /* only supported in the default loop */
758
764
  #if EV_SIGNAL_ENABLE
759
- EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w);
760
- EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w);
765
+ EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_THROW;
766
+ EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_THROW;
761
767
  #endif
762
768
 
763
769
  /* only supported in the default loop */
764
770
  # if EV_CHILD_ENABLE
765
- EV_API_DECL void ev_child_start (EV_P_ ev_child *w);
766
- EV_API_DECL void ev_child_stop (EV_P_ ev_child *w);
771
+ EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_THROW;
772
+ EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_THROW;
767
773
  # endif
768
774
 
769
775
  # if EV_STAT_ENABLE
770
- EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w);
771
- EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w);
772
- EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w);
776
+ EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_THROW;
777
+ EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_THROW;
778
+ EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_THROW;
773
779
  # endif
774
780
 
775
781
  # if EV_IDLE_ENABLE
776
- EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w);
777
- EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w);
782
+ EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_THROW;
783
+ EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_THROW;
778
784
  # endif
779
785
 
780
786
  #if EV_PREPARE_ENABLE
781
- EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w);
782
- EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w);
787
+ EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_THROW;
788
+ EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW;
783
789
  #endif
784
790
 
785
791
  #if EV_CHECK_ENABLE
786
- EV_API_DECL void ev_check_start (EV_P_ ev_check *w);
787
- EV_API_DECL void ev_check_stop (EV_P_ ev_check *w);
792
+ EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_THROW;
793
+ EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_THROW;
788
794
  #endif
789
795
 
790
796
  # if EV_FORK_ENABLE
791
- EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w);
792
- EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w);
797
+ EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_THROW;
798
+ EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_THROW;
793
799
  # endif
794
800
 
795
801
  # if EV_CLEANUP_ENABLE
796
- EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w);
797
- EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w);
802
+ EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW;
803
+ EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW;
798
804
  # endif
799
805
 
800
806
  # if EV_EMBED_ENABLE
801
807
  /* only supported when loop to be embedded is in fact embeddable */
802
- EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w);
803
- EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w);
804
- EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w);
808
+ EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_THROW;
809
+ EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_THROW;
810
+ EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_THROW;
805
811
  # endif
806
812
 
807
813
  # if EV_ASYNC_ENABLE
808
- EV_API_DECL void ev_async_start (EV_P_ ev_async *w);
809
- EV_API_DECL void ev_async_stop (EV_P_ ev_async *w);
810
- EV_API_DECL void ev_async_send (EV_P_ ev_async *w);
814
+ EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_THROW;
815
+ EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_THROW;
816
+ EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_THROW;
811
817
  # endif
812
818
 
813
819
  #if EV_COMPAT3
@@ -238,7 +238,7 @@ epoll_init (EV_P_ int flags)
238
238
  #ifdef EPOLL_CLOEXEC
239
239
  backend_fd = epoll_create1 (EPOLL_CLOEXEC);
240
240
 
241
- if (backend_fd < 0)
241
+ if (backend_fd < 0 && (errno == EINVAL || errno == ENOSYS))
242
242
  #endif
243
243
  backend_fd = epoll_create (256);
244
244
 
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev kqueue 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,2012 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-
@@ -155,7 +155,8 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
155
155
  int inline_size
156
156
  kqueue_init (EV_P_ int flags)
157
157
  {
158
- /* Initialize the kernel queue */
158
+ /* initialize the kernel queue */
159
+ kqueue_fd_pid = getpid ();
159
160
  if ((backend_fd = kqueue ()) < 0)
160
161
  return 0;
161
162
 
@@ -185,8 +186,20 @@ kqueue_destroy (EV_P)
185
186
  void inline_size
186
187
  kqueue_fork (EV_P)
187
188
  {
188
- close (backend_fd);
189
-
189
+ /* some BSD kernels don't just destroy the kqueue itself,
190
+ * but also close the fd, which isn't documented, and
191
+ * impossible to support properly.
192
+ * we remember the pid of the kqueue call and only close
193
+ * the fd if the pid is still the same.
194
+ * this leaks fds on sane kernels, but BSD interfaces are
195
+ * notoriously buggy and rarely get fixed.
196
+ */
197
+ pid_t newpid = getpid ();
198
+
199
+ if (newpid == kqueue_fd_pid)
200
+ close (backend_fd);
201
+
202
+ kqueue_fd_pid = newpid;
190
203
  while ((backend_fd = kqueue ()) < 0)
191
204
  ev_syserr ("(libev) kqueue");
192
205
 
@@ -196,3 +209,6 @@ kqueue_fork (EV_P)
196
209
  fd_rearm_all (EV_A);
197
210
  }
198
211
 
212
+ /* sys/event.h defines EV_ERROR */
213
+ #undef EV_ERROR
214
+
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * loop member variable declarations
3
3
  *
4
- * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009,2010,2011,2012 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,6 +43,17 @@ VARx(ev_tstamp, now_floor) /* last time we refreshed rt_time */
43
43
  VARx(ev_tstamp, mn_now) /* monotonic clock "now" */
44
44
  VARx(ev_tstamp, rtmn_diff) /* difference realtime - monotonic time */
45
45
 
46
+ /* for reverse feeding of events */
47
+ VARx(W *, rfeeds)
48
+ VARx(int, rfeedmax)
49
+ VARx(int, rfeedcnt)
50
+
51
+ VAR (pendings, ANPENDING *pendings [NUMPRI])
52
+ VAR (pendingmax, int pendingmax [NUMPRI])
53
+ VAR (pendingcnt, int pendingcnt [NUMPRI])
54
+ VARx(int, pendingpri) /* highest priority currently pending */
55
+ VARx(ev_prepare, pending_w) /* dummy pending watcher */
56
+
46
57
  VARx(ev_tstamp, io_blocktime)
47
58
  VARx(ev_tstamp, timeout_blocktime)
48
59
 
@@ -58,19 +69,6 @@ VAR (backend_poll , void (*backend_poll)(EV_P_ ev_tstamp timeout))
58
69
  VARx(ANFD *, anfds)
59
70
  VARx(int, anfdmax)
60
71
 
61
- VAR (pendings, ANPENDING *pendings [NUMPRI])
62
- VAR (pendingmax, int pendingmax [NUMPRI])
63
- VAR (pendingcnt, int pendingcnt [NUMPRI])
64
- VARx(ev_prepare, pending_w) /* dummy pending watcher */
65
-
66
- /* for reverse feeding of events */
67
- VARx(W *, rfeeds)
68
- VARx(int, rfeedmax)
69
- VARx(int, rfeedcnt)
70
-
71
- #if EV_USE_EVENTFD || EV_GENWRAP
72
- VARx(int, evfd)
73
- #endif
74
72
  VAR (evpipe, int evpipe [2])
75
73
  VARx(ev_io, pipe_w)
76
74
  VARx(EV_ATOMIC_T, pipe_write_wanted)
@@ -110,6 +108,7 @@ VARx(int, epoll_epermmax)
110
108
  #endif
111
109
 
112
110
  #if EV_USE_KQUEUE || EV_GENWRAP
111
+ VARx(pid_t, kqueue_fd_pid)
113
112
  VARx(struct kevent *, kqueue_changes)
114
113
  VARx(int, kqueue_changemax)
115
114
  VARx(int, kqueue_changecnt)
@@ -195,8 +194,8 @@ VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */
195
194
  VARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */
196
195
 
197
196
  VARx(void *, userdata)
198
- VAR (release_cb, void (*release_cb)(EV_P))
199
- VAR (acquire_cb, void (*acquire_cb)(EV_P))
197
+ VAR (release_cb, void (*release_cb)(EV_P) EV_THROW)
198
+ VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_THROW)
200
199
  VAR (invoke_cb , void (*invoke_cb) (EV_P))
201
200
  #endif
202
201