nio4r 0.2.2-java → 0.3.0-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|