nio4r 0.2.2-java → 0.3.0-java
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.
- data/.travis.yml +6 -2
- data/CHANGES.md +10 -0
- data/LICENSE.txt +1 -1
- data/README.md +16 -11
- data/Rakefile +2 -2
- data/examples/echo_server.rb +9 -0
- data/ext/libev/Changes +34 -2
- data/ext/libev/ev.c +694 -131
- data/ext/libev/ev.h +89 -79
- data/ext/libev/ev_epoll.c +23 -10
- data/ext/libev/ev_kqueue.c +4 -4
- data/ext/libev/ev_poll.c +4 -4
- data/ext/libev/ev_port.c +9 -3
- data/ext/libev/ev_select.c +10 -6
- data/ext/libev/ev_vars.h +3 -2
- data/ext/libev/ev_wrap.h +6 -4
- data/ext/nio4r/monitor.c +23 -6
- data/ext/nio4r/org/nio4r/Nio4r.java +409 -0
- data/ext/nio4r/selector.c +36 -8
- data/lib/nio.rb +4 -7
- data/lib/nio/monitor.rb +15 -4
- data/lib/nio/selector.rb +23 -6
- data/lib/nio/version.rb +1 -1
- data/lib/nio4r_ext.jar +0 -0
- data/nio4r.gemspec +4 -3
- data/spec/nio/acceptables_spec.rb +30 -0
- data/spec/nio/monitor_spec.rb +37 -22
- data/spec/nio/selectables_spec.rb +178 -0
- data/spec/nio/selector_spec.rb +71 -173
- data/tasks/extension.rake +6 -5
- metadata +33 -29
- data/lib/nio/jruby/monitor.rb +0 -42
- data/lib/nio/jruby/selector.rb +0 -136
data/lib/nio/jruby/selector.rb
DELETED
@@ -1,136 +0,0 @@
|
|
1
|
-
module NIO
|
2
|
-
# Selectors monitor IO objects for events of interest
|
3
|
-
class Selector
|
4
|
-
java_import "java.nio.channels.Selector"
|
5
|
-
java_import "java.nio.channels.SelectionKey"
|
6
|
-
|
7
|
-
# Convert nio4r interest symbols to Java NIO interest ops
|
8
|
-
def self.sym2iops(interest, channel)
|
9
|
-
case interest
|
10
|
-
when :r
|
11
|
-
if channel.validOps & SelectionKey::OP_ACCEPT != 0
|
12
|
-
SelectionKey::OP_ACCEPT
|
13
|
-
else
|
14
|
-
SelectionKey::OP_READ
|
15
|
-
end
|
16
|
-
when :w
|
17
|
-
if channel.respond_to? :connected? and not channel.connected?
|
18
|
-
SelectionKey::OP_CONNECT
|
19
|
-
else
|
20
|
-
SelectionKey::OP_WRITE
|
21
|
-
end
|
22
|
-
when :rw
|
23
|
-
super(:r, channel) | super(:w, channel)
|
24
|
-
else raise ArgumentError, "invalid interest type: #{interest}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# Convert Java NIO interest ops to the corresponding Ruby symbols
|
29
|
-
def self.iops2sym(interest_ops)
|
30
|
-
case interest_ops
|
31
|
-
when SelectionKey::OP_READ, SelectionKey::OP_ACCEPT
|
32
|
-
:r
|
33
|
-
when SelectionKey::OP_WRITE, SelectionKey::OP_CONNECT
|
34
|
-
:w
|
35
|
-
when SelectionKey::OP_READ | SelectionKey::OP_WRITE
|
36
|
-
:rw
|
37
|
-
when 0 then nil
|
38
|
-
else raise ArgumentError, "unknown interest op combination: 0x#{interest_ops.to_s(16)}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# Create a new NIO::Selector
|
43
|
-
def initialize
|
44
|
-
@java_selector = Selector.open
|
45
|
-
@select_lock = Mutex.new
|
46
|
-
end
|
47
|
-
|
48
|
-
# Register interest in an IO object with the selector for the given types
|
49
|
-
# of events. Valid event types for interest are:
|
50
|
-
# * :r - is the IO readable?
|
51
|
-
# * :w - is the IO writeable?
|
52
|
-
# * :rw - is the IO either readable or writeable?
|
53
|
-
def register(io, interest)
|
54
|
-
java_channel = io.to_channel
|
55
|
-
java_channel.configureBlocking(false)
|
56
|
-
interest_ops = self.class.sym2iops(interest, java_channel)
|
57
|
-
|
58
|
-
begin
|
59
|
-
selector_key = java_channel.register @java_selector, interest_ops
|
60
|
-
rescue NativeException => ex
|
61
|
-
case ex.cause
|
62
|
-
when java.lang.IllegalArgumentException
|
63
|
-
raise ArgumentError, "invalid interest type for #{java_channel}: #{interest}"
|
64
|
-
else raise
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
NIO::Monitor.new(io, selector_key)
|
69
|
-
end
|
70
|
-
|
71
|
-
# Deregister the given IO object from the selector
|
72
|
-
def deregister(io)
|
73
|
-
key = io.to_channel.keyFor(@java_selector)
|
74
|
-
return unless key
|
75
|
-
|
76
|
-
monitor = key.attachment
|
77
|
-
monitor.close
|
78
|
-
monitor
|
79
|
-
end
|
80
|
-
|
81
|
-
# Is the given IO object registered with the selector?
|
82
|
-
def registered?(io)
|
83
|
-
key = io.to_channel.keyFor(@java_selector)
|
84
|
-
return unless key
|
85
|
-
!key.attachment.closed?
|
86
|
-
end
|
87
|
-
|
88
|
-
# Select which monitors are ready
|
89
|
-
def select(timeout = nil)
|
90
|
-
selected = []
|
91
|
-
ready = select_each(timeout) { |monitor| selected << monitor }
|
92
|
-
return unless ready
|
93
|
-
|
94
|
-
selected
|
95
|
-
end
|
96
|
-
|
97
|
-
# Iterate across all selectable monitors
|
98
|
-
def select_each(timeout = nil)
|
99
|
-
@select_lock.synchronize do
|
100
|
-
if timeout == 0
|
101
|
-
# The Java NIO API thinks zero means you want to BLOCK FOREVER o_O
|
102
|
-
# How about we don't block at all instead?
|
103
|
-
ready = @java_selector.selectNow
|
104
|
-
elsif timeout
|
105
|
-
ready = @java_selector.select(timeout * 1000)
|
106
|
-
else
|
107
|
-
ready = @java_selector.select
|
108
|
-
end
|
109
|
-
|
110
|
-
return unless ready > 0 # timeout or wakeup
|
111
|
-
|
112
|
-
@java_selector.selectedKeys.each { |key| yield key.attachment }
|
113
|
-
@java_selector.selectedKeys.clear
|
114
|
-
|
115
|
-
ready
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# Wake up the other thread that's currently blocking on this selector
|
120
|
-
def wakeup
|
121
|
-
raise IOError, "selector is closed" if closed?
|
122
|
-
@java_selector.wakeup
|
123
|
-
nil
|
124
|
-
end
|
125
|
-
|
126
|
-
# Close this selector
|
127
|
-
def close
|
128
|
-
@java_selector.close
|
129
|
-
end
|
130
|
-
|
131
|
-
# Is this selector closed?
|
132
|
-
def closed?
|
133
|
-
!@java_selector.isOpen
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|