nio4r 2.4.0 → 2.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/workflow.yml +47 -0
  3. data/.rubocop.yml +30 -11
  4. data/CHANGES.md +63 -0
  5. data/Gemfile +1 -1
  6. data/README.md +57 -30
  7. data/examples/echo_server.rb +2 -2
  8. data/ext/libev/Changes +90 -2
  9. data/ext/libev/README +2 -1
  10. data/ext/libev/ev.c +708 -247
  11. data/ext/libev/ev.h +33 -29
  12. data/ext/libev/ev_epoll.c +41 -28
  13. data/ext/libev/ev_iouring.c +694 -0
  14. data/ext/libev/ev_kqueue.c +15 -9
  15. data/ext/libev/ev_linuxaio.c +620 -0
  16. data/ext/libev/ev_poll.c +19 -14
  17. data/ext/libev/ev_port.c +8 -5
  18. data/ext/libev/ev_select.c +6 -6
  19. data/ext/libev/ev_vars.h +46 -1
  20. data/ext/libev/ev_win32.c +2 -2
  21. data/ext/libev/ev_wrap.h +72 -0
  22. data/ext/nio4r/.clang-format +16 -0
  23. data/ext/nio4r/bytebuffer.c +27 -28
  24. data/ext/nio4r/extconf.rb +9 -0
  25. data/ext/nio4r/libev.h +1 -3
  26. data/ext/nio4r/monitor.c +34 -31
  27. data/ext/nio4r/nio4r.h +7 -12
  28. data/ext/nio4r/org/nio4r/ByteBuffer.java +2 -0
  29. data/ext/nio4r/org/nio4r/Monitor.java +1 -0
  30. data/ext/nio4r/org/nio4r/Selector.java +13 -11
  31. data/ext/nio4r/selector.c +66 -51
  32. data/lib/nio.rb +20 -1
  33. data/lib/nio/bytebuffer.rb +4 -0
  34. data/lib/nio/monitor.rb +1 -1
  35. data/lib/nio/selector.rb +12 -10
  36. data/lib/nio/version.rb +1 -1
  37. data/nio4r.gemspec +10 -2
  38. data/spec/nio/bytebuffer_spec.rb +0 -1
  39. data/spec/nio/selectables/ssl_socket_spec.rb +3 -1
  40. data/spec/nio/selectables/udp_socket_spec.rb +2 -2
  41. data/spec/nio/selector_spec.rb +27 -5
  42. data/spec/spec_helper.rb +2 -0
  43. metadata +17 -12
  44. data/.travis.yml +0 -29
  45. data/Guardfile +0 -10
  46. data/LICENSE.txt +0 -20
  47. data/appveyor.yml +0 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93a1a241691b4115c57d823095030d46f36640184d6dc479ec0c46ac3e730d43
4
- data.tar.gz: c0795ea1c7e4c3d9a0f6347ce69f3d937f0410618e80c217cc5c54c90bf44ddb
3
+ metadata.gz: 94787af8473a9b5715919fe9dc98c76b5cef6b9c0c9da66843a50a0fa3edd553
4
+ data.tar.gz: f9a34dc98a62a40901eb1a8904cef23391aecebe11913265caddbc994b26cf78
5
5
  SHA512:
