nio4r 2.0.0.pre → 2.0.0

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 +4 -21
  6. data/CHANGES.md +75 -42
  7. data/Gemfile +11 -3
  8. data/Guardfile +10 -0
  9. data/LICENSE.txt +1 -1
  10. data/README.md +32 -136
  11. data/Rakefile +2 -0
  12. data/examples/echo_server.rb +1 -0
  13. data/ext/libev/Changes +4 -13
  14. data/ext/libev/ev.c +100 -74
  15. data/ext/libev/ev.h +3 -3
  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 +2 -10
  23. data/ext/nio4r/monitor.c +93 -46
  24. data/ext/nio4r/nio4r.h +5 -15
  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 +52 -52
  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 +15 -11
  50. data/.rubocop_todo.yml +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f6641deb5a7b32db8287d8856510a07dd33ec737
4
- data.tar.gz: e414ccbb0aef8b0d8cf9ab63e09154753652766b
3
+ metadata.gz: 9f553c279692e1cf308af13c716610b424caca04
4
+ data.tar.gz: 7cd52022633fd0a5d2ba26f003e976505a783237
5
5
  SHA512:
6
- metadata.gz: 37539315f05ec820ec9a5644acb178c49098e6384955ce234c7b5d4f137d8122d98a8486e9ebc419250057b4268d55f72f82ca28145c2ebf713af7823bd9a7fb
7
- data.tar.gz: 1c151cb3ac3d8aef61665ebf4827b59712509d2482c1b26ad1af2853711e6888c8043306a312d4d84b89f511085c346ade0915e768307811bddabc2cc39c41ae
6
+ metadata.gz: 6bdc6f608f34b8be39efa968e523f9bac24da9dc976467afb7ff2d271ca234b6c46d614f37f2c5b82bcbab56c11b3835d0c2c5c26028b794b1dd26ffdee86b83
7
+ data.tar.gz: 32a6b982cbd25605a031d39b7fdb9208b767be7d11f842405fd081f384addb372e1e1fec846176e78f5a77c81e8a21bdf5709eb76753fd85b43583b819e75d5d
data/.rspec CHANGED
@@ -1,5 +1,4 @@
1
1
  --color
2
2
  --format documentation
3
- --backtrace
4
3
  --order random
5
4
  --warnings
@@ -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
@@ -0,0 +1 @@
1
+ 2.4.0
@@ -8,19 +8,11 @@ branches:
8
8
  only:
9
9
  - master
10
10
 
11
- os:
12
- - linux
13
- - osx
14
-
15
11
  rvm:
16
- - 2.0
17
- - 2.1
18
- - 2.2
19
- - 2.3.1
20
- - ruby-head
21
- - jruby-9.1.5.0 # latest stable
22
- - jruby-head
23
- - rbx
12
+ - jruby-9.1.6.0 # latest stable
13
+ - 2.2.2
14
+ - 2.3.3
15
+ - 2.4.0
24
16
 
25
17
  env:
26
18
  global:
@@ -31,15 +23,6 @@ env:
31
23
 
32
24
  matrix:
33
25
  fast_finish: true
34
- allow_failures:
35
- - os: osx # TODO: make tests pass reliably on OS X
36
- - 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
43
26
 
44
27
  notifications:
45
28
  irc: "irc.freenode.org#celluloid"
