nio4r 2.0.0.pre-java → 2.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -1
  3. data/.rubocop.yml +31 -38
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +9 -19
  6. data/CHANGES.md +94 -42
  7. data/Gemfile +11 -3
  8. data/Guardfile +10 -0
  9. data/LICENSE.txt +1 -1
  10. data/README.md +43 -136
  11. data/Rakefile +2 -0
  12. data/examples/echo_server.rb +1 -0
  13. data/ext/libev/Changes +9 -13
  14. data/ext/libev/ev.c +100 -74
  15. data/ext/libev/ev.h +4 -9
  16. data/ext/libev/ev_epoll.c +6 -3
  17. data/ext/libev/ev_kqueue.c +8 -4
  18. data/ext/libev/ev_poll.c +6 -3
  19. data/ext/libev/ev_port.c +8 -4
  20. data/ext/libev/ev_select.c +4 -2
  21. data/ext/nio4r/bytebuffer.c +265 -257
  22. data/ext/nio4r/extconf.rb +3 -9
  23. data/ext/nio4r/monitor.c +93 -46
  24. data/ext/nio4r/nio4r.h +6 -16
  25. data/ext/nio4r/org/nio4r/ByteBuffer.java +193 -209
  26. data/ext/nio4r/org/nio4r/Monitor.java +164 -0
  27. data/ext/nio4r/org/nio4r/Nio4r.java +13 -391
  28. data/ext/nio4r/org/nio4r/Selector.java +278 -0
  29. data/ext/nio4r/selector.c +72 -64
  30. data/lib/nio.rb +3 -3
  31. data/lib/nio/bytebuffer.rb +179 -132
  32. data/lib/nio/monitor.rb +64 -4
  33. data/lib/nio/selector.rb +36 -13
  34. data/lib/nio/version.rb +1 -1
  35. data/nio4r.gemspec +25 -19
  36. data/spec/nio/acceptables_spec.rb +6 -4
  37. data/spec/nio/bytebuffer_spec.rb +323 -51
  38. data/spec/nio/monitor_spec.rb +122 -79
  39. data/spec/nio/selectables/pipe_spec.rb +5 -1
  40. data/spec/nio/selectables/ssl_socket_spec.rb +15 -12
  41. data/spec/nio/selectables/tcp_socket_spec.rb +42 -31
  42. data/spec/nio/selectables/udp_socket_spec.rb +2 -0
  43. data/spec/nio/selector_spec.rb +10 -4
  44. data/spec/spec_helper.rb +24 -3
  45. data/spec/support/selectable_examples.rb +7 -5
  46. data/tasks/extension.rake +2 -0
  47. data/tasks/rspec.rake +2 -0
  48. data/tasks/rubocop.rake +2 -0
  49. metadata +18 -15
  50. data/.rubocop_todo.yml +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2fa78de944a5d97620f70f6f2b0f4d26adc8787a
4
- data.tar.gz: 35c2e9037abe7f637c818f2855cc0e11392492d6
3
+ metadata.gz: ac3e49179816af644f609a1e3bbe64597ff616b8
4
+ data.tar.gz: 068bb05b019c601258e4ad8716107f0ac7cc6bf4
5
5
  SHA512:
6
- metadata.gz: 6df43deb9113853fd2bc9619738096f98100b56f43ae93728ed9fc49a852960072253bed2c5f44969dce877c1a50ec5e628a5e51c786fb04ad8f6b957ebd5f25
7
- data.tar.gz: b47591e23982ded453f0d4817dbcf7a64881edda1d6d53ac9ed88335bdbd8da9318b70958db1ec0d736184f9287e47b915c120fa64d947578d18746851f0615d
6
+ metadata.gz: 0c4d9dff97f7570e07e790f93ead41e84d5db0ac1c8eb9be6c7563d3833a1f12f14bae7a4dbd3e06a9c8fe91a0a79bd63a0c51f08a833d733424cf7020cc0130
7
+ data.tar.gz: 5d16069650825220774e8f7dd970364ed2b80270b8b0f28d58b8e8a05da77e1aad78c62d75945da0f5dabdb8e1aa7ce64289656e93022a88300178b5b72f486e
data/.rspec CHANGED
@@ -1,5 +1,4 @@
1
1
  --color
