zmachine 0.3.0 → 0.3.2
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.
- checksums.yaml +4 -4
- data/lib/zmachine/channel.rb +7 -5
- data/lib/zmachine/connection.rb +2 -1
- data/lib/zmachine/connection_manager.rb +11 -6
- data/lib/zmachine/hashed_wheel.rb +4 -4
- data/lib/zmachine/reactor.rb +3 -2
- data/lib/zmachine/tcp_channel.rb +4 -4
- data/lib/zmachine/zmq_channel.rb +1 -0
- data/spec/channel_spec.rb +2 -1
- data/zmachine.gemspec +1 -1
- metadata +3 -4
- data/lib/zmachine/acceptor.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bfd7346cba3e70c873af45a7db7690424396720
|
4
|
+
data.tar.gz: ee92ca58e8ec0996531625d17bdb340c26b754e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1031edf74c86b34f00d0c22ea4fc04fa36c4a54651ce7c5570f23b91713ad9f51bce3aec9a6c61e38d5cbbaa48588268497351c73f8cc1e5de5a86d21ff2072
|
7
|
+
data.tar.gz: 72171c7f7958bdfd3bf0e5f5bc0d419be6d9df3ec5d6b94d799f1db5cdaad70cf06477409d0741fbf522e512d4c6c3026d648df5595eb4d9c1294f345dd86604
|
data/lib/zmachine/channel.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
java_import java.nio.ByteBuffer
|
1
|
+
java_import 'java.nio.ByteBuffer'
|
2
|
+
java_import 'java.util.concurrent.ConcurrentLinkedQueue'
|
2
3
|
|
3
4
|
module ZMachine
|
4
5
|
class Channel
|
@@ -8,7 +9,7 @@ module ZMachine
|
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
@inbound_buffer = ByteBuffer.allocate(1024 * 1024)
|
11
|
-
@outbound_queue =
|
12
|
+
@outbound_queue = ConcurrentLinkedQueue.new
|
12
13
|
@raw = false
|
13
14
|
end
|
14
15
|
|
@@ -38,20 +39,21 @@ module ZMachine
|
|
38
39
|
return unless data
|
39
40
|
buffer = ByteBuffer.wrap(data)
|
40
41
|
if buffer.has_remaining
|
41
|
-
@outbound_queue
|
42
|
+
@outbound_queue.add(buffer)
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
46
|
def write_outbound_data
|
46
47
|
ZMachine.logger.debug("zmachine:channel:#{__method__}", channel: self, can_send: can_send?) if ZMachine.debug
|
47
48
|
while can_send?
|
48
|
-
buffer = @outbound_queue.
|
49
|
+
buffer = @outbound_queue.peek
|
50
|
+
break unless buffer
|
49
51
|
@socket.write(buffer) if buffer.has_remaining
|
50
52
|
# Did we consume the whole outbound buffer? If yes,
|
51
53
|
# pop it off and keep looping. If no, the outbound network
|
52
54
|
# buffers are full, so break out of here.
|
53
55
|
break if buffer.has_remaining
|
54
|
-
@outbound_queue.
|
56
|
+
@outbound_queue.poll
|
55
57
|
end
|
56
58
|
maybe_close_with_callback
|
57
59
|
end
|
data/lib/zmachine/connection.rb
CHANGED
@@ -28,6 +28,7 @@ module ZMachine
|
|
28
28
|
@channel = klass.new
|
29
29
|
@channel.bind(address, port_or_type)
|
30
30
|
@block = block
|
31
|
+
@block.call(self) if @block && @channel.is_a?(ZMQChannel)
|
31
32
|
self
|
32
33
|
end
|
33
34
|
|
@@ -165,7 +166,7 @@ module ZMachine
|
|
165
166
|
|
166
167
|
def register(selector)
|
167
168
|
ZMachine.logger.debug("zmachine:connection:#{__method__}", connection: self, fd: @channel.selectable_fd) if ZMachine.debug
|
168
|
-
@channel_key
|
169
|
+
@channel_key = @channel.selectable_fd.register(selector, current_events, self)
|
169
170
|
end
|
170
171
|
|
171
172
|
def valid?
|
@@ -2,6 +2,7 @@ java_import java.nio.channels.ClosedChannelException
|
|
2
2
|
|
3
3
|
require 'zmachine/tcp_channel'
|
4
4
|
require 'zmachine/zmq_channel'
|
5
|
+
require 'set'
|
5
6
|
|
6
7
|
module ZMachine
|
7
8
|
class ConnectionManager
|
@@ -11,10 +12,10 @@ module ZMachine
|
|
11
12
|
def initialize(selector)
|
12
13
|
ZMachine.logger.debug("zmachine:connection_manager:#{__method__}") if ZMachine.debug
|
13
14
|
@selector = selector
|
14
|
-
@connections =
|
15
|
-
@zmq_connections =
|
16
|
-
@new_connections =
|
17
|
-
@unbound_connections =
|
15
|
+
@connections = Set.new
|
16
|
+
@zmq_connections = Set.new
|
17
|
+
@new_connections = Set.new
|
18
|
+
@unbound_connections = Set.new
|
18
19
|
end
|
19
20
|
|
20
21
|
def idle?
|
@@ -81,7 +82,7 @@ module ZMachine
|
|
81
82
|
end
|
82
83
|
|
83
84
|
def add_new_connections
|
84
|
-
@new_connections.
|
85
|
+
@new_connections.each do |connection|
|
85
86
|
ZMachine.logger.debug("zmachine:connection_manager:#{__method__}", connection: connection) if ZMachine.debug
|
86
87
|
begin
|
87
88
|
connection.register(@selector)
|
@@ -97,6 +98,10 @@ module ZMachine
|
|
97
98
|
@new_connections.clear
|
98
99
|
end
|
99
100
|
|
101
|
+
def is_connected?(connection)
|
102
|
+
@connections.include?(connection)
|
103
|
+
end
|
104
|
+
|
100
105
|
def cleanup
|
101
106
|
return if @unbound_connections.empty?
|
102
107
|
ZMachine.logger.debug("zmachine:connection_manager:#{__method__}") if ZMachine.debug
|
@@ -111,7 +116,7 @@ module ZMachine
|
|
111
116
|
else
|
112
117
|
connection.unbind
|
113
118
|
end
|
114
|
-
connection.close
|
119
|
+
connection.channel.close!
|
115
120
|
rescue Exception => e
|
116
121
|
ZMachine.logger.exception(e, "failed to unbind connection") if ZMachine.debug
|
117
122
|
end
|
@@ -35,10 +35,10 @@ module ZMachine
|
|
35
35
|
def add(timeout, &block)
|
36
36
|
timeout *= 1_000_000_000 # s to ns
|
37
37
|
ticks = timeout / @tick_length
|
38
|
-
slot
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
slot = (@current_tick + ticks) % @slots.length
|
39
|
+
deadline = System.nano_time + timeout
|
40
|
+
@slots[slot] << hwt = HashedWheelTimeout.new(deadline, &block)
|
41
|
+
hwt
|
42
42
|
end
|
43
43
|
|
44
44
|
def reset(time = nil)
|
data/lib/zmachine/reactor.rb
CHANGED
@@ -92,9 +92,10 @@ module ZMachine
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def reconnect(server, port_or_type, handler)
|
95
|
-
return if handler && handler.channel.is_a?(ZMQChannel)
|
95
|
+
return handler if handler && handler.channel.is_a?(ZMQChannel)
|
96
96
|
ZMachine.logger.debug("zmachine:reactor:#{__method__}", server: server, port_or_type: port_or_type) if ZMachine.debug
|
97
|
-
|
97
|
+
return handler if handler.connected?
|
98
|
+
connect(server, port_or_type, handler)
|
98
99
|
end
|
99
100
|
|
100
101
|
def run(callback=nil, shutdown_hook=nil, &block)
|
data/lib/zmachine/tcp_channel.rb
CHANGED
@@ -21,7 +21,7 @@ module ZMachine
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def bound?
|
24
|
-
@socket.is_a?(ServerSocketChannel) && @socket.bound?
|
24
|
+
@socket.is_a?(ServerSocketChannel) && @socket.socket.bound?
|
25
25
|
end
|
26
26
|
|
27
27
|
def accept
|
@@ -29,9 +29,9 @@ module ZMachine
|
|
29
29
|
client_socket = @socket.accept
|
30
30
|
return unless client_socket
|
31
31
|
client_socket.configure_blocking(false)
|
32
|
-
TCPChannel.new
|
33
|
-
|
34
|
-
|
32
|
+
channel = TCPChannel.new
|
33
|
+
channel.socket = client_socket
|
34
|
+
channel
|
35
35
|
end
|
36
36
|
|
37
37
|
def connect(address, port)
|
data/lib/zmachine/zmq_channel.rb
CHANGED
@@ -78,6 +78,7 @@ module ZMachine
|
|
78
78
|
|
79
79
|
def read_inbound_data
|
80
80
|
ZMachine.logger.debug("zmachine:zmq_channel:#{__method__}", channel: self) if ZMachine.debug
|
81
|
+
return nil unless can_recv?
|
81
82
|
data = ZMsg.recv_msg(@socket)
|
82
83
|
data = String.from_java_bytes(data.first.data) unless @raw
|
83
84
|
data
|
data/spec/channel_spec.rb
CHANGED
@@ -38,6 +38,7 @@ shared_examples_for "a Channel" do
|
|
38
38
|
before(:each) do
|
39
39
|
@channel = @server.accept
|
40
40
|
@channel.raw = false
|
41
|
+
ZMQChannel.any_instance.stub(:can_recv?) { true }
|
41
42
|
@client.finish_connecting
|
42
43
|
end
|
43
44
|
|
@@ -84,7 +85,7 @@ shared_examples_for "a Channel" do
|
|
84
85
|
end
|
85
86
|
|
86
87
|
it 'closes the connection after writing' do
|
87
|
-
|
88
|
+
@server.accept
|
88
89
|
@client.finish_connecting
|
89
90
|
@client.send_data(data)
|
90
91
|
@client.close(true)
|
data/zmachine.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "zmachine"
|
5
|
-
spec.version = "0.3.
|
5
|
+
spec.version = "0.3.2"
|
6
6
|
spec.authors = ["LiquidM, Inc."]
|
7
7
|
spec.email = ["opensource@liquidm.com"]
|
8
8
|
spec.description = %q{pure JRuby multi-threaded mostly EventMachine compatible event loop}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LiquidM, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid-ext
|
@@ -45,7 +45,6 @@ files:
|
|
45
45
|
- examples/echo_client.rb
|
46
46
|
- examples/echo_server.rb
|
47
47
|
- lib/zmachine.rb
|
48
|
-
- lib/zmachine/acceptor.rb
|
49
48
|
- lib/zmachine/channel.rb
|
50
49
|
- lib/zmachine/connection.rb
|
51
50
|
- lib/zmachine/connection_manager.rb
|
@@ -83,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
82
|
version: '0'
|
84
83
|
requirements: []
|
85
84
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.1
|
85
|
+
rubygems_version: 2.2.1
|
87
86
|
signing_key:
|
88
87
|
specification_version: 4
|
89
88
|
summary: pure JRuby multi-threaded mostly EventMachine compatible event loop
|
data/lib/zmachine/acceptor.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module ZMachine
|
2
|
-
class Acceptor
|
3
|
-
attr_reader :klass
|
4
|
-
attr_reader :args
|
5
|
-
attr_reader :callback
|
6
|
-
|
7
|
-
def initialize(channel, klass, *args)
|
8
|
-
@klass, @args, @callback = klass, args[0...-1], args.last
|
9
|
-
@channel = channel
|
10
|
-
end
|
11
|
-
|
12
|
-
def unbind
|
13
|
-
end
|
14
|
-
|
15
|
-
def close
|
16
|
-
@channel.close
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|