data/CHANGES.md CHANGED
@@ -1,28 +1,57 @@
1
- 1.2.1 (2016-01-31)
2
- ------------------
1
+ ## 2.0.0 (2016-12-28)
2
+
3
+ * [#53](https://github.com/socketry/nio4r/pull/53)
4
+ Limit lock scope to prevent recursive locking.
5
+ ([@johnnyt])
6
+
7
+ * [#95](https://github.com/socketry/nio4r/pull/95)
8
+ NIO::ByteBuffer Google Summer of Code project.
9
+ ([@UpeksheJay], [@tarcieri])
10
+
11
+ * [#111](https://github.com/socketry/nio4r/pull/111)
12
+ NIO::Selector#backend introspection support.
13
+ ([@tarcieri])
14
+
15
+ * [#112](https://github.com/socketry/nio4r/pull/112)
16
+ Upgrade to libev 4.23.
17
+ ([@tarcieri])
18
+
19
+ * [#119](https://github.com/socketry/nio4r/pull/119)
20
+ Disambiguate wakeup vs timeout (fixes #63, #66).
21
+ ([@tarcieri])
22
+
23
+ * [#124](https://github.com/socketry/nio4r/pull/124)
24
+ Monitor interests API improvements.
25
+ ([@tarcieri])
26
+
27
+ * Drop Ruby 2.0 and 2.1 support, require Ruby 2.2.2+.
28
+ ([@tarcieri])
29
+
30
+ ## 1.2.1 (2016-01-31)
31
+
3
32
  * Fix bug in the JRuby backend which cases indefinite blocking when small
4
33
  timeout values are passed to the selector
5
34
 
6
- 1.2.0 (2015-12-22)
7
- ------------------
35
+ ## 1.2.0 (2015-12-22)
36
+
8
37
  * Add NIO::Monitor#interests= API for changing interests. Contributed by
9
38
  Upekshe Jayasekera as a Google Summer of Code project.
10
39
  * Update to libev 4.22
11
40
 
12
- 1.1.1 (2015-07-17)
13
- ------------------
41
+ ## 1.1.1 (2015-07-17)
42
+
14
43
  * Update to libev 4.20
15
44
  * Fall back to io.h if unistd.h is not found
16
45
  * RSpec updates
17
46
  * RuboCop
18
47
 
19
- 1.1.0 (2015-01-10)
20
- ------------------
48
+ ## 1.1.0 (2015-01-10)
49
+
21
50
  * Update to libev 4.19
22
51
  * Do not call ev_io_stop on monitors if the loop is already closed
23
52
 
24
- 1.0.1 (2014-09-01)
25
- ------------------
53
+ ## 1.0.1 (2014-09-01)
54
+
26
55
  * Fix C compiler warnings
27
56
  * Eliminate Ruby warnings about @lock_holder
28
57
  * Windows improvements
@@ -30,59 +59,59 @@
30
59
  * Automatically require 'set'
31
60
  * Update to RSpec 3
32
61
 
33
- 1.0.0 (2014-01-14)
34
- ------------------
62
+ ## 1.0.0 (2014-01-14)
63
+
35
64
  * Have Selector#register obtain the actual IO from a Monitor object
36
65
  because Monitor#initialize might convert it.
37
66
  * Drop 1.8 support
38
67
 
39
- 0.5.0 (2013-08-06)
40
- ------------------
68
+ ## 0.5.0 (2013-08-06)
69
+
41
70
  * Fix segv when attempting to register to a closed selector
42
71
  * Fix Windows support on Ruby 2.0.0
43
72
  * Upgrade to libev 4.15
44
73
 
45
- 0.4.6 (2013-05-27)
46
- ------------------
74
+ ## 0.4.6 (2013-05-27)
75
+
47
76
  * Fix for JRuby on Windows
48
77
 
49
- 0.4.5
50
- -----
78
+ ## 0.4.5
79
+
51
80
  * Fix botched gem release
52
81
 
53
- 0.4.4
54
- -----
82
+ ## 0.4.4
83
+
55
84
  * Fix return values for Selector_synchronize and Selector_unlock
56
85
 
57
- 0.4.3
58
- -----
86
+ ## 0.4.3
87
+
59
88
  * REALLY have thread synchronization when closing selectors ;)
60
89
 
61
- 0.4.2
62
- -----
90
+ ## 0.4.2
91
+
63
92
  * Attempt to work around packaging problems with bundler-api o_O
64
93
 
65
- 0.4.1
66
- -----
94
+ ## 0.4.1
95
+
67
96
  * Thread synchronization when closing selectors
68
97
 
69
- 0.4.0
70
- -----
98
+ ## 0.4.0
99
+
71
100
  * OpenSSL::SSL::SSLSocket support
72
101
 
73
- 0.3.3
74
- -----
102
+ ## 0.3.3
103
+
75
104
  * NIO::Selector#select_each removed
76
105
  * Remove event buffer
77
106
  * Patch GIL unlock directly into libev
78
107
  * Re-release since 0.3.2 was botched :(
79
108
 
80
- 0.3.1
81
- -----
109
+ ## 0.3.1
110
+
82
111
  * Prevent CancelledKeyExceptions on JRuby
83
112
 
84
- 0.3.0
85
- -----
113
+ ## 0.3.0
114
+
86
115
  * NIO::Selector#select now takes a block and behaves like select_each
87
116
  * NIO::Selector#select_each is now deprecated and will be removed
88
117
  * Closing monitors detaches them from their selector
@@ -91,23 +120,27 @@
91
120
  * Bugfixes for zero/negative select timeouts
92
121
  * Handle OP_CONNECT properly on JRuby
93
122
 
94
- 0.2.2
95
- -----
123
+ ## 0.2.2
124
+
96
125
  * Raise IOError if asked to wake up a closed selector
97
126
 
98
- 0.2.1
99
- -----
127
+ ## 0.2.1
128
+
100
129
  * Implement wakeup mechanism using raw pipes instead of ev_async, since
101
130
  ev_async likes to cause segvs when used across threads (despite claims
102
131
  in the documentation to the contrary)
103
132
 
104
- 0.2.0
105
- -----
133
+ ## 0.2.0
134
+
106
135
  * NIO::Monitor#readiness API to query readiness, along with #readable? and
107
136
  #writable? helper methods
108
137
  * NIO::Selector#select_each API which avoids memory allocations if possible
109
138
  * Bugfixes for the JRuby implementation
110
139
 
111
- 0.1.0
112
- -----
140
+ ## 0.1.0
141
+
113
142
  * Initial release. Merry Christmas!
143
+
144
+ [@tarcieri]: https://github.com/tarcieri
145
+ [@johnnyt]: https://github.com/johnnyt
146
+ [@UpeksheJay]: https://github.com/UpeksheJay
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
@@ -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
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011-12 Tony Arcieri
1
+ Copyright (c) 2011-16 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
9
  _NOTE: This is the 2.x **development** branch of nio4r. For the 1.x **stable**
10
10
  branch (used by [Rails 5]), 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
@@ -28,7 +28,7 @@ writing.
28
28
  * [Celluloid::IO]: Actor-based concurrency framework, uses nio4r for async I/O
29
29
 
30
30
  [ActionCable]: https://rubygems.org/gems/actioncable
31
- [Celluloid::IO]: https://github.com/celluloid/celluloid-io
31
+ [Celluloid::IO]: https://github.com/socketry/socketry-io
32
32
 
33
33
  ## Goals
34
34
 
@@ -39,142 +39,35 @@ 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
46
 
49
- ## Platform notes
47
+ ## Supported backends
50
48
 
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
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
56
52
 
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:
53
+ ## Documentation
61
54
 
62
- [A gentle introduction to nio4r: low-level portable asynchronous I/O for Ruby][blogpost]
55
+ [Please see the nio4r wiki](https://github.com/socketry/nio4r/wiki)
56
+ for more detailed documentation and usage notes:
63
57
 
64
- [blogpost]: https://tonyarcieri.com/a-gentle-introduction-to-nio4r
58
+ * [Getting Started]: Introduction to nio4r's components
59
+ * [Selectors]: monitor multiple `IO` objects for readiness events
60
+ * [Monitors]: control interests and inspect readiness for specific `IO` objects
61
+ * [Byte Buffers]: fixed-size native buffers for high-performance I/O
65
62
 
66
- ### Selectors
63
+ [Getting Started]: https://github.com/socketry/nio4r/wiki/Getting-Started
64
+ [Selectors]: https://github.com/socketry/nio4r/wiki/Selectors
65
+ [Monitors]: https://github.com/socketry/nio4r/wiki/Monitors
66
+ [Byte Buffers]: https://github.com/socketry/nio4r/wiki/Byte-Buffers
67
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:
68
+ See also:
72
69
 
73
- ```ruby
74
- require 'nio'
75
-
76
- selector = NIO::Selector.new
77
- ```
78
-
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.
82
-
83
- ```ruby
84
- >> reader, writer = IO.pipe
85
- => [#<IO:0xf30>, #<IO:0xf34>]
86
- >> monitor = selector.register(reader, :r)
87
- => #<NIO::Monitor:0xfbc>
88
- ```
89
-
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:
94
-
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
- ```
101
-
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.
104
-
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
- ```
114
-
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:
118
-
119
- ```ruby
120
- ready = selector.select(15) # Wait 15 seconds
121
- ```
122
-
123
- If a timeout occurs, ready will be nil.
124
-
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:
129
-
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.
70
+ * [YARD API documentation](http://www.rubydoc.info/gems/nio4r/frames)
178
71
 
179
72
  ## Non-goals
180
73
 
@@ -190,7 +83,10 @@ to maintain a large codebase.
190
83
  ## License
191
84
 
192
85
  Copyright (c) 2011-2016 Tony Arcieri. Distributed under the MIT License.
193
- See LICENSE.txt for further details.
86
+ See [LICENSE.txt] for further details.
87
+
88
+ Includes libev 4.23. Copyright (c) 2007-2016 Marc Alexander Lehmann.
89
+ Distributed under the BSD license. See [ext/libev/LICENSE] for details.
194
90
 
195
- Includes libev 4.22. Copyright (c) 2007-2015 Marc Alexander Lehmann.
196
- Distributed under the BSD license. See ext/libev/LICENSE for details.
91
+ [LICENSE.txt]: https://github.com/socketry/nio4r/blob/master/LICENSE.txt
92
+ [ext/libev/LICENSE]: https://github.com/socketry/nio4r/blob/master/ext/libev/LICENSE