6
- metadata.gz: 289370e25ed8f9692699a493d7cae6dccb5a24db65af58053c094a529eac7e3a65b9581f7576e46661e02a4ef017defdd1ca3805a7e1e1db38025f4c62513e6e
7
- data.tar.gz: 854804c274c63ef8590164ef733d2a538e004d744e13090b1c60ef0b070617e3a49d3c528d50da940c02855446e057e33674f97c121f73c0295e3ea0d96dcd54
6
+ metadata.gz: 3187b027779135b4d5a4940fe7ad6827f6d5d6e2bc062a551a8d1fc2657225f1dba77d8e1d515b7be3226092c059d09fadd8a80597bc2f533293f9f6fd7d15cd
7
+ data.tar.gz: 3224b79d3d5d9049579948800f2e3b876d529e69c2fd25252c11774b267e2b516dea3a504bc3069473104dc75c09abef15aa0586358f855fd12bffa607e12665
@@ -0,0 +1,47 @@
1
+ name: nio4r
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ name: >-
8
+ ${{matrix.os}}, ${{matrix.ruby}}
9
+ env:
10
+ CI: true
11
+ TESTOPTS: -v
12
+
13
+ runs-on: ${{matrix.os}}
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ os: [ ubuntu-20.04, ubuntu-18.04, macos-10.15, windows-2019 ]
18
+ ruby: [ head, 3.0, 2.7, 2.6, 2.5, 2.4, jruby, truffleruby-head ]
19
+ include:
20
+ - { os: ubuntu-16.04, ruby: 3.0 }
21
+ - { os: ubuntu-16.04, ruby: 2.4 }
22
+ exclude:
23
+ - { os: windows-2019, ruby: head }
24
+ - { os: windows-2019, ruby: jruby }
25
+ - { os: windows-2019, ruby: truffleruby-head }
26
+
27
+ steps:
28
+ - name: repo checkout
29
+ uses: actions/checkout@v2
30
+
31
+ - name: load ruby
32
+ uses: ruby/setup-ruby@v1
33
+ with:
34
+ ruby-version: ${{matrix.ruby}}
35
+
36
+ - name: RubyGems, Bundler Update
37
+ run: gem update --system --no-document --conservative
38
+
39
+ - name: bundle install
40
+ run: bundle install --path .bundle/gems --without development
41
+
42
+ - name: compile
43
+ run: bundle exec rake compile
44
+
45
+ - name: test
46
+ run: bundle exec rake spec
47
+ timeout-minutes: 10
data/.rubocop.yml CHANGED
@@ -1,23 +1,40 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
2
+ TargetRubyVersion: 2.4
3
3
  DisplayCopNames: true
4
4
 
5
+ Layout/HashAlignment:
6
+ Enabled: false
7
+
8
+ Layout/LineLength:
9
+ Max: 128
10
+
11
+ Layout/SpaceAroundMethodCallOperator:
12
+ Enabled: false
13
+
5
14
  Layout/SpaceInsideBlockBraces:
6
15
  Enabled: false
7
16
 
8
17
  Style/IfUnlessModifier:
9
18
  Enabled: false
10
19
 
20
+ Style/UnpackFirst:
21
+ Enabled: false
22
+
11
23
  #
12
24
  # Lint
13
25
  #
14
26
 
15
- Lint/HandleExceptions:
27
+ Lint/SuppressedException:
16
28
  Enabled: false
17
29
 
18
30
  Lint/Loop:
19
31
  Enabled: false
20
32
 
33
+ Lint/RaiseException:
34
+ Enabled: false
35
+
36
+ Lint/StructNewOverride:
37
+ Enabled: false
21
38
  #
22
39
  # Metrics
23
40
  #
@@ -32,9 +49,6 @@ Metrics/BlockLength:
32
49
  Metrics/ClassLength:
33
50
  Max: 128
34
51
 
35
- Metrics/LineLength:
36
- Max: 128
37
-
38
52
  Metrics/MethodLength:
39
53
  CountComments: false
40
54
  Max: 50
@@ -46,16 +60,12 @@ Metrics/PerceivedComplexity:
46
60
  Max: 15
47
61
 
48
62
  #
49
- # Performance
63
+ # Style
50
64
  #
51
65
 
52
- Performance/RegexpMatch:
66
+ Style/ExponentialNotation:
53
67
  Enabled: false
54
68
 
55
- #
56
- # Style
57
- #
58
-
59
69
  Style/FormatStringToken:
60
70
  Enabled: false
61
71
 
@@ -65,6 +75,15 @@ Style/FrozenStringLiteralComment:
65
75
  Style/GlobalVars:
66
76
  Enabled: false
67
77
 
78
+ Style/HashEachMethods:
79
+ Enabled: false
80
+
81
+ Style/HashTransformKeys:
82
+ Enabled: false
83
+
84
+ Style/HashTransformValues:
85
+ Enabled: false
86
+
68
87
  Style/NumericPredicate:
