zmachine 0.4.0 → 0.4.1
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/Gemfile +2 -2
- data/java/com/liquidm/zmachine/HashedWheel$Timeout.class +0 -0
- data/java/com/liquidm/zmachine/HashedWheel.class +0 -0
- data/java/com/liquidm/zmachine/HashedWheel.java +48 -25
- data/lib/zmachine.rb +2 -4
- data/lib/zmachine/reactor.rb +2 -10
- data/lib/zmachine/zmq_channel.rb +3 -30
- data/spec/channel_spec.rb +2 -2
- data/spec/connection_spec.rb +1 -1
- data/spec/hashed_wheel_spec.rb +7 -8
- data/zmachine.gemspec +1 -1
- metadata +2 -3
- data/lib/zmachine/jeromq-0.3.2-SNAPSHOT.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5e36adcf8fc731b92bdc5d54272901f14caaf5d
|
4
|
+
data.tar.gz: f51726dae520643f03491643bd2ed65c11d9cad2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10c3cd9dfab40a3bdbaae428bd168aa99f5ce9536778f31d627d2ce6bb1e6986f83316d55d01eefe70235573264d47852cdd8bf3bd104fc3edc2ea16dd209205
|
7
|
+
data.tar.gz: c5d87d4b03ac6fbfa883abe2e9850bd2cedaa2bcacfdac2a0a68105afa260a6da5bdd104844140a22ddb1fe833de3352ccee1fe46565a9cb17a6b151ec1dcf5c
|
data/Gemfile
CHANGED
Binary file
|
Binary file
|
@@ -3,30 +3,51 @@ package com.liquidm.zmachine;
|
|
3
3
|
import java.lang.System;
|
4
4
|
import java.util.ArrayList;
|
5
5
|
import java.util.Iterator;
|
6
|
+
import java.util.SortedSet;
|
7
|
+
import java.util.TreeSet;
|
6
8
|
import java.util.concurrent.Callable;
|
7
9
|
|
8
10
|
public class HashedWheel
|
9
11
|
{
|
10
|
-
private class Timeout
|
12
|
+
private class Timeout implements Comparable<Timeout>
|
11
13
|
{
|
12
|
-
long deadline;
|
13
|
-
Object callback;
|
14
|
-
boolean canceled;
|
14
|
+
private long deadline;
|
15
|
+
private Callable<Object> callback;
|
16
|
+
private boolean canceled;
|
15
17
|
|
16
|
-
public Timeout(long deadline, Object callback)
|
18
|
+
public Timeout(long deadline, Callable<Object> callback)
|
17
19
|
{
|
18
20
|
this.deadline = deadline;
|
19
21
|
this.callback = callback;
|
20
22
|
this.canceled = false;
|
21
23
|
}
|
22
24
|
|
25
|
+
public int compareTo(Timeout other)
|
26
|
+
{
|
27
|
+
return (int)(this.deadline - other.getDeadline());
|
28
|
+
}
|
29
|
+
|
30
|
+
public long getDeadline()
|
31
|
+
{
|
32
|
+
return this.deadline;
|
33
|
+
}
|
34
|
+
|
23
35
|
public Object getCallback()
|
24
36
|
{
|
25
37
|
return this.callback;
|
26
38
|
}
|
27
39
|
|
40
|
+
public void call() throws Exception
|
41
|
+
{
|
42
|
+
if (this.callback != null) {
|
43
|
+
this.callback.call();
|
44
|
+
this.cancel();
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
28
48
|
public void cancel()
|
29
49
|
{
|
50
|
+
this.callback = null;
|
30
51
|
this.canceled = true;
|
31
52
|
}
|
32
53
|
|
@@ -37,9 +58,11 @@ public class HashedWheel
|
|
37
58
|
}
|
38
59
|
|
39
60
|
int number_of_slots;
|
61
|
+
ArrayList<SortedSet<Timeout>> slots;
|
62
|
+
|
40
63
|
long tick_length;
|
41
|
-
Object[] slots;
|
42
64
|
int current_tick;
|
65
|
+
|
43
66
|
long last;
|
44
67
|
|
45
68
|
public HashedWheel(int number_of_slots, long tick_length)
|
@@ -49,8 +72,7 @@ public class HashedWheel
|
|
49
72
|
reset();
|
50
73
|
}
|
51
74
|
|
52
|
-
|
53
|
-
public Object[] getSlots()
|
75
|
+
public ArrayList<SortedSet<Timeout>> getSlots()
|
54
76
|
{
|
55
77
|
return this.slots;
|
56
78
|
}
|
@@ -61,15 +83,15 @@ public class HashedWheel
|
|
61
83
|
}
|
62
84
|
|
63
85
|
@SuppressWarnings("unchecked")
|
64
|
-
public Timeout add(long timeout, Object callback)
|
86
|
+
public Timeout add(long timeout, Callable<Object> callback)
|
65
87
|
{
|
66
88
|
timeout = timeout * 1000000; // ms to ns
|
89
|
+
long deadline = System.nanoTime() + timeout;
|
67
90
|
long ticks = timeout / this.tick_length;
|
68
91
|
int slot = (int)((this.current_tick + ticks) % this.number_of_slots);
|
69
|
-
long deadline = System.nanoTime() + timeout;
|
70
92
|
Timeout hwt = new Timeout(deadline, callback);
|
71
|
-
|
72
|
-
|
93
|
+
SortedSet<Timeout> timeouts = this.slots.get(slot);
|
94
|
+
timeouts.add(hwt);
|
73
95
|
return hwt;
|
74
96
|
}
|
75
97
|
|
@@ -80,41 +102,42 @@ public class HashedWheel
|
|
80
102
|
|
81
103
|
public long reset(long last)
|
82
104
|
{
|
83
|
-
this.slots = new
|
105
|
+
this.slots = new ArrayList<SortedSet<Timeout>>(this.number_of_slots);
|
84
106
|
for (int i = 0; i < this.number_of_slots; i++) {
|
85
|
-
this.slots
|
107
|
+
this.slots.add(i, new TreeSet<Timeout>());
|
86
108
|
}
|
87
109
|
this.current_tick = 0;
|
88
110
|
this.last = last;
|
89
111
|
return last;
|
90
112
|
}
|
91
113
|
|
92
|
-
public
|
114
|
+
public int advance() throws Exception
|
93
115
|
{
|
94
116
|
return advance(System.nanoTime());
|
95
117
|
}
|
96
118
|
|
97
|
-
|
98
|
-
public ArrayList<Timeout> advance(long now)
|
119
|
+
public int advance(long now) throws Exception
|
99
120
|
{
|
121
|
+
int timedout = 0;
|
100
122
|
long passed_ticks = (now - this.last) / this.tick_length;
|
101
|
-
ArrayList<Timeout> result = new ArrayList<Timeout>();
|
102
123
|
do {
|
103
124
|
this.current_tick = this.current_tick % this.number_of_slots;
|
104
|
-
|
125
|
+
SortedSet<Timeout> timeouts = this.slots.get(this.current_tick);
|
126
|
+
Iterator<Timeout> it = timeouts.iterator();
|
105
127
|
while (it.hasNext()) {
|
106
128
|
Timeout timeout = it.next();
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
}
|
111
|
-
it.remove();
|
129
|
+
long deadline = timeout.getDeadline();
|
130
|
+
if (deadline > now) {
|
131
|
+
break;
|
112
132
|
}
|
133
|
+
timedout++;
|
134
|
+
timeout.call();
|
135
|
+
it.remove();
|
113
136
|
}
|
114
137
|
this.current_tick += 1;
|
115
138
|
passed_ticks -= 1;
|
116
139
|
} while (passed_ticks > 0);
|
117
140
|
this.last = now;
|
118
|
-
return
|
141
|
+
return timedout;
|
119
142
|
}
|
120
143
|
}
|
data/lib/zmachine.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'zmachine/jeromq-0.3.2-SNAPSHOT.jar'
|
2
|
-
java_import org.zeromq.ZContext
|
3
|
-
|
4
1
|
require 'liquid/boot'
|
5
2
|
|
6
3
|
require 'zmachine/connection'
|
@@ -24,8 +21,9 @@ module ZMachine
|
|
24
21
|
Thread.current[:reactor] ||= Reactor.new
|
25
22
|
end
|
26
23
|
|
24
|
+
# for backwards compat. please use ZContext.instance directly.
|
27
25
|
def self.context
|
28
|
-
|
26
|
+
ZContext.instance
|
29
27
|
end
|
30
28
|
|
31
29
|
def self.add_periodic_timer(*args, &block)
|
data/lib/zmachine/reactor.rb
CHANGED
@@ -122,7 +122,7 @@ module ZMachine
|
|
122
122
|
@running = false
|
123
123
|
Reactor.unregister_reactor(self)
|
124
124
|
ZMachine.logger.debug("zmachine:reactor:#{__method__}", stop: :zcontext) if ZMachine.debug
|
125
|
-
|
125
|
+
ZContext.destroy
|
126
126
|
ZMachine.clear_current_reactor
|
127
127
|
end
|
128
128
|
end
|
@@ -131,7 +131,7 @@ module ZMachine
|
|
131
131
|
ZMachine.logger.debug("zmachine:reactor:#{__method__}") if ZMachine.debug
|
132
132
|
run_deferred_callbacks
|
133
133
|
return unless @run_reactor
|
134
|
-
|
134
|
+
@wheel.advance
|
135
135
|
return unless @run_reactor
|
136
136
|
@connection_manager.cleanup
|
137
137
|
if @connection_manager.idle?
|
@@ -172,14 +172,6 @@ module ZMachine
|
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
175
|
-
def run_timers
|
176
|
-
ZMachine.logger.debug("zmachine:reactor:#{__method__}") if ZMachine.debug
|
177
|
-
@wheel.advance.each do |timeout|
|
178
|
-
ZMachine.logger.info("zmachine:reactor:#{__method__}", callback: timeout.callback) if ZMachine.debug
|
179
|
-
timeout.callback.call
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
175
|
def wakeup
|
184
176
|
ZMachine.logger.debug("zmachine:reactor:#{__method__}") if ZMachine.debug
|
185
177
|
@selector.wakeup if @selector
|
data/lib/zmachine/zmq_channel.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
require 'zmachine/jeromq-0.3.2-SNAPSHOT.jar'
|
2
|
-
java_import org.zeromq.ZMsg
|
3
|
-
java_import org.zeromq.ZMQ
|
4
|
-
java_import org.zeromq.ZMQException
|
5
|
-
|
6
1
|
require 'zmachine'
|
7
2
|
require 'zmachine/channel'
|
8
3
|
|
@@ -42,7 +37,7 @@ module ZMachine
|
|
42
37
|
ZMachine.logger.debug("zmachine:zmq_channel:#{__method__}", channel: self) if ZMachine.debug
|
43
38
|
@bound = true
|
44
39
|
@connected = true
|
45
|
-
@socket =
|
40
|
+
@socket = ZContext.create_socket(type)
|
46
41
|
@socket.bind(address)
|
47
42
|
end
|
48
43
|
|
@@ -58,7 +53,7 @@ module ZMachine
|
|
58
53
|
def connect(address, type)
|
59
54
|
ZMachine.logger.debug("zmachine:zmq_channel:#{__method__}", channel: self) if ZMachine.debug
|
60
55
|
@connection_pending = true
|
61
|
-
@socket =
|
56
|
+
@socket = ZContext.create_socket(type)
|
62
57
|
@socket.connect(address)
|
63
58
|
end
|
64
59
|
|
@@ -84,34 +79,12 @@ module ZMachine
|
|
84
79
|
data
|
85
80
|
end
|
86
81
|
|
87
|
-
def send1(a)
|
88
|
-
@socket.send_byte_array(a, ZMQ::DONTWAIT)
|
89
|
-
end
|
90
|
-
|
91
|
-
def send2(a, b)
|
92
|
-
@socket.send_byte_array(a, ZMQ::SNDMORE | ZMQ::DONTWAIT) and
|
93
|
-
@socket.send_byte_array(b, ZMQ::DONTWAIT)
|
94
|
-
end
|
95
|
-
|
96
|
-
def send3(a, b, c)
|
97
|
-
@socket.send_byte_array(a, ZMQ::SNDMORE | ZMQ::DONTWAIT) and
|
98
|
-
@socket.send_byte_array(b, ZMQ::SNDMORE | ZMQ::DONTWAIT) and
|
99
|
-
@socket.send_byte_array(c, ZMQ::DONTWAIT)
|
100
|
-
end
|
101
|
-
|
102
|
-
def send4(a, b, c, d)
|
103
|
-
@socket.send_byte_array(a, ZMQ::SNDMORE | ZMQ::DONTWAIT) and
|
104
|
-
@socket.send_byte_array(b, ZMQ::SNDMORE | ZMQ::DONTWAIT) and
|
105
|
-
@socket.send_byte_array(c, ZMQ::SNDMORE | ZMQ::DONTWAIT) and
|
106
|
-
@socket.send_byte_array(d, ZMQ::DONTWAIT)
|
107
|
-
end
|
108
|
-
|
109
82
|
def close!
|
110
83
|
ZMachine.logger.debug("zmachine:zmq_channel:#{__method__}", channel: self) if ZMachine.debug
|
111
84
|
@closed = true
|
112
85
|
@connected = false
|
113
86
|
@bound = false
|
114
|
-
|
87
|
+
ZContext.destroy_socket(@socket)
|
115
88
|
end
|
116
89
|
|
117
90
|
def closed?
|
data/spec/channel_spec.rb
CHANGED
@@ -106,7 +106,7 @@ describe TCPChannel do
|
|
106
106
|
after(:each) do
|
107
107
|
@client.close
|
108
108
|
@server.close
|
109
|
-
|
109
|
+
ZContext.destroy
|
110
110
|
end
|
111
111
|
|
112
112
|
let(:data) { "foo".to_java_bytes }
|
@@ -157,7 +157,7 @@ describe ZMQChannel do
|
|
157
157
|
after(:each) do
|
158
158
|
@client.close
|
159
159
|
@server.close
|
160
|
-
|
160
|
+
ZContext.destroy
|
161
161
|
end
|
162
162
|
|
163
163
|
let(:data) { "foo".to_java_bytes }
|
data/spec/connection_spec.rb
CHANGED
data/spec/hashed_wheel_spec.rb
CHANGED
@@ -20,7 +20,7 @@ describe ZMachine::HashedWheel do
|
|
20
20
|
wheel.add 10
|
21
21
|
wheel.add 50
|
22
22
|
timedout = wheel.advance(now + 30 * 1_000_000)
|
23
|
-
expect(timedout
|
23
|
+
expect(timedout).to eq(1)
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'calculates the timeout set correctly' do
|
@@ -31,18 +31,17 @@ describe ZMachine::HashedWheel do
|
|
31
31
|
wheel.add 3300
|
32
32
|
wheel.add 4000
|
33
33
|
timedout = wheel.advance(now + 3900 * 1_000_000)
|
34
|
-
expect(timedout).to
|
35
|
-
expect(timedout.length).to eq(4)
|
34
|
+
expect(timedout).to eq(4)
|
36
35
|
end
|
37
36
|
|
38
37
|
it 'cancels timers correctly' do
|
39
38
|
now = wheel.reset
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
result = nil
|
40
|
+
wheel.add(90, -> { result = true })
|
41
|
+
wheel.add(110, -> { result = false }).cancel
|
43
42
|
timedout = wheel.advance(now + 200 * 1_000_000)
|
44
|
-
expect(
|
45
|
-
expect(timedout
|
43
|
+
expect(result).to eq(true)
|
44
|
+
expect(timedout).to eq(2)
|
46
45
|
end
|
47
46
|
|
48
47
|
end
|
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.4.
|
5
|
+
spec.version = "0.4.1"
|
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.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LiquidM, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid-ext
|
@@ -54,7 +54,6 @@ files:
|
|
54
54
|
- lib/zmachine/connection_manager.rb
|
55
55
|
- lib/zmachine/deferrable.rb
|
56
56
|
- lib/zmachine/hashed_wheel.rb
|
57
|
-
- lib/zmachine/jeromq-0.3.2-SNAPSHOT.jar
|
58
57
|
- lib/zmachine/reactor.rb
|
59
58
|
- lib/zmachine/tcp_channel.rb
|
60
59
|
- lib/zmachine/timers.rb
|
Binary file
|