nio4r 2.4.0 → 2.5.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +15 -0
- data/CHANGES.md +23 -0
- data/README.md +31 -6
- data/ext/libev/Changes +20 -1
- data/ext/libev/README +2 -1
- data/ext/libev/ev.c +109 -59
- data/ext/libev/ev.h +11 -10
- data/ext/libev/ev_epoll.c +25 -14
- data/ext/libev/ev_kqueue.c +11 -5
- data/ext/libev/ev_linuxaio.c +642 -0
- data/ext/libev/ev_poll.c +13 -8
- data/ext/libev/ev_port.c +5 -2
- data/ext/libev/ev_vars.h +12 -1
- data/ext/libev/ev_wrap.h +16 -0
- data/ext/nio4r/org/nio4r/Selector.java +5 -1
- data/lib/nio/version.rb +1 -1
- data/spec/nio/selector_spec.rb +23 -4
- metadata +4 -4
- data/LICENSE.txt +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6a583408aa1022eb39933974b8d93536a4deedc497e4bcbf15afe70cce85aae
|
4
|
+
data.tar.gz: 39bf6f00cc0b1386354cbdbafe8616d3be0221aa1a519ba1888a55fb17145049
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa5347e538b5a8c83a3c92cb83375af906bc2af1c38b76f69c1d33495bee264bda59ce72e9c28c6246a94c6ff7d8db1c9879ab95c2ff343eff1ac04e5b6afe22
|
7
|
+
data.tar.gz: afaa2cd96dc17e0f8738922b44d92ece039d5b66240a5e5f67e695d8b6c20744ec2ab49b1c4a0c0d0d8e5bd22617ade144294f7767576f5d033ce73de4934061
|
data/.travis.yml
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
language: ruby
|
2
2
|
cache: bundler
|
3
3
|
dist: xenial
|
4
|
+
env: OS="xenial 16.04"
|
4
5
|
bundler_args: --without development
|
5
6
|
|
7
|
+
after_script:
|
8
|
+
- ruby -ropenssl -e "puts ENV['OS'], RUBY_DESCRIPTION, OpenSSL::OPENSSL_LIBRARY_VERSION"
|
9
|
+
|
6
10
|
matrix:
|
7
11
|
fast_finish: true
|
8
12
|
include:
|
@@ -12,8 +16,19 @@ matrix:
|
|
12
16
|
- rvm: 2.6
|
13
17
|
env: NIO4R_PURE=true
|
14
18
|
- rvm: 2.6
|
19
|
+
- rvm: 2.3
|
20
|
+
dist: trusty
|
21
|
+
env: OS="trusty 14.04"
|
22
|
+
- rvm: 2.6.3
|
23
|
+
dist: bionic
|
24
|
+
env: OS="bionic 18.04"
|
15
25
|
- rvm: 2.6
|
16
26
|
os: osx
|
27
|
+
env: OS="osx"
|
28
|
+
- rvm: 2.4.6
|
29
|
+
os: osx
|
30
|
+
osx_image: xcode10.2
|
31
|
+
env: OS="osx xcode 10.2"
|
17
32
|
- rvm: truffleruby
|
18
33
|
- rvm: truffleruby
|
19
34
|
env: NIO4R_PURE=true
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
## 2.4.0 (2019-07-07)
|
2
|
+
|
3
|
+
* [#211](https://github.com/socketry/nio4r/pull/211)
|
4
|
+
Enable KQUEUE on macOS 10.14+.
|
5
|
+
([@ioquatix])
|
6
|
+
|
7
|
+
* Bump minimum supported Ruby to 2.3.
|
8
|
+
([@ioquatix])
|
9
|
+
|
10
|
+
* Assorted fixes for TruffleRuby & JRuby.
|
11
|
+
([@eregon], [@olleolleolle])
|
12
|
+
|
13
|
+
* Update libev to v4.25.
|
14
|
+
([@ioquatix])
|
15
|
+
|
16
|
+
* Bind to ephemeral (port 0) for more reliable specs.
|
17
|
+
([@ioquatix])
|
18
|
+
|
19
|
+
* Improve handling of SSL sockets and related specs.
|
20
|
+
([@MSP-Greg])
|
21
|
+
|
1
22
|
## 2.3.1 (2018-05-03)
|
2
23
|
|
3
24
|
* [#188](https://github.com/socketry/nio4r/pull/188)
|
@@ -219,3 +240,5 @@
|
|
219
240
|
[@HoneyryderChuck]: https://github.com/HoneyryderChuck
|
220
241
|
[@tompng]: https://github.com/tompng
|
221
242
|
[@ioquatix]: https://github.com/ioquatix
|
243
|
+
[@eregon]: https://github.com/eregon
|
244
|
+
[@olleolleolle]: https://github.com/olleolleolle
|
data/README.md
CHANGED
@@ -27,10 +27,12 @@ writing.
|
|
27
27
|
* [ActionCable]: Rails 5 WebSocket protocol, uses nio4r for a WebSocket server
|
28
28
|
* [Celluloid::IO]: Actor-based concurrency framework, uses nio4r for async I/O
|
29
29
|
* [Socketry Async]: Asynchronous I/O framework for Ruby
|
30
|
+
* [Puma]: Ruby/Rack web server built for concurrency
|
30
31
|
|
31
32
|
[ActionCable]: https://rubygems.org/gems/actioncable
|
32
33
|
[Celluloid::IO]: https://github.com/celluloid/celluloid-io
|
33
34
|
[Socketry Async]: https://github.com/socketry/async
|
35
|
+
[Puma]: https://github.com/puma/puma
|
34
36
|
|
35
37
|
## Goals
|
36
38
|
|
@@ -45,7 +47,8 @@ writing.
|
|
45
47
|
* Ruby 2.4
|
46
48
|
* Ruby 2.5
|
47
49
|
* Ruby 2.6
|
48
|
-
* JRuby
|
50
|
+
* [JRuby](https://github.com/jruby/jruby)
|
51
|
+
* [TruffleRuby](https://github.com/oracle/truffleruby)
|
49
52
|
|
50
53
|
## Supported backends
|
51
54
|
|
@@ -96,11 +99,33 @@ to maintain a large codebase.
|
|
96
99
|
|
97
100
|
## License
|
98
101
|
|
99
|
-
|
100
|
-
See [LICENSE.txt] for further details.
|
102
|
+
Released under the MIT license.
|
101
103
|
|
102
|
-
|
103
|
-
|
104
|
+
Copyright, 2019, by Tony Arcieri.
|
105
|
+
Copyright, 2019, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams).
|
106
|
+
|
107
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
108
|
+
of this software and associated documentation files (the "Software"), to deal
|
109
|
+
in the Software without restriction, including without limitation the rights
|
110
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
111
|
+
copies of the Software, and to permit persons to whom the Software is
|
112
|
+
furnished to do so, subject to the following conditions:
|
113
|
+
|
114
|
+
The above copyright notice and this permission notice shall be included in
|
115
|
+
all copies or substantial portions of the Software.
|
116
|
+
|
117
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
118
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
119
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
120
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
121
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
122
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
123
|
+
THE SOFTWARE.
|
124
|
+
|
125
|
+
### libev
|
126
|
+
|
127
|
+
Released under the BSD license. See [ext/libev/LICENSE] for details.
|
128
|
+
|
129
|
+
Copyright, 2007-2019, by Marc Alexander Lehmann.
|
104
130
|
|
105
|
-
[LICENSE.txt]: https://github.com/socketry/nio4r/blob/master/LICENSE.txt
|
106
131
|
[ext/libev/LICENSE]: https://github.com/socketry/nio4r/blob/master/ext/libev/LICENSE
|
data/ext/libev/Changes
CHANGED
@@ -1,8 +1,27 @@
|
|
1
1
|
Revision history for libev, a high-performance and full-featured event loop.
|
2
2
|
|
3
|
+
4.27 Thu Jun 27 22:43:44 CEST 2019
|
4
|
+
- linux aio backend almost complete rewritten to work around its
|
5
|
+
limitations.
|
6
|
+
- epoll backend now mandatory for linux aio backend.
|
7
|
+
- fail assertions more aggressively on invalid fd's detected
|
8
|
+
in the event loop, do not just silently fd_kill in case of
|
9
|
+
user error.
|
10
|
+
- ev_io_start/ev_io_stop now verify the watcher fd using
|
11
|
+
a syscall when EV_VERIFY is 2 or higher.
|
12
|
+
|
13
|
+
4.26 (EV only)
|
14
|
+
- update to libecb 0x00010006.
|
15
|
+
- new experimental linux aio backend (linux 4.18+).
|
16
|
+
- removed redundant 0-ptr check in ev_once.
|
17
|
+
- updated/extended ev_set_allocator documentation.
|
18
|
+
- replaced EMPTY2 macro by array_needsize_noinit.
|
19
|
+
- minor code cleanups.
|
20
|
+
- epoll backend now uses epoll_create1 also after fork.
|
21
|
+
|
3
22
|
4.25 Fri Dec 21 07:49:20 CET 2018
|
4
23
|
- INCOMPATIBLE CHANGE: EV_THROW was renamed to EV_NOEXCEPT
|
5
|
-
(EV_THROW
|
24
|
+
(EV_THROW still provided) and now uses noexcept on C++11 or newer.
|
6
25
|
- move the darwin select workaround highe rin ev.c, as newer versions of
|
7
26
|
darwin managed to break their broken select even more.
|
8
27
|
- ANDROID => __ANDROID__ (reported by enh@google.com).
|
data/ext/libev/README
CHANGED
@@ -18,7 +18,8 @@ ABOUT
|
|
18
18
|
- extensive and detailed, readable documentation (not doxygen garbage).
|
19
19
|
- fully supports fork, can detect fork in various ways and automatically
|
20
20
|
re-arms kernel mechanisms that do not support fork.
|
21
|
-
- highly optimised select, poll, epoll,
|
21
|
+
- highly optimised select, poll, linux epoll, linux aio, bsd kqueue
|
22
|
+
and solaris event ports backends.
|
22
23
|
- filesystem object (path) watching (with optional linux inotify support).
|
23
24
|
- wallclock-based times (using absolute time, cron-like).
|
24
25
|
- relative timers/timeouts (handle time jumps).
|
data/ext/libev/ev.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libev event processing core, watcher management
|
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-
|
@@ -126,6 +126,15 @@
|
|
126
126
|
# define EV_USE_EPOLL 0
|
127
127
|
# endif
|
128
128
|
|
129
|
+
# if HAVE_LINUX_AIO_ABI_H
|
130
|
+
# ifndef EV_USE_LINUXAIO
|
131
|
+
# define EV_USE_LINUXAIO EV_FEATURE_BACKENDS
|
132
|
+
# endif
|
133
|
+
# else
|
134
|
+
# undef EV_USE_LINUXAIO
|
135
|
+
# define EV_USE_LINUXAIO 0
|
136
|
+
# endif
|
137
|
+
|
129
138
|
# if HAVE_KQUEUE && HAVE_SYS_EVENT_H
|
130
139
|
# ifndef EV_USE_KQUEUE
|
131
140
|
# define EV_USE_KQUEUE EV_FEATURE_BACKENDS
|
@@ -326,6 +335,14 @@
|
|
326
335
|
# define EV_USE_PORT 0
|
327
336
|
#endif
|
328
337
|
|
338
|
+
#ifndef EV_USE_LINUXAIO
|
339
|
+
# if __linux /* libev currently assumes linux/aio_abi.h is always available on linux */
|
340
|
+
# define EV_USE_LINUXAIO 1
|
341
|
+
# else
|
342
|
+
# define EV_USE_LINUXAIO 0
|
343
|
+
# endif
|
344
|
+
#endif
|
345
|
+
|
329
346
|
#ifndef EV_USE_INOTIFY
|
330
347
|
# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4))
|
331
348
|
# define EV_USE_INOTIFY EV_FEATURE_OS
|
@@ -430,6 +447,14 @@
|
|
430
447
|
# endif
|
431
448
|
#endif
|
432
449
|
|
450
|
+
#if EV_USE_LINUXAIO
|
451
|
+
# include <sys/syscall.h>
|
452
|
+
# if !SYS_io_getevents || !EV_USE_EPOLL /* ev_linxaio uses ev_poll.c:ev_epoll_create */
|
453
|
+
# undef EV_USE_LINUXAIO
|
454
|
+
# define EV_USE_LINUXAIO 0
|
455
|
+
# endif
|
456
|
+
#endif
|
457
|
+
|
433
458
|
#if EV_USE_INOTIFY
|
434
459
|
# include <sys/statfs.h>
|
435
460
|
# include <sys/inotify.h>
|
@@ -545,7 +570,7 @@ struct signalfd_siginfo
|
|
545
570
|
#define ECB_H
|
546
571
|
|
547
572
|
/* 16 bits major, 16 bits minor */
|
548
|
-
#define ECB_VERSION
|
573
|
+
#define ECB_VERSION 0x00010006
|
549
574
|
|
550
575
|
#ifdef _WIN32
|
551
576
|
typedef signed char int8_t;
|
@@ -669,6 +694,7 @@ struct signalfd_siginfo
|
|
669
694
|
|
670
695
|
#ifndef ECB_MEMORY_FENCE
|
671
696
|
#if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110
|
697
|
+
#define ECB_MEMORY_FENCE_RELAXED __asm__ __volatile__ ("" : : : "memory")
|
672
698
|
#if __i386 || __i386__
|
673
699
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory")
|
674
700
|
#define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory")
|
@@ -728,12 +754,14 @@ struct signalfd_siginfo
|
|
728
754
|
#define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST)
|
729
755
|
#define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE)
|
730
756
|
#define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE)
|
757
|
+
#define ECB_MEMORY_FENCE_RELAXED __atomic_thread_fence (__ATOMIC_RELAXED)
|
731
758
|
|
732
759
|
#elif ECB_CLANG_EXTENSION(c_atomic)
|
733
760
|
/* see comment below (stdatomic.h) about the C11 memory model. */
|
734
761
|
#define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST)
|
735
762
|
#define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE)
|
736
763
|
#define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE)
|
764
|
+
#define ECB_MEMORY_FENCE_RELAXED __c11_atomic_thread_fence (__ATOMIC_RELAXED)
|
737
765
|
|
738
766
|
#elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__
|
739
767
|
#define ECB_MEMORY_FENCE __sync_synchronize ()
|
@@ -753,9 +781,10 @@ struct signalfd_siginfo
|
|
753
781
|
#define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */
|
754
782
|
#elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110
|
755
783
|
#include <mbarrier.h>
|
756
|
-
#define ECB_MEMORY_FENCE __machine_rw_barrier
|
757
|
-
#define ECB_MEMORY_FENCE_ACQUIRE
|
758
|
-
#define ECB_MEMORY_FENCE_RELEASE
|
784
|
+
#define ECB_MEMORY_FENCE __machine_rw_barrier ()
|
785
|
+
#define ECB_MEMORY_FENCE_ACQUIRE __machine_acq_barrier ()
|
786
|
+
#define ECB_MEMORY_FENCE_RELEASE __machine_rel_barrier ()
|
787
|
+
#define ECB_MEMORY_FENCE_RELAXED __compiler_barrier ()
|
759
788
|
#elif __xlC__
|
760
789
|
#define ECB_MEMORY_FENCE __sync ()
|
761
790
|
#endif
|
@@ -766,15 +795,9 @@ struct signalfd_siginfo
|
|
766
795
|
/* we assume that these memory fences work on all variables/all memory accesses, */
|
767
796
|
/* not just C11 atomics and atomic accesses */
|
768
797
|
#include <stdatomic.h>
|
769
|
-
/* Unfortunately, neither gcc 4.7 nor clang 3.1 generate any instructions for */
|
770
|
-
/* any fence other than seq_cst, which isn't very efficient for us. */
|
771
|
-
/* Why that is, we don't know - either the C11 memory model is quite useless */
|
772
|
-
/* for most usages, or gcc and clang have a bug */
|
773
|
-
/* I *currently* lean towards the latter, and inefficiently implement */
|
774
|
-
/* all three of ecb's fences as a seq_cst fence */
|
775
|
-
/* Update, gcc-4.8 generates mfence for all c++ fences, but nothing */
|
776
|
-
/* for all __atomic_thread_fence's except seq_cst */
|
777
798
|
#define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst)
|
799
|
+
#define ECB_MEMORY_FENCE_ACQUIRE atomic_thread_fence (memory_order_acquire)
|
800
|
+
#define ECB_MEMORY_FENCE_RELEASE atomic_thread_fence (memory_order_release)
|
778
801
|
#endif
|
779
802
|
#endif
|
780
803
|
|
@@ -804,6 +827,10 @@ struct signalfd_siginfo
|
|
804
827
|
#define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
|
805
828
|
#endif
|
806
829
|
|
830
|
+
#if !defined ECB_MEMORY_FENCE_RELAXED && defined ECB_MEMORY_FENCE
|
831
|
+
#define ECB_MEMORY_FENCE_RELAXED ECB_MEMORY_FENCE /* very heavy-handed */
|
832
|
+
#endif
|
833
|
+
|
807
834
|
/*****************************************************************************/
|
808
835
|
|
809
836
|
#if ECB_CPP
|
@@ -1554,8 +1581,7 @@ ecb_binary32_to_binary16 (uint32_t x)
|
|
1554
1581
|
# define ABSPRI(w) (((W)w)->priority - EV_MINPRI)
|
1555
1582
|
#endif
|
1556
1583
|
|
1557
|
-
#define EMPTY
|
1558
|
-
#define EMPTY2(a,b) /* used to suppress some warnings */
|
1584
|
+
#define EMPTY /* required for microsofts broken pseudo-c compiler */
|
1559
1585
|
|
1560
1586
|
typedef ev_watcher *W;
|
1561
1587
|
typedef ev_watcher_list *WL;
|
@@ -1590,6 +1616,10 @@ static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work?
|
|
1590
1616
|
|
1591
1617
|
/*****************************************************************************/
|
1592
1618
|
|
1619
|
+
#if EV_USE_LINUXAIO
|
1620
|
+
# include <linux/aio_abi.h> /* probably only needed for aio_context_t */
|
1621
|
+
#endif
|
1622
|
+
|
1593
1623
|
/* define a suitable floor function (only used by periodics atm) */
|
1594
1624
|
|
1595
1625
|
#if EV_USE_FLOOR
|
@@ -1781,7 +1811,7 @@ typedef struct
|
|
1781
1811
|
WL head;
|
1782
1812
|
unsigned char events; /* the events watched for */
|
1783
1813
|
unsigned char reify; /* flag set when this ANFD needs reification (EV_ANFD_REIFY, EV__IOFDSET) */
|
1784
|
-
unsigned char emask; /*
|
1814
|
+
unsigned char emask; /* some backends store the actual kernel mask in here */
|
1785
1815
|
unsigned char unused;
|
1786
1816
|
#if EV_USE_EPOLL
|
1787
1817
|
unsigned int egen; /* generation counter to counter epoll bugs */
|
@@ -1972,8 +2002,10 @@ array_realloc (int elem, void *base, int *cur, int cnt)
|
|
1972
2002
|
return ev_realloc (base, elem * *cur);
|
1973
2003
|
}
|
1974
2004
|
|
1975
|
-
#define
|
1976
|
-
|
2005
|
+
#define array_needsize_noinit(base,offset,count)
|
2006
|
+
|
2007
|
+
#define array_needsize_zerofill(base,offset,count) \
|
2008
|
+
memset ((void *)(base + offset), 0, sizeof (*(base)) * (count))
|
1977
2009
|
|
1978
2010
|
#define array_needsize(type,base,cur,cnt,init) \
|
1979
2011
|
if (expect_false ((cnt) > (cur))) \
|
@@ -1981,7 +2013,7 @@ array_realloc (int elem, void *base, int *cur, int cnt)
|
|
1981
2013
|
ecb_unused int ocur_ = (cur); \
|
1982
2014
|
(base) = (type *)array_realloc \
|
1983
2015
|
(sizeof (type), (base), &(cur), (cnt)); \
|
1984
|
-
init ((base)
|
2016
|
+
init ((base), ocur_, ((cur) - ocur_)); \
|
1985
2017
|
}
|
1986
2018
|
|
1987
2019
|
#if 0
|
@@ -2018,7 +2050,7 @@ ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT
|
|
2018
2050
|
else
|
2019
2051
|
{
|
2020
2052
|
w_->pending = ++pendingcnt [pri];
|
2021
|
-
array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending,
|
2053
|
+
array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, array_needsize_noinit);
|
2022
2054
|
pendings [pri][w_->pending - 1].w = w_;
|
2023
2055
|
pendings [pri][w_->pending - 1].events = revents;
|
2024
2056
|
}
|
@@ -2029,7 +2061,7 @@ ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT
|
|
2029
2061
|
inline_speed void
|
2030
2062
|
feed_reverse (EV_P_ W w)
|
2031
2063
|
{
|
2032
|
-
array_needsize (W, rfeeds, rfeedmax, rfeedcnt + 1,
|
2064
|
+
array_needsize (W, rfeeds, rfeedmax, rfeedcnt + 1, array_needsize_noinit);
|
2033
2065
|
rfeeds [rfeedcnt++] = w;
|
2034
2066
|
}
|
2035
2067
|
|
@@ -2126,7 +2158,7 @@ fd_reify (EV_P)
|
|
2126
2158
|
unsigned char o_events = anfd->events;
|
2127
2159
|
unsigned char o_reify = anfd->reify;
|
2128
2160
|
|
2129
|
-
anfd->reify
|
2161
|
+
anfd->reify = 0;
|
2130
2162
|
|
2131
2163
|
/*if (expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */
|
2132
2164
|
{
|
@@ -2157,7 +2189,7 @@ fd_change (EV_P_ int fd, int flags)
|
|
2157
2189
|
if (expect_true (!reify))
|
2158
2190
|
{
|
2159
2191
|
++fdchangecnt;
|
2160
|
-
array_needsize (int, fdchanges, fdchangemax, fdchangecnt,
|
2192
|
+
array_needsize (int, fdchanges, fdchangemax, fdchangecnt, array_needsize_noinit);
|
2161
2193
|
fdchanges [fdchangecnt - 1] = fd;
|
2162
2194
|
}
|
2163
2195
|
}
|
@@ -2717,6 +2749,9 @@ childcb (EV_P_ ev_signal *sw, int revents)
|
|
2717
2749
|
#if EV_USE_EPOLL
|
2718
2750
|
# include "ev_epoll.c"
|
2719
2751
|
#endif
|
2752
|
+
#if EV_USE_LINUXAIO
|
2753
|
+
# include "ev_linuxaio.c"
|
2754
|
+
#endif
|
2720
2755
|
#if EV_USE_POLL
|
2721
2756
|
# include "ev_poll.c"
|
2722
2757
|
#endif
|
@@ -2754,11 +2789,12 @@ ev_supported_backends (void) EV_NOEXCEPT
|
|
2754
2789
|
{
|
2755
2790
|
unsigned int flags = 0;
|
2756
2791
|
|
2757
|
-
if (EV_USE_PORT
|
2758
|
-
if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE;
|
2759
|
-
if (EV_USE_EPOLL
|
2760
|
-
if (
|
2761
|
-
if (
|
2792
|
+
if (EV_USE_PORT ) flags |= EVBACKEND_PORT;
|
2793
|
+
if (EV_USE_KQUEUE ) flags |= EVBACKEND_KQUEUE;
|
2794
|
+
if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL;
|
2795
|
+
if (EV_USE_LINUXAIO) flags |= EVBACKEND_LINUXAIO;
|
2796
|
+
if (EV_USE_POLL ) flags |= EVBACKEND_POLL;
|
2797
|
+
if (EV_USE_SELECT ) flags |= EVBACKEND_SELECT;
|
2762
2798
|
|
2763
2799
|
return flags;
|
2764
2800
|
}
|
@@ -2784,6 +2820,11 @@ ev_recommended_backends (void) EV_NOEXCEPT
|
|
2784
2820
|
flags &= ~EVBACKEND_POLL; /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */
|
2785
2821
|
#endif
|
2786
2822
|
|
2823
|
+
/* TODO: linuxaio is very experimental */
|
2824
|
+
#if !EV_RECOMMEND_LINUXAIO
|
2825
|
+
flags &= ~EVBACKEND_LINUXAIO;
|
2826
|
+
#endif
|
2827
|
+
|
2787
2828
|
return flags;
|
2788
2829
|
}
|
2789
2830
|
|
@@ -2928,22 +2969,25 @@ loop_init (EV_P_ unsigned int flags) EV_NOEXCEPT
|
|
2928
2969
|
flags |= ev_recommended_backends ();
|
2929
2970
|
|
2930
2971
|
#if EV_USE_IOCP
|
2931
|
-
if (!backend && (flags & EVBACKEND_IOCP
|
2972
|
+
if (!backend && (flags & EVBACKEND_IOCP )) backend = iocp_init (EV_A_ flags);
|
2932
2973
|
#endif
|
2933
2974
|
#if EV_USE_PORT
|
2934
|
-
if (!backend && (flags & EVBACKEND_PORT
|
2975
|
+
if (!backend && (flags & EVBACKEND_PORT )) backend = port_init (EV_A_ flags);
|
2935
2976
|
#endif
|
2936
2977
|
#if EV_USE_KQUEUE
|
2937
|
-
if (!backend && (flags & EVBACKEND_KQUEUE)) backend = kqueue_init
|
2978
|
+
if (!backend && (flags & EVBACKEND_KQUEUE )) backend = kqueue_init (EV_A_ flags);
|
2979
|
+
#endif
|
2980
|
+
#if EV_USE_LINUXAIO
|
2981
|
+
if (!backend && (flags & EVBACKEND_LINUXAIO)) backend = linuxaio_init (EV_A_ flags);
|
2938
2982
|
#endif
|
2939
2983
|
#if EV_USE_EPOLL
|
2940
|
-
if (!backend && (flags & EVBACKEND_EPOLL
|
2984
|
+
if (!backend && (flags & EVBACKEND_EPOLL )) backend = epoll_init (EV_A_ flags);
|
2941
2985
|
#endif
|
2942
2986
|
#if EV_USE_POLL
|
2943
|
-
if (!backend && (flags & EVBACKEND_POLL
|
2987
|
+
if (!backend && (flags & EVBACKEND_POLL )) backend = poll_init (EV_A_ flags);
|
2944
2988
|
#endif
|
2945
2989
|
#if EV_USE_SELECT
|
2946
|
-
if (!backend && (flags & EVBACKEND_SELECT)) backend = select_init
|
2990
|
+
if (!backend && (flags & EVBACKEND_SELECT )) backend = select_init (EV_A_ flags);
|
2947
2991
|
#endif
|
2948
2992
|
|
2949
2993
|
ev_prepare_init (&pending_w, pendingcb);
|
@@ -3008,22 +3052,25 @@ ev_loop_destroy (EV_P)
|
|
3008
3052
|
close (backend_fd);
|
3009
3053
|
|
3010
3054
|
#if EV_USE_IOCP
|
3011
|
-
if (backend == EVBACKEND_IOCP
|
3055
|
+
if (backend == EVBACKEND_IOCP ) iocp_destroy (EV_A);
|
3012
3056
|
#endif
|
3013
3057
|
#if EV_USE_PORT
|
3014
|
-
if (backend == EVBACKEND_PORT
|
3058
|
+
if (backend == EVBACKEND_PORT ) port_destroy (EV_A);
|
3015
3059
|
#endif
|
3016
3060
|
#if EV_USE_KQUEUE
|
3017
|
-
if (backend == EVBACKEND_KQUEUE) kqueue_destroy
|
3061
|
+
if (backend == EVBACKEND_KQUEUE ) kqueue_destroy (EV_A);
|
3062
|
+
#endif
|
3063
|
+
#if EV_USE_LINUXAIO
|
3064
|
+
if (backend == EVBACKEND_LINUXAIO) linuxaio_destroy (EV_A);
|
3018
3065
|
#endif
|
3019
3066
|
#if EV_USE_EPOLL
|
3020
|
-
if (backend == EVBACKEND_EPOLL
|
3067
|
+
if (backend == EVBACKEND_EPOLL ) epoll_destroy (EV_A);
|
3021
3068
|
#endif
|
3022
3069
|
#if EV_USE_POLL
|
3023
|
-
if (backend == EVBACKEND_POLL
|
3070
|
+
if (backend == EVBACKEND_POLL ) poll_destroy (EV_A);
|
3024
3071
|
#endif
|
3025
3072
|
#if EV_USE_SELECT
|
3026
|
-
if (backend == EVBACKEND_SELECT) select_destroy
|
3073
|
+
if (backend == EVBACKEND_SELECT ) select_destroy (EV_A);
|
3027
3074
|
#endif
|
3028
3075
|
|
3029
3076
|
for (i = NUMPRI; i--; )
|
@@ -3075,13 +3122,16 @@ inline_size void
|
|
3075
3122
|
loop_fork (EV_P)
|
3076
3123
|
{
|
3077
3124
|
#if EV_USE_PORT
|
3078
|
-
if (backend == EVBACKEND_PORT
|
3125
|
+
if (backend == EVBACKEND_PORT ) port_fork (EV_A);
|
3079
3126
|
#endif
|
3080
3127
|
#if EV_USE_KQUEUE
|
3081
|
-
if (backend == EVBACKEND_KQUEUE) kqueue_fork
|
3128
|
+
if (backend == EVBACKEND_KQUEUE ) kqueue_fork (EV_A);
|
3129
|
+
#endif
|
3130
|
+
#if EV_USE_LINUXAIO
|
3131
|
+
if (backend == EVBACKEND_LINUXAIO) linuxaio_fork (EV_A);
|
3082
3132
|
#endif
|
3083
3133
|
#if EV_USE_EPOLL
|
3084
|
-
if (backend == EVBACKEND_EPOLL
|
3134
|
+
if (backend == EVBACKEND_EPOLL ) epoll_fork (EV_A);
|
3085
3135
|
#endif
|
3086
3136
|
#if EV_USE_INOTIFY
|
3087
3137
|
infy_fork (EV_A);
|
@@ -3598,7 +3648,7 @@ int
|
|
3598
3648
|
ev_run (EV_P_ int flags)
|
3599
3649
|
{
|
3600
3650
|
/* ########## NIO4R PATCHERY HO! ########## */
|
3601
|
-
|
3651
|
+
struct ev_poll_args poll_args;
|
3602
3652
|
/* ######################################## */
|
3603
3653
|
|
3604
3654
|
#if EV_FEATURE_API
|
@@ -3951,10 +4001,13 @@ ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT
|
|
3951
4001
|
assert (("libev: ev_io_start called with negative fd", fd >= 0));
|
3952
4002
|
assert (("libev: ev_io_start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE))));
|
3953
4003
|
|
4004
|
+
#if EV_VERIFY >= 2
|
4005
|
+
assert (("libev: ev_io_start called on watcher with invalid fd", fd_valid (fd)));
|
4006
|
+
#endif
|
3954
4007
|
EV_FREQUENT_CHECK;
|
3955
4008
|
|
3956
4009
|
ev_start (EV_A_ (W)w, 1);
|
3957
|
-
array_needsize (ANFD, anfds, anfdmax, fd + 1,
|
4010
|
+
array_needsize (ANFD, anfds, anfdmax, fd + 1, array_needsize_zerofill);
|
3958
4011
|
wlist_add (&anfds[fd].head, (WL)w);
|
3959
4012
|
|
3960
4013
|
/* common bug, apparently */
|
@@ -3976,6 +4029,9 @@ ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT
|
|
3976
4029
|
|
3977
4030
|
assert (("libev: ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax));
|
3978
4031
|
|
4032
|
+
#if EV_VERIFY >= 2
|
4033
|
+
assert (("libev: ev_io_stop called on watcher with invalid fd", fd_valid (w->fd)));
|
4034
|
+
#endif
|
3979
4035
|
EV_FREQUENT_CHECK;
|
3980
4036
|
|
3981
4037
|
wlist_del (&anfds[w->fd].head, (WL)w);
|
@@ -4001,7 +4057,7 @@ ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT
|
|
4001
4057
|
|
4002
4058
|
++timercnt;
|
4003
4059
|
ev_start (EV_A_ (W)w, timercnt + HEAP0 - 1);
|
4004
|
-
array_needsize (ANHE, timers, timermax, ev_active (w) + 1,
|
4060
|
+
array_needsize (ANHE, timers, timermax, ev_active (w) + 1, array_needsize_noinit);
|
4005
4061
|
ANHE_w (timers [ev_active (w)]) = (WT)w;
|
4006
4062
|
ANHE_at_cache (timers [ev_active (w)]);
|
4007
4063
|
upheap (timers, ev_active (w));
|
@@ -4098,7 +4154,7 @@ ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT
|
|
4098
4154
|
|
4099
4155
|
++periodiccnt;
|
4100
4156
|
ev_start (EV_A_ (W)w, periodiccnt + HEAP0 - 1);
|
4101
|
-
array_needsize (ANHE, periodics, periodicmax, ev_active (w) + 1,
|
4157
|
+
array_needsize (ANHE, periodics, periodicmax, ev_active (w) + 1, array_needsize_noinit);
|
4102
4158
|
ANHE_w (periodics [ev_active (w)]) = (WT)w;
|
4103
4159
|
ANHE_at_cache (periodics [ev_active (w)]);
|
4104
4160
|
upheap (periodics, ev_active (w));
|
@@ -4693,7 +4749,7 @@ ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT
|
|
4693
4749
|
++idleall;
|
4694
4750
|
ev_start (EV_A_ (W)w, active);
|
4695
4751
|
|
4696
|
-
array_needsize (ev_idle *, idles [ABSPRI (w)], idlemax [ABSPRI (w)], active,
|
4752
|
+
array_needsize (ev_idle *, idles [ABSPRI (w)], idlemax [ABSPRI (w)], active, array_needsize_noinit);
|
4697
4753
|
idles [ABSPRI (w)][active - 1] = w;
|
4698
4754
|
}
|
4699
4755
|
|
@@ -4733,7 +4789,7 @@ ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT
|
|
4733
4789
|
EV_FREQUENT_CHECK;
|
4734
4790
|
|
4735
4791
|
ev_start (EV_A_ (W)w, ++preparecnt);
|
4736
|
-
array_needsize (ev_prepare *, prepares, preparemax, preparecnt,
|
4792
|
+
array_needsize (ev_prepare *, prepares, preparemax, preparecnt, array_needsize_noinit);
|
4737
4793
|
prepares [preparecnt - 1] = w;
|
4738
4794
|
|
4739
4795
|
EV_FREQUENT_CHECK;
|
@@ -4771,7 +4827,7 @@ ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT
|
|
4771
4827
|
EV_FREQUENT_CHECK;
|
4772
4828
|
|
4773
4829
|
ev_start (EV_A_ (W)w, ++checkcnt);
|
4774
|
-
array_needsize (ev_check *, checks, checkmax, checkcnt,
|
4830
|
+
array_needsize (ev_check *, checks, checkmax, checkcnt, array_needsize_noinit);
|
4775
4831
|
checks [checkcnt - 1] = w;
|
4776
4832
|
|
4777
4833
|
EV_FREQUENT_CHECK;
|
@@ -4919,7 +4975,7 @@ ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT
|
|
4919
4975
|
EV_FREQUENT_CHECK;
|
4920
4976
|
|
4921
4977
|
ev_start (EV_A_ (W)w, ++forkcnt);
|
4922
|
-
array_needsize (ev_fork *, forks, forkmax, forkcnt,
|
4978
|
+
array_needsize (ev_fork *, forks, forkmax, forkcnt, array_needsize_noinit);
|
4923
4979
|
forks [forkcnt - 1] = w;
|
4924
4980
|
|
4925
4981
|
EV_FREQUENT_CHECK;
|
@@ -4957,7 +5013,7 @@ ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT
|
|
4957
5013
|
EV_FREQUENT_CHECK;
|
4958
5014
|
|
4959
5015
|
ev_start (EV_A_ (W)w, ++cleanupcnt);
|
4960
|
-
array_needsize (ev_cleanup *, cleanups, cleanupmax, cleanupcnt,
|
5016
|
+
array_needsize (ev_cleanup *, cleanups, cleanupmax, cleanupcnt, array_needsize_noinit);
|
4961
5017
|
cleanups [cleanupcnt - 1] = w;
|
4962
5018
|
|
4963
5019
|
/* cleanup watchers should never keep a refcount on the loop */
|
@@ -5002,7 +5058,7 @@ ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT
|
|
5002
5058
|
EV_FREQUENT_CHECK;
|
5003
5059
|
|
5004
5060
|
ev_start (EV_A_ (W)w, ++asynccnt);
|
5005
|
-
array_needsize (ev_async *, asyncs, asyncmax, asynccnt,
|
5061
|
+
array_needsize (ev_async *, asyncs, asyncmax, asynccnt, array_needsize_noinit);
|
5006
5062
|
asyncs [asynccnt - 1] = w;
|
5007
5063
|
|
5008
5064
|
EV_FREQUENT_CHECK;
|
@@ -5081,12 +5137,6 @@ ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, vo
|
|
5081
5137
|
{
|
5082
5138
|
struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once));
|
5083
5139
|
|
5084
|
-
if (expect_false (!once))
|
5085
|
-
{
|
5086
|
-
cb (EV_ERROR | EV_READ | EV_WRITE | EV_TIMER, arg);
|
5087
|
-
return;
|
5088
|
-
}
|
5089
|
-
|
5090
5140
|
once->cb = cb;
|
5091
5141
|
once->arg = arg;
|
5092
5142
|
|