2
2
  --format documentation
3
- --backtrace
4
3
  --order random
5
4
  --warnings
data/.rubocop.yml CHANGED
@@ -1,61 +1,54 @@
1
+ AllCops:
2
+ DisplayCopNames: true
3
+
1
4
  #
2
- # Deliberate style choices
5
+ # Lint
3
6
  #
4
7
 
5
- LineLength:
6
- Max: 100
8
+ Lint/HandleExceptions:
9
+ Enabled: false
7
10
 
8
- Style/StringLiterals:
9
- EnforcedStyle: double_quotes
11
+ Lint/Loop:
12
+ Enabled: false
10
13
 
11
- Metrics/MethodLength:
12
- CountComments: false
13
- Max: 40
14
+ #
15
+ # Metrics
16
+ #
14
17
 
15
18
  Metrics/AbcSize:
16
- Max: 40
19
+ Max: 35
17
20
 
18
- Metrics/PerceivedComplexity:
19
- Max: 15
21
+ Metrics/ClassLength:
22
+ Max: 128
20
23
 
21
- Metrics/CyclomaticComplexity:
22
- Max: 10
24
+ Metrics/LineLength:
25
+ Max: 128
23
26
 
24
- Style/GlobalVars:
25
- Enabled: false
27
+ Metrics/MethodLength:
28
+ CountComments: false
29
+ Max: 50
26
30
 
27
- Style/TrivialAccessors:
28
- Enabled: false
31
+ Metrics/CyclomaticComplexity:
32
+ Max: 15
33
+
34
+ Metrics/PerceivedComplexity:
35
+ Max: 15
29
36
 
30
37
  #
31
- # Auto-generated overrides
38
+ # Style
32
39
  #
33
40
 
34
- # Offense count: 2
35
- Lint/HandleExceptions:
36
- Enabled: false
37
-
38
- # Offense count: 3
39
- Lint/Loop:
40
- Enabled: false
41
+ Style/StringLiterals:
42
+ EnforcedStyle: double_quotes
41
43
 
42
- # Offense count: 1
43
- Lint/NonLocalExitFromIterator:
44
+ Style/GlobalVars:
44
45
  Enabled: false
45
46
 
46
- # Offense count: 7
47
- Lint/UselessAssignment:
47
+ Style/NumericPredicate:
48
48
  Enabled: false
49
49
 
50
- # Offense count: 1
51
- # Configuration parameters: SupportedStyles, IndentOneStep.
52
- Style/CaseIndentation:
53
- IndentWhenRelativeTo: end
54
-
55
- # Offense count: 1
56
- Style/Documentation:
50
+ Style/RescueModifier:
57
51
  Enabled: false
58
52
 
59
- # Offense count: 2
60
- Style/RescueModifier:
53
+ Style/TrivialAccessors:
61
54
  Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.4.0
data/.travis.yml CHANGED
@@ -2,25 +2,22 @@ language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
4
 
5
+ before_install:
6
+ - gem update --system 2.6.10
7
+ - gem --version
8
+
5
9
  bundler_args: --without development
6
10
 
7
11
  branches:
8
12
  only:
9
13
  - master
10
14
 
11
- os:
12
- - linux
13
- - osx
14
-
15
15
  rvm:
16
- - 2.0
17
- - 2.1
18
- - 2.2
19
- - 2.3.1
16
+ - jruby-9.1.10.0 # latest stable
17
+ - 2.2.7
18
+ - 2.3.4
19
+ - 2.4.1
20
20
  - ruby-head
21
- - jruby-9.1.5.0 # latest stable
22
- - jruby-head
23
- - rbx
24
21
 
25
22
  env:
26
23
  global:
@@ -30,16 +27,9 @@ env:
30
27
  - NIO4R_PURE=true
31
28
 
32
29
  matrix:
33
- fast_finish: true
34
30
  allow_failures:
35
- - os: osx # TODO: make tests pass reliably on OS X
36
31
  - rvm: ruby-head