69
88
  Enabled: false
70
89
 
data/CHANGES.md CHANGED
@@ -1,3 +1,60 @@
1
+ ## 2.5.5 (2021-02-05)
2
+
3
+ * [#256](https://github.com/socketry/nio4r/pull/256)
4
+ Use libev 4.33, featuring experimental `io_uring` support.
5
+ ([@jcmfernandes])
6
+
7
+ * [#260](https://github.com/socketry/nio4r/pull/260)
8
+ Workaround for ARM-based macOS Ruby: Use pure Ruby for M1, since the native extension is crashing on M1 (arm64).
9
+ ([@jasl])
10
+
11
+ * [#252](https://github.com/socketry/nio4r/pull/252)
12
+ JRuby: Fix javac -Xlint warnings
13
+ ([@headius])
14
+
15
+ ## 2.5.4 (2020-09-16)
16
+
17
+ * [#251](https://github.com/socketry/nio4r/issues/251)
18
+ Intermittent SEGV during GC.
19
+ ([@boazsegev])
20
+
21
+ ## 2.5.3 (2020-09-07)
22
+
23
+ * [#241](https://github.com/socketry/nio4r/issues/241)
24
+ Possible bug with Ruby >= 2.7.0 and `GC.compact`.
25
+ ([@boazsegev])
26
+
27
+ ## 2.5.2 (2019-09-24)
28
+
29
+ * [#220](https://github.com/socketry/nio4r/issues/220)
30
+ Update to libev-4.27 & fix assorted warnings.
31
+ ([@ioquatix])
32
+
33
+ * [#225](https://github.com/socketry/nio4r/issues/225)
34
+ Avoid need for linux headers.
35
+ ([@ioquatix])
36
+
37
+ ## 2.4.0 (2019-07-07)
38
+
39
+ * [#211](https://github.com/socketry/nio4r/pull/211)
40
+ Enable KQUEUE on macOS 10.14+.
41
+ ([@ioquatix])
42
+
43
+ * Bump minimum supported Ruby to 2.3.
44
+ ([@ioquatix])
45
+
46
+ * Assorted fixes for TruffleRuby & JRuby.
47
+ ([@eregon], [@olleolleolle])
48
+ Possible bug with Ruby >= 2.7.0 and `GC.compact`
49
+ * Update libev to v4.25.
50
+ ([@ioquatix])
51
+
52
+ * Bind to ephemeral (port 0) for more reliable specs.
53
+ ([@ioquatix])
54
+
55
+ * Improve handling of SSL sockets and related specs.
56
+ ([@MSP-Greg])
57
+
1
58
  ## 2.3.1 (2018-05-03)
2
59
 
3
60
  * [#188](https://github.com/socketry/nio4r/pull/188)
@@ -219,3 +276,9 @@
219
276
  [@HoneyryderChuck]: https://github.com/HoneyryderChuck
220
277
  [@tompng]: https://github.com/tompng
221
278
  [@ioquatix]: https://github.com/ioquatix
279
+ [@eregon]: https://github.com/eregon
280
+ [@olleolleolle]: https://github.com/olleolleolle
281
+ [@boazsegev]: https://github.com/boazsegev
282
+ [@headius]: https://github.com/headius
283
+ [@jasl]: https://github.com/jasl
284
+ [@jcmfernandes]: https://github.com/jcmfernandes
data/Gemfile CHANGED
@@ -15,5 +15,5 @@ group :development, :test do
15
15
  gem "coveralls", require: false
16
16
  gem "rake-compiler", require: false
17
17
  gem "rspec", "~> 3.7", require: false
18
- gem "rubocop", "0.52.1", require: false
18
+ gem "rubocop", "0.82.0", require: false
19
19
  end
data/README.md CHANGED
@@ -1,17 +1,10 @@
1
1
  # ![nio4r](https://raw.github.com/socketry/nio4r/master/logo.png)
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/nio4r.svg)](http://rubygems.org/gems/nio4r)
4
- [![Travis CI Status](https://secure.travis-ci.org/socketry/nio4r.svg?branch=master)](http://travis-ci.org/socketry/nio4r)
5
- [![Appveyor Status](https://ci.appveyor.com/api/projects/status/1ru8x81v91vaewax/branch/master?svg=true)](https://ci.appveyor.com/project/tarcieri/nio4r/branch/master)
4
+ [![Build Status](https://github.com/socketry/nio4r/workflows/nio4r/badge.svg?branch=master&event=push)](https://github.com/socketry/nio4r/actions?query=workflow:nio4r)
6
5
  [![Code Climate](https://codeclimate.com/github/socketry/nio4r.svg)](https://codeclimate.com/github/socketry/nio4r)
7
6
  [![Coverage Status](https://coveralls.io/repos/socketry/nio4r/badge.svg?branch=master)](https://coveralls.io/r/socketry/nio4r)
8
7
  [![Yard Docs](https://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/gems/nio4r/2.2.0)
9
- [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/socketry/nio4r/blob/master/LICENSE.txt)
10
-
11
- _NOTE: This is the 2.x **stable** branch of nio4r. For the 1.x **legacy** branch,
12
- please see:_
13
-
14
- https://github.com/socketry/nio4r/tree/1-x-stable
15
8
 
16
9
  **New I/O for Ruby (nio4r)**: cross-platform asynchronous I/O primitives for
17
10
  scalable network clients and servers. Modeled after the Java NIO API, but
@@ -25,12 +18,14 @@ writing.
25
18
  ## Projects using nio4r
26
19
 
27
20
  * [ActionCable]: Rails 5 WebSocket protocol, uses nio4r for a WebSocket server
28
- * [Celluloid::IO]: Actor-based concurrency framework, uses nio4r for async I/O
29
- * [Socketry Async]: Asynchronous I/O framework for Ruby
21
+ * [Celluloid]: Actor-based concurrency framework, uses nio4r for async I/O
22
+ * [Async]: Asynchronous I/O framework for Ruby
23
+ * [Puma]: Ruby/Rack web server built for concurrency
30
24
 
31
25
  [ActionCable]: https://rubygems.org/gems/actioncable
32
- [Celluloid::IO]: https://github.com/celluloid/celluloid-io
33
- [Socketry Async]: https://github.com/socketry/async
26
+ [Celluloid]: https://github.com/celluloid/celluloid-io
27
+ [Async]: https://github.com/socketry/async
28
+ [Puma]: https://github.com/puma/puma
34
29
 
35
30
  ## Goals
36
31
 
@@ -41,11 +36,13 @@ writing.
41
36
 
42
37
  ## Supported platforms
43
38
 
44
- * Ruby 2.3
45
39
  * Ruby 2.4
46
40
  * Ruby 2.5
47
41
  * Ruby 2.6
48
- * JRuby 9000
42
+ * Ruby 2.7
43
+ * Ruby 3.0
44
+ * [JRuby](https://github.com/jruby/jruby)
45
+ * [TruffleRuby](https://github.com/oracle/truffleruby)
49
46
 
50
47
  ## Supported backends
51
48
 
@@ -53,17 +50,6 @@ writing.
53
50
  * **Java NIO**: JRuby extension which wraps the Java NIO subsystem
54
51
  * **Pure Ruby**: `Kernel.select`-based backend that should work on any Ruby interpreter
55
52
 
56
- ## Discussion
57
-
58
- For discussion and general help with nio4r, email
59
- [socketry+subscribe@googlegroups.com][subscribe]
60
- or join on the web via the [Google Group].
61
-
62
- We're also on IRC at ##socketry on irc.freenode.net.
63
-
64
- [subscribe]: mailto:socketry+subscribe@googlegroups.com
65
- [google group]: https://groups.google.com/group/socketry
66
-
67
53
  ## Documentation
68
54
 
69
55
  [Please see the nio4r wiki](https://github.com/socketry/nio4r/wiki)
@@ -94,13 +80,54 @@ to maintain a large codebase.
94
80
  [EventMachine]: https://github.com/eventmachine/eventmachine
95
81
  [Cool.io]: https://coolio.github.io/
96
82
 
83
+ ## Releases
84
+
85
+ ### CRuby
86
+
87
+ ```
88
+ rake clean
89
+ rake release
90
+ ```
91
+
92
+ ### JRuby
93
+
94
+ You might need to delete `Gemfile.lock` before trying to `bundle install`.
95
+
96
+ ```
97
+ rake clean
98
+ rake compile
99
+ rake release
100
+ ```
101
+
97
102
  ## License
98
103
 
99
- Copyright (c) 2011-2018 Tony Arcieri. Distributed under the MIT License.
100
- See [LICENSE.txt] for further details.
104
+ Released under the MIT license.
105
+
106
+ Copyright, 2019, by Tony Arcieri.
107
+ Copyright, 2019, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams).
108
+
109
+ Permission is hereby granted, free of charge, to any person obtaining a copy
110
+ of this software and associated documentation files (the "Software"), to deal
111
+ in the Software without restriction, including without limitation the rights
112
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
113
+ copies of the Software, and to permit persons to whom the Software is
114
+ furnished to do so, subject to the following conditions:
115
+
116
+ The above copyright notice and this permission notice shall be included in
117
+ all copies or substantial portions of the Software.
118
+
119
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
120
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
121
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
122
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
123
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
124
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
125
+ THE SOFTWARE.
126
+
127
+ ### libev
128
+
129
+ Released under the BSD license. See [ext/libev/LICENSE] for details.
101
130
 
102
- Includes libev 4.24. Copyright (c) 2007-2016 Marc Alexander Lehmann.
103
- Distributed under the BSD license. See [ext/libev/LICENSE] for details.
131
+ Copyright, 2007-2019, by Marc Alexander Lehmann.
104
132
 
105
- [LICENSE.txt]: https://github.com/socketry/nio4r/blob/master/LICENSE.txt
106
133
  [ext/libev/LICENSE]: https://github.com/socketry/nio4r/blob/master/ext/libev/LICENSE
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- $LOAD_PATH.push File.expand_path("../../lib", __FILE__)
4
+ $LOAD_PATH.push File.expand_path("../lib", __dir__)
5
5
  require "nio"
6
6
  require "socket"
7
7
 
@@ -19,7 +19,7 @@ class EchoServer
19
19
 
20
20
  def run
21
21
  loop do
22
- @selector.select { |monitor| monitor.value.call(monitor) }
22
+ @selector.select { |monitor| monitor.value.call }
23
23
  end
24
24
  end
25
25
 
data/ext/libev/Changes CHANGED
@@ -1,9 +1,97 @@
1
1
  Revision history for libev, a high-performance and full-featured event loop.
2
2
 
3
+ TODO: for next ABI/API change, consider moving EV__IOFDSSET into io->fd instead and provide a getter.
4
+ TODO: document EV_TSTAMP_T
5
+
6
+ 4.33 Wed Mar 18 13:22:29 CET 2020
7
+ - no changes w.r.t. 4.32.
8
+
9
+ 4.32 (EV only)
10
+ - the 4.31 timerfd code wrongly changed the priority of the signal
11
+ fd watcher, which is usually harmless unless signal fds are
12
+ also used (found via cpan tester service).
13
+ - the documentation wrongly claimed that user may modify fd and events
14
+ members in io watchers when the watcher was stopped
15
+ (found by b_jonas).
16
+ - new ev_io_modify mutator which changes only the events member,
17
+ which can be faster. also added ev::io::set (int events) method
18
+ to ev++.h.
19
+ - officially allow a zero events mask for io watchers. this should
20
+ work with older libev versions as well but was not officially
21
+ allowed before.
22
+ - do not wake up every minute when timerfd is used to detect timejumps.
23
+ - do not wake up every minute when periodics are disabled and we have
24
+ a monotonic clock.
25
+ - support a lot more "uncommon" compile time configurations,
26
+ such as ev_embed enabled but ev_timer disabled.
27
+ - use a start/stop wrapper class to reduce code duplication in
28
+ ev++.h and make it needlessly more c++-y.
29
+ - the linux aio backend is no longer compiled in by default.
30
+ - update to libecb version 0x00010008.
31
+
32
+ 4.31 Fri Dec 20 21:58:29 CET 2019
33
+ - handle backends with minimum wait time a bit better by not
34
+ waiting in the presence of already-expired timers
35
+ (behaviour reported by Felipe Gasper).
36
+ - new feature: use timerfd to detect timejumps quickly,
37
+ can be disabled with the new EVFLAG_NOTIMERFD loop flag.
38
+ - document EV_USE_SIGNALFD feature macro.
39
+
40
+ 4.30 (EV only)
41
+ - change non-autoconf test for __kernel_rwf_t by testing
42
+ LINUX_VERSION_CODE, the most direct test I could find.
43
+ - fix a bug in the io_uring backend that polled the wrong
44
+ backend fd, causing it to not work in many cases.
45
+
46
+ 4.29 (EV only)
47
+ - add io uring autoconf and non-autoconf detection.
48
+ - disable io_uring when some header files are too old.
49
+
50
+ 4.28 (EV only)
51
+ - linuxaio backend resulted in random memory corruption
52
+ when loop is forked.
53
+ - linuxaio backend might have tried to cancel an iocb
54
+ multiple times (was unable to trigger this).
55
+ - linuxaio backend now employs a generation counter to
56
+ avoid handling spurious events from cancelled requests.
57
+ - io_cancel can return EINTR, deal with it. also, assume
58
+ io_submit also returns EINTR.
59
+ - fix some other minor bugs in linuxaio backend.
60
+ - ev_tstamp type can now be overriden by defining EV_TSTAMP_T.
61
+ - cleanup: replace expect_true/false and noinline by their
62
+ libecb counterparts.
63
+ - move syscall infrastructure from ev_linuxaio.c to ev.c.
64
+ - prepare io_uring integration.
65
+ - tweak ev_floor.
66
+ - epoll, poll, win32 Sleep and other places that use millisecond
67
+ reslution now all try to round up times.
68
+ - solaris port backend didn't compile.
69
+ - abstract time constants into their macros, for more flexibility.
70
+
71
+ 4.27 Thu Jun 27 22:43:44 CEST 2019
72
+ - linux aio backend almost completely rewritten to work around its
73
+ limitations.
74
+ - linux aio backend now requires linux 4.19+.
75
+ - epoll backend now mandatory for linux aio backend.
76
+ - fail assertions more aggressively on invalid fd's detected
77
+ in the event loop, do not just silently fd_kill in case of
78
+ user error.
79
+ - ev_io_start/ev_io_stop now verify the watcher fd using
80
+ a syscall when EV_VERIFY is 2 or higher.
81
+
82
+ 4.26 (EV only)
83
+ - update to libecb 0x00010006.
84
+ - new experimental linux aio backend (linux 4.18+).
85
+ - removed redundant 0-ptr check in ev_once.
86
+ - updated/extended ev_set_allocator documentation.
87
+ - replaced EMPTY2 macro by array_needsize_noinit.
88
+ - minor code cleanups.
89
+ - epoll backend now uses epoll_create1 also after fork.
90
+
3
91
  4.25 Fri Dec 21 07:49:20 CET 2018
4
92
  - INCOMPATIBLE CHANGE: EV_THROW was renamed to EV_NOEXCEPT
5
- (EV_THROW sitll provided) and now uses noexcept on C++11 or newer.
6
- - move the darwin select workaround highe rin ev.c, as newer versions of
93
+ (EV_THROW still provided) and now uses noexcept on C++11 or newer.
94
+ - move the darwin select workaround higher in ev.c, as newer versions of
7
95
  darwin managed to break their broken select even more.
8
96
  - ANDROID => __ANDROID__ (reported by enh@google.com).
9
97
  - disable epoll_create1 on android because it has broken header files