nio4r 1.2.1 → 2.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/workflow.yml +43 -0
- data/.gitignore +1 -0
- data/.rspec +0 -1
- data/.rubocop.yml +70 -31
- data/CHANGES.md +190 -42
- data/Gemfile +8 -4
- data/Guardfile +10 -0
- data/README.md +102 -147
- data/Rakefile +3 -4
- data/examples/echo_server.rb +3 -2
- data/ext/libev/Changes +44 -13
- data/ext/libev/README +2 -1
- data/ext/libev/ev.c +314 -225
- data/ext/libev/ev.h +90 -88
- data/ext/libev/ev_epoll.c +30 -16
- data/ext/libev/ev_kqueue.c +19 -9
- data/ext/libev/ev_linuxaio.c +642 -0
- data/ext/libev/ev_poll.c +19 -11
- data/ext/libev/ev_port.c +13 -6
- data/ext/libev/ev_select.c +4 -2
- data/ext/libev/ev_vars.h +14 -3
- data/ext/libev/ev_wrap.h +16 -0
- data/ext/nio4r/bytebuffer.c +429 -0
- data/ext/nio4r/extconf.rb +17 -30
- data/ext/nio4r/monitor.c +113 -49
- data/ext/nio4r/nio4r.h +11 -13
- data/ext/nio4r/org/nio4r/ByteBuffer.java +293 -0
- data/ext/nio4r/org/nio4r/Monitor.java +175 -0
- data/ext/nio4r/org/nio4r/Nio4r.java +22 -391
- data/ext/nio4r/org/nio4r/Selector.java +299 -0
- data/ext/nio4r/selector.c +155 -68
- data/lib/nio.rb +4 -4
- data/lib/nio/bytebuffer.rb +229 -0
- data/lib/nio/monitor.rb +73 -11
- data/lib/nio/selector.rb +64 -21
- data/lib/nio/version.rb +1 -1
- data/nio4r.gemspec +34 -20
- data/{tasks → rakelib}/extension.rake +4 -0
- data/{tasks → rakelib}/rspec.rake +2 -0
- data/{tasks → rakelib}/rubocop.rake +2 -0
- data/spec/nio/acceptables_spec.rb +5 -5
- data/spec/nio/bytebuffer_spec.rb +354 -0
- data/spec/nio/monitor_spec.rb +128 -79
- data/spec/nio/selectables/pipe_spec.rb +12 -3
- data/spec/nio/selectables/ssl_socket_spec.rb +61 -29
- data/spec/nio/selectables/tcp_socket_spec.rb +47 -34
- data/spec/nio/selectables/udp_socket_spec.rb +24 -7
- data/spec/nio/selector_spec.rb +65 -16
- data/spec/spec_helper.rb +12 -3
- data/spec/support/selectable_examples.rb +45 -18
- metadata +33 -23
- data/.rubocop_todo.yml +0 -35
- data/.travis.yml +0 -27
- data/LICENSE.txt +0 -20
- data/ext/libev/README.embed +0 -3
- data/ext/libev/test_libev_win32.c +0 -123
data/ext/libev/ev.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libev native API header
|
3
3
|
*
|
4
|
-
* Copyright (c) 2007
|
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
|
46
|
+
# define EV_NOEXCEPT noexcept
|
47
47
|
# else
|
48
|
-
# define
|
48
|
+
# define EV_NOEXCEPT
|
49
49
|
# endif
|
50
50
|
#else
|
51
51
|
# define EV_CPP(x)
|
52
|
-
# define
|
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
|
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)
|
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
|
519
|
-
EVBACKEND_POLL
|
520
|
-
EVBACKEND_EPOLL
|
521
|
-
EVBACKEND_KQUEUE
|
522
|
-
EVBACKEND_DEVPOLL
|
523
|
-
EVBACKEND_PORT
|
524
|
-
|
525
|
-
|
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)
|
530
|
-
EV_API_DECL int ev_version_minor (void)
|
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)
|
533
|
-
EV_API_DECL unsigned int ev_recommended_backends (void)
|
534
|
-
EV_API_DECL unsigned int ev_embeddable_backends (void)
|
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)
|
537
|
-
EV_API_DECL void ev_sleep (ev_tstamp delay)
|
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,
|
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)
|
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))
|
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)
|
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)
|
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))
|
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)
|
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))
|
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)
|
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)
|
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)
|
612
|
+
EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT;
|
611
613
|
|
612
|
-
EV_API_DECL unsigned int ev_backend (EV_P)
|
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)
|
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))
|
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))
|
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)
|
648
|
-
EV_API_DECL void ev_unref (EV_P)
|
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)
|
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)
|
658
|
-
EV_API_DECL unsigned int ev_depth (EV_P)
|
659
|
-
EV_API_DECL void ev_verify (EV_P)
|
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)
|
662
|
-
EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval)
|
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)
|
666
|
-
EV_API_DECL void *ev_userdata (EV_P)
|
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)
|
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)
|
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)
|
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)
|
679
|
-
EV_API_DECL void ev_resume (EV_P)
|
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)
|
748
|
-
EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents)
|
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)
|
751
|
-
EV_API_DECL void ev_feed_signal_event (EV_P_ int signum)
|
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)
|
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)
|
757
|
-
EV_API_DECL void ev_io_stop (EV_P_ ev_io *w)
|
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)
|
760
|
-
EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w)
|
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)
|
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)
|
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)
|
768
|
-
EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w)
|
769
|
-
EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w)
|
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)
|
775
|
-
EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w)
|
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)
|
781
|
-
EV_API_DECL void ev_child_stop (EV_P_ ev_child *w)
|
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)
|
786
|
-
EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w)
|
787
|
-
EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w)
|
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)
|
792
|
-
EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w)
|
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)
|
797
|
-
EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w)
|
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)
|
802
|
-
EV_API_DECL void ev_check_stop (EV_P_ ev_check *w)
|
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)
|
807
|
-
EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w)
|
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)
|
812
|
-
EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w)
|
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)
|
818
|
-
EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w)
|
819
|
-
EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w)
|
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)
|
824
|
-
EV_API_DECL void ev_async_stop (EV_P_ ev_async *w)
|
825
|
-
EV_API_DECL void ev_async_send (EV_P_ ev_async *w)
|
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
|
data/ext/libev/ev_epoll.c
CHANGED
@@ -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,
|
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
|
239
|
-
|
240
|
+
static int
|
241
|
+
epoll_epoll_create (void)
|
240
242
|
{
|
241
|
-
|
242
|
-
|
243
|
+
int fd;
|
244
|
+
|
245
|
+
#if defined EPOLL_CLOEXEC && !defined __ANDROID__
|
246
|
+
fd = epoll_create1 (EPOLL_CLOEXEC);
|
243
247
|
|
244
|
-
if (
|
248
|
+
if (fd < 0 && (errno == EINVAL || errno == ENOSYS))
|
245
249
|
#endif
|
246
|
-
|
250
|
+
{
|
251
|
+
fd = epoll_create (256);
|
247
252
|
|
248
|
-
|
249
|
-
|
253
|
+
if (fd >= 0)
|
254
|
+
fcntl (fd, F_SETFD, FD_CLOEXEC);
|
255
|
+
}
|
250
256
|
|
251
|
-
|
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
|
-
|
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
|
-
|
285
|
+
inline_size
|
286
|
+
void
|
271
287
|
epoll_fork (EV_P)
|
272
288
|
{
|
273
289
|
close (backend_fd);
|
274
290
|
|
275
|
-
while ((backend_fd =
|
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
|
|