37
- - rvm: jruby-head
38
- - rvm: rbx
39
- - rvm: jruby-1.7
40
- env: NIO4R_PURE=true
41
- - rvm: jruby-9.1
42
- env: NIO4R_PURE=true
32
+ fast_finish: true
43
33
 
44
34
  notifications:
45
35
  irc: "irc.freenode.org#celluloid"
data/CHANGES.md CHANGED
@@ -1,28 +1,75 @@
1
- 1.2.1 (2016-01-31)
2
- ------------------
1
+ ## 2.1.0 (2017-05-28)
2
+
3
+ * [#130](https://github.com/socketry/nio4r/pull/130)
4
+ Add -fno-strict-aliasing flag when compiling C ext.
5
+ ([@junaruga])
6
+
7
+ * [#146](https://github.com/socketry/nio4r/pull/146)
8
+ Use non-blocking select when a timeout of 0 is given.
9
+ ([@tarcieri])
10
+
11
+ * [#147](https://github.com/socketry/nio4r/pull/147)
12
+ Update to libev 4.24.
13
+ ([@tarcieri])
14
+
15
+ * [#148](https://github.com/socketry/nio4r/pull/148)
16
+ Switch to the libev 4 API internally.
17
+ ([@tarcieri])
18
+
19
+ ## 2.0.0 (2016-12-28)
20
+
21
+ * [#53](https://github.com/socketry/nio4r/pull/53)
22
+ Limit lock scope to prevent recursive locking.
23
+ ([@johnnyt])
24
+
25
+ * [#95](https://github.com/socketry/nio4r/pull/95)
26
+ NIO::ByteBuffer Google Summer of Code project.
27
+ ([@UpeksheJay], [@tarcieri])
28
+
29
+ * [#111](https://github.com/socketry/nio4r/pull/111)
30
+ NIO::Selector#backend introspection support.
31
+ ([@tarcieri])
32
+
33
+ * [#112](https://github.com/socketry/nio4r/pull/112)
34
+ Upgrade to libev 4.23.
35
+ ([@tarcieri])
36
+
37
+ * [#119](https://github.com/socketry/nio4r/pull/119)
38
+ Disambiguate wakeup vs timeout (fixes #63, #66).
39
+ ([@tarcieri])
40
+
41
+ * [#124](https://github.com/socketry/nio4r/pull/124)
42
+ Monitor interests API improvements.
43
+ ([@tarcieri])
44
+
45
+ * Drop Ruby 2.0 and 2.1 support, require Ruby 2.2.2+.
46
+ ([@tarcieri])
47
+
48
+ ## 1.2.1 (2016-01-31)
49
+
3
50
  * Fix bug in the JRuby backend which cases indefinite blocking when small
4
51
  timeout values are passed to the selector
5
52
 
6
- 1.2.0 (2015-12-22)
7
- ------------------
53
+ ## 1.2.0 (2015-12-22)
54
+
8
55
  * Add NIO::Monitor#interests= API for changing interests. Contributed by
9
56
  Upekshe Jayasekera as a Google Summer of Code project.
10
57
  * Update to libev 4.22
11
58
 
12
- 1.1.1 (2015-07-17)
13
- ------------------
59
+ ## 1.1.1 (2015-07-17)
60
+
14
61
  * Update to libev 4.20
15
62
  * Fall back to io.h if unistd.h is not found
16
63
  * RSpec updates
17
64
  * RuboCop
18
65
 
19
- 1.1.0 (2015-01-10)
20
- ------------------
66
+ ## 1.1.0 (2015-01-10)
67
+
21
68
  * Update to libev 4.19
22
69
  * Do not call ev_io_stop on monitors if the loop is already closed
23
70
 
24
- 1.0.1 (2014-09-01)
25
- ------------------
71
+ ## 1.0.1 (2014-09-01)
72
+
26
73
  * Fix C compiler warnings
27
74
  * Eliminate Ruby warnings about @lock_holder
28
75
  * Windows improvements
@@ -30,59 +77,59 @@
30
77
  * Automatically require 'set'
31
78
  * Update to RSpec 3
32
79
 
33
- 1.0.0 (2014-01-14)
34
- ------------------
80
+ ## 1.0.0 (2014-01-14)
81
+
35
82
  * Have Selector#register obtain the actual IO from a Monitor object
36
83
  because Monitor#initialize might convert it.
37
84
  * Drop 1.8 support
38
85
 
39
- 0.5.0 (2013-08-06)
40
- ------------------
86
+ ## 0.5.0 (2013-08-06)
87
+
41
88
  * Fix segv when attempting to register to a closed selector
42
89
  * Fix Windows support on Ruby 2.0.0
43
90
  * Upgrade to libev 4.15
44
91
 
45
- 0.4.6 (2013-05-27)
46
- ------------------
92
+ ## 0.4.6 (2013-05-27)
93
+
47
94
  * Fix for JRuby on Windows
48
95
 
49
- 0.4.5
50
- -----
96
+ ## 0.4.5
97
+
51
98
  * Fix botched gem release
52
99
 
53
- 0.4.4
54
- -----
100
+ ## 0.4.4
101
+
55
102
  * Fix return values for Selector_synchronize and Selector_unlock
56
103
 
57
- 0.4.3
58
- -----
104
+ ## 0.4.3
105
+
59
106
  * REALLY have thread synchronization when closing selectors ;)
60
107
 
61
- 0.4.2
62
- -----
108
+ ## 0.4.2
109
+
63
110
  * Attempt to work around packaging problems with bundler-api o_O
64
111
 
65
- 0.4.1
66
- -----
112
+ ## 0.4.1
113
+
67
114
  * Thread synchronization when closing selectors
68
115
 
69
- 0.4.0
70
- -----
116
+ ## 0.4.0
117
+
71
118
  * OpenSSL::SSL::SSLSocket support
72
119
 
73
- 0.3.3
74
- -----
120
+ ## 0.3.3
121
+
75
122
  * NIO::Selector#select_each removed
76
123
  * Remove event buffer
77
124
  * Patch GIL unlock directly into libev
78
125
  * Re-release since 0.3.2 was botched :(
79
126
 
80
- 0.3.1
81
- -----
127
+ ## 0.3.1
128
+
82
129
  * Prevent CancelledKeyExceptions on JRuby
83
130
 
84
- 0.3.0
85
- -----
131
+ ## 0.3.0
132
+
86
133
  * NIO::Selector#select now takes a block and behaves like select_each
87
134
  * NIO::Selector#select_each is now deprecated and will be removed
88
135
  * Closing monitors detaches them from their selector
@@ -91,23 +138,28 @@
91
138
  * Bugfixes for zero/negative select timeouts
92
139
  * Handle OP_CONNECT properly on JRuby
93
140
 
94
- 0.2.2
95
- -----
141
+ ## 0.2.2
142
+
96
143
  * Raise IOError if asked to wake up a closed selector
97
144
 
98
- 0.2.1
99
- -----
145
+ ## 0.2.1
146
+
100
147
  * Implement wakeup mechanism using raw pipes instead of ev_async, since
101
148
  ev_async likes to cause segvs when used across threads (despite claims
102
149
  in the documentation to the contrary)
103
150
 
104
- 0.2.0
105
- -----
151
+ ## 0.2.0
152
+
106
153
  * NIO::Monitor#readiness API to query readiness, along with #readable? and
107
154
  #writable? helper methods
108
155
  * NIO::Selector#select_each API which avoids memory allocations if possible
109
156
  * Bugfixes for the JRuby implementation
110
157
 
111
- 0.1.0
112
- -----
158
+ ## 0.1.0
159
+
113
160
  * Initial release. Merry Christmas!
161
+
162
+ [@tarcieri]: https://github.com/tarcieri
163
+ [@johnnyt]: https://github.com/johnnyt
164
+ [@UpeksheJay]: https://github.com/UpeksheJay
165
+ [@junaruga]: https://github.com/junaruga
data/Gemfile CHANGED
@@ -1,12 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  gemspec
4
6
 
5
7
  gem "jruby-openssl" if defined? JRUBY_VERSION
6
8
 
9
+ group :development do
10
+ gem "guard-rspec", require: false
11
+ gem "pry", require: false
12
+ end
13
+
7
14
  group :development, :test do
8
- gem "rake-compiler"
9
- gem "rspec", "~> 3", require: false
10
- gem "rubocop", "0.36.0", require: false
11
15
  gem "coveralls", require: false
16
+ gem "rake-compiler", require: false
17
+ gem "rspec", "~> 3", require: false
18
+ gem "rspec-retry", require: false
19
+ gem "rubocop", "0.46.0", require: false
12
20
  end
data/Guardfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ directories %w(lib spec)
4
+ clearing :on
5
+
6
+ guard :rspec, cmd: "bundle exec rspec" do
7
+ watch(%r{^spec/.+_spec\.rb$})
8
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
9
+ watch("spec/spec_helper.rb") { "spec" }
10
+ end
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011-12 Tony Arcieri
1
+ Copyright (c) 2011-2017 Tony Arcieri
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,15 +1,15 @@
1
- # ![nio4r](https://raw.github.com/celluloid/nio4r/master/logo.png)
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
- [![Build Status](https://secure.travis-ci.org/celluloid/nio4r.svg?branch=master)](http://travis-ci.org/celluloid/nio4r)
5
- [![Code Climate](https://codeclimate.com/github/celluloid/nio4r.svg)](https://codeclimate.com/github/celluloid/nio4r)
6
- [![Coverage Status](https://coveralls.io/repos/celluloid/nio4r/badge.svg?branch=master)](https://coveralls.io/r/celluloid/nio4r)
7
- [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/celluloid/nio4r/blob/master/LICENSE.txt)
4
+ [![Build Status](https://secure.travis-ci.org/socketry/nio4r.svg?branch=master)](http://travis-ci.org/socketry/nio4r)
5
+ [![Code Climate](https://codeclimate.com/github/socketry/nio4r.svg)](https://codeclimate.com/github/socketry/nio4r)
6
+ [![Coverage Status](https://coveralls.io/repos/socketry/nio4r/badge.svg?branch=master)](https://coveralls.io/r/socketry/nio4r)
7
+ [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/socketry/nio4r/blob/master/LICENSE.txt)
8
8
 
9
- _NOTE: This is the 2.x **development** branch of nio4r. For the 1.x **stable**
10
- branch (used by [Rails 5]), please see:_
9
+ _NOTE: This is the 2.x **stable** branch of nio4r. For the 1.x **legacy** branch,
10
+ please see:_
11
11
 
12
- https://github.com/celluloid/nio4r/tree/1-x-stable
12
+ https://github.com/socketry/nio4r/tree/1-x-stable
13
13
 
14
14
  **New I/O for Ruby (nio4r)**: cross-platform asynchronous I/O primitives for
15
15
  scalable network clients and servers. Modeled after the Java NIO API, but
@@ -20,15 +20,15 @@ I/O selectors are the heart of "reactor"-based event loops, and monitor
20
20
  multiple I/O objects for various types of readiness, e.g. ready for reading or
21
21
  writing.
22
22
 
23
- [Rails 5]: https://rubygems.org/gems/actioncable
24
-
25
23
  ## Projects using nio4r
26
24
 
27
25
  * [ActionCable]: Rails 5 WebSocket protocol, uses nio4r for a WebSocket server
28
26
  * [Celluloid::IO]: Actor-based concurrency framework, uses nio4r for async I/O
27
+ * [Socketry Async]: Asynchronous I/O framework for Ruby
29
28
 
30
29
  [ActionCable]: https://rubygems.org/gems/actioncable
31
30
  [Celluloid::IO]: https://github.com/celluloid/celluloid-io
31
+ [Socketry Async]: https://github.com/socketry/async
32
32
 
33
33
  ## Goals
34
34
 
@@ -39,142 +39,46 @@ writing.
39
39
 
40
40
  ## Supported platforms
41
41
 
42
- * Ruby 2.0
43
- * Ruby 2.1
44
- * Ruby 2.2
42
+ * Ruby 2.2.2+
45
43
  * Ruby 2.3
44
+ * Ruby 2.4
46
45
  * JRuby 9000
47
- * Pure Ruby using Kernel.select
48
-
49
- ## Platform notes
50
-
51
- * MRI/YARV and Rubinius implement nio4r with a C extension based on libev,
52
- which provides a high performance binding to native IO APIs
53
- * JRuby uses a Java extension based on the high performance Java NIO subsystem
54
- * A pure Ruby implementation is also provided for Ruby implementations which
55
- don't implement the MRI C extension API
56
-
57
- ## Usage
58
-
59
- If you're interested in using nio4r for a project but just getting started,
60
- check out this blog post which provides some background and examples:
61
-
62
- [A gentle introduction to nio4r: low-level portable asynchronous I/O for Ruby][blogpost]
63
-
64
- [blogpost]: https://tonyarcieri.com/a-gentle-introduction-to-nio4r
65
-
66
- ### Selectors
67
-
68
- The NIO::Selector class is the main API provided by nio4r. Use it where you
69
- might otherwise use Kernel.select, but want to monitor the same set of IO
70
- objects across multiple select calls rather than having to reregister them
71
- every single time:
72
-
73
- ```ruby
74
- require 'nio'
75
46
 
76
- selector = NIO::Selector.new
77
- ```
47
+ ## Supported backends
78
48
 
79
- To monitor IO objects, attach them to the selector with the NIO::Selector#register
80
- method, monitoring them for read readiness with the :r parameter, write
81
- readiness with the :w parameter, or both with :rw.
49
+ * **libev**: MRI C extension targeting multiple native IO selector APIs (e.g epoll, kqueue)
50
+ * **Java NIO**: JRuby extension which wraps the Java NIO subsystem
51
+ * **Pure Ruby**: `Kernel.select`-based backend that should work on any Ruby interpreter
82
52
 
83
- ```ruby
84
- >> reader, writer = IO.pipe
85
- => [#<IO:0xf30>, #<IO:0xf34>]
86
- >> monitor = selector.register(reader, :r)
87
- => #<NIO::Monitor:0xfbc>
88
- ```
53
+ ## Discussion
89
54
 
90
- After registering an IO object with the selector, you'll get a NIO::Monitor
91
- object which you can use for managing how a particular IO object is being
92
- monitored. Monitors will store an arbitrary value of your choice, which
93
- provides an easy way to implement callbacks:
55
+ For discussion and general help with nio4r, email
56
+ [socketry+subscribe@googlegroups.com][subscribe]
57
+ or join on the web via the [Google Group].
94
58
 
95
- ```ruby
96
- >> monitor = selector.register(reader, :r)
97
- => #<NIO::Monitor:0xfbc>
98
- >> monitor.value = proc { puts "Got some data: #{monitor.io.read_nonblock(4096)}" }
99
- => #<Proc:0x1000@(irb):4>
100
- ```
59
+ We're also on IRC at ##socketry on irc.freenode.net.
101
60
 
102
- The main method of importance is NIO::Selector#select, which monitors all
103
- registered IO objects and returns an array of monitors that are ready.
61
+ [subscribe]: mailto:socketry+subscribe@googlegroups.com
62
+ [google group]: https://groups.google.com/group/socketry
104
63
 
105
- ```ruby
106
- >> writer << "Hi there!"
107
- => #<IO:0x103c>
108
- >> ready = selector.select
109
- => [#<NIO::Monitor:0xfbc>]
110
- >> ready.each { |m| m.value.call }
111
- Got some data: Hi there!
112
- => [#<NIO::Monitor:0xfbc>]
113
- ```
64
+ ## Documentation
114
65
 
115
- By default, NIO::Selector#select will block indefinitely until one of the IO
116
- objects being monitored becomes ready. However, you can also pass a timeout to
117
- wait in seconds to NIO::Selector#select just like you can with Kernel.select:
66
+ [Please see the nio4r wiki](https://github.com/socketry/nio4r/wiki)
67
+ for more detailed documentation and usage notes:
118
68
 
119
- ```ruby
120
- ready = selector.select(15) # Wait 15 seconds
121
- ```
69
+ * [Getting Started]: Introduction to nio4r's components
70
+ * [Selectors]: monitor multiple `IO` objects for readiness events
71
+ * [Monitors]: control interests and inspect readiness for specific `IO` objects
72
+ * [Byte Buffers]: fixed-size native buffers for high-performance I/O
122
73
 
123
- If a timeout occurs, ready will be nil.
74
+ [Getting Started]: https://github.com/socketry/nio4r/wiki/Getting-Started
75
+ [Selectors]: https://github.com/socketry/nio4r/wiki/Selectors
76
+ [Monitors]: https://github.com/socketry/nio4r/wiki/Monitors
77
+ [Byte Buffers]: https://github.com/socketry/nio4r/wiki/Byte-Buffers
124
78
 
125
- You can avoid allocating an array each time you call NIO::Selector#select by
126
- passing a block to select. The block will be called for each ready monitor
127
- object, with that object passed as an argument. The number of ready monitors
128
- is returned as a Fixnum:
79
+ See also:
129
80
 
130
- ```ruby
131
- >> selector.select { |m| m.value.call }
132
- Got some data: Hi there!
133
- => 1
134
- ```
135
-
136
- When you're done monitoring a particular IO object, just deregister it from
137
- the selector:
138
-
139
- ```ruby
140
- selector.deregister(reader)
141
- ```
142
-
143
- ### Monitors
144
-
145
- Monitors provide methods which let you introspect on why a particular IO
146
- object was selected. These methods are not thread safe unless you are holding
147
- the selector lock (i.e. if you're in a block passed to #select). Only use them
148
- if you aren't concerned with thread safety, or you're within a #select
149
- block:
150
-
151
- - ***#interests***: what this monitor is interested in (:r, :w, or :rw)
152
- - ***#interests=***: change the current interests for a monitor (to :r, :w, or :rw)
153
- - ***#readiness***: what I/O operations the monitored object is ready for
154
- - ***#readable?***: was the IO readable last time it was selected?
155
- - ***#writable?***: was the IO writable last time it was selected?
156
-
157
- Monitors also support a ***#value*** and ***#value=*** method for storing a
158
- handle to an arbitrary object of your choice (e.g. a proc)
159
-
160
- ### Flow Control
161
-
162
- For information on how to compose nio4r selectors inside of event loops,
163
- please read the [Flow Control Guide on the
164
- Wiki](https://github.com/celluloid/nio4r/wiki/Basic-Flow-Control)
165
-
166
- ## Concurrency
167
-
168
- **nio4r** provides internal locking to ensure that it's safe to use from multiple
169
- concurrent threads. Only one thread can select on a NIO::Selector at a given
170
- time, and while a thread is selecting other threads are blocked from
171
- registering or deregistering IO objects. Once a pending select has completed,
172
- requests to register/unregister IO objects will be processed.
173
-
174
- NIO::Selector#wakeup allows one thread to unblock another thread that's in the
175
- middle of an NIO::Selector#select operation. This lets other threads that need
176
- to communicate immediately with the selector unblock it so it can process
177
- other events that it's not presently selecting on.
81
+ * [YARD API documentation](http://www.rubydoc.info/gems/nio4r/frames)
178
82
 
179
83
  ## Non-goals
180
84
 
@@ -189,8 +93,11 @@ to maintain a large codebase.
189
93
 
190
94
  ## License
191
95
 
192
- Copyright (c) 2011-2016 Tony Arcieri. Distributed under the MIT License.
193
- See LICENSE.txt for further details.
96
+ Copyright (c) 2011-2017 Tony Arcieri. Distributed under the MIT License.
97
+ See [LICENSE.txt] for further details.
98
+
99
+ Includes libev 4.24. Copyright (c) 2007-2016 Marc Alexander Lehmann.
100
+ Distributed under the BSD license. See [ext/libev/LICENSE] for details.
194
101
 
195
- Includes libev 4.22. Copyright (c) 2007-2015 Marc Alexander Lehmann.
196
- Distributed under the BSD license. See ext/libev/LICENSE for details.
102
+ [LICENSE.txt]: https://github.com/socketry/nio4r/blob/master/LICENSE.txt
103
+ [ext/libev/LICENSE]: https://github.com/socketry/nio4r/blob/master/ext/libev/LICENSE