mailbox 0.2.5 → 0.2.6

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/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  require "rubygems"
2
+ require 'java'
2
3
  require "rake/testtask"
3
4
  require "rake/rdoctask"
4
5
  require "jeweler"
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 2
4
- :patch: 5
4
+ :patch: 6
5
5
  :build:
data/lib/mailbox.rb CHANGED
@@ -8,6 +8,7 @@
8
8
  # the <tt>:channel</tt> parameter on +mailslot+.
9
9
 
10
10
  require 'rubygems'
11
+ require 'java'
11
12
  require 'jretlang'
12
13
 
13
14
  require File.dirname(__FILE__) + '/synchronized'
@@ -51,6 +52,10 @@ module Mailbox
51
52
 
52
53
  end
53
54
 
55
+ def __queue_depth__
56
+ __queue_counter__.get
57
+ end
58
+
54
59
  private
55
60
  def self.included(base)
56
61
  base.extend(Mailbox::ClassMethods)
@@ -84,6 +89,12 @@ module Mailbox
84
89
  fiber
85
90
  end
86
91
 
92
+ synchronized
93
+ def __queue_counter__
94
+ @__queue_counter__ ||= java.util.concurrent.atomic.AtomicInteger.new
95
+ end
96
+
97
+ synchronized
87
98
  def __fiber__
88
99
  @fiber ||= __started_fiber__
89
100
  end
@@ -145,6 +156,7 @@ module Mailbox
145
156
  define_method method_name do |*args|
146
157
 
147
158
  self.send(@__verbose_target__, "enqueued #{method_name}") if defined? @__verbose_target__
159
+ __queue_counter__.get_and_increment
148
160
 
149
161
  result = nil
150
162
  latch = JRL::Concurrent::CountDownLatch.new(1) if replyable
@@ -152,6 +164,7 @@ module Mailbox
152
164
  __fiber__.execute do
153
165
  begin
154
166
  self.send(@__verbose_target__, "dequeued #{method_name}") if defined? @__verbose_target__
167
+ __queue_counter__.get_and_decrement
155
168
  result = self.send(:"__#{method_name}__", *args )
156
169
  rescue Exception => ex
157
170
  raise if exception_method.nil? || Mailbox.raise_exceptions_immediately
data/mailbox.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mailbox}
8
- s.version = "0.2.5"
8
+ s.version = "0.2.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joel Friedman", "Patrick Farley"]
12
- s.date = %q{2010-09-21}
12
+ s.date = %q{2011-04-19}
13
13
  s.description = %q{Mailbox is a JRuby module that simplifies concurrency and is backed by JVM threads.}
14
14
  s.email = %q{asher.friedman@gmail.com}
15
15
  s.extra_rdoc_files = [
data/test/mailbox_test.rb CHANGED
@@ -1,8 +1,21 @@
1
1
  require 'test_helper.rb'
2
2
 
3
+ module JRL::Concurrent
4
+ class Latch
5
+ def fail_after_sec
6
+ raise Exception.new("timed out waiting one second for latch countdown - remaining count: #{count}") unless await 1
7
+ end
8
+ end
9
+ end
10
+
3
11
  class MailboxTest < Test::Unit::TestCase
4
12
  JThread = java.lang.Thread
5
13
 
14
+
15
+ def jrl_latch count = 1
16
+ JRL::Concurrent::Latch.new count
17
+ end
18
+
6
19
  def test_mailslot_causes_execution_on_separate_thread
7
20
  klass = Class.new do
8
21
  include Mailbox
@@ -15,13 +28,39 @@ class MailboxTest < Test::Unit::TestCase
15
28
  end
16
29
 
17
30
  thread_info = {}
18
- latch = Latches::CountDownLatch.new( 1 )
31
+ latch = jrl_latch
19
32
  klass.new.test_method(latch, thread_info)
20
33
 
21
- assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
34
+ latch.fail_after_sec
22
35
  assert_not_equal JThread.current_thread.name, thread_info[:name]
23
36
  end
24
37
 
38
+ def test_mailbox_supports_concurrent_mailslot_calls_on_new_mailbox_object
39
+ klass = Class.new do
40
+ include Mailbox
41
+
42
+ attr_reader :failed
43
+ def initialize; @items = []; @failed = nil; end
44
+
45
+ mailslot :exception => :fail_test
46
+ def one
47
+ raise Exception.new('items not empty!') unless @items.empty?
48
+ @items << 1
49
+ sleep 0.01
50
+ raise Exception.new("items not exactly [1]!") unless @items == [1]
51
+ @items.pop
52
+ raise Exception.new('items not empty') unless @items.empty?
53
+ end
54
+
55
+ def fail_test e; @failed = e; end
56
+ end
57
+
58
+ o = klass.new
59
+ 10.times { Thread.new { o.one } }
60
+
61
+ assert_nil o.failed
62
+ end
63
+
25
64
  def test_mailslot_supports_threadpool_based_fibers
26
65
  klass = Class.new do
27
66
  include Mailbox
@@ -36,10 +75,10 @@ class MailboxTest < Test::Unit::TestCase
36
75
  end
37
76
 
38
77
  thread_info = {}
39
- latch = Latches::CountDownLatch.new( 1 )
78
+ latch = jrl_latch
40
79
  klass.new.test_method(latch, thread_info)
41
80
 
42
- assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
81
+ latch.fail_after_sec
43
82
  assert_not_equal JThread.current_thread.name, thread_info[:name]
44
83
  end
45
84
 
@@ -64,10 +103,10 @@ class MailboxTest < Test::Unit::TestCase
64
103
  end
65
104
  end
66
105
 
67
- latch = Latches::CountDownLatch.new( 1 )
106
+ latch = jrl_latch
68
107
  clazz = klass.new(latch)
69
108
  clazz.test_method
70
- assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
109
+ latch.fail_after_sec
71
110
  assert_equal "test exception", clazz.ex.message
72
111
  end
73
112
 
@@ -163,13 +202,13 @@ class MailboxTest < Test::Unit::TestCase
163
202
  end
164
203
 
165
204
  thread_info = {}
166
- latch = Latches::CountDownLatch.new 1
205
+ latch = jrl_latch
167
206
  a_channel = JRL::Channel.new
168
207
 
169
208
  klass.new(a_channel)
170
209
  a_channel.publish :latch => latch, :thread_info => thread_info
171
210
 
172
- assert latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out"
211
+ latch.fail_after_sec
173
212
  assert_not_equal JThread.current_thread.name, thread_info[:name]
174
213
  end
175
214
 
@@ -189,7 +228,7 @@ class MailboxTest < Test::Unit::TestCase
189
228
  end
190
229
 
191
230
  thread_info = {}
192
- latch = Latches::CountDownLatch.new 1
231
+ latch = jrl_latch
193
232
  request_channel = JRL::Channels::MemoryRequestChannel.new
194
233
 
195
234
  klass.new(request_channel)
@@ -202,11 +241,11 @@ class MailboxTest < Test::Unit::TestCase
202
241
  latch.count_down
203
242
  end
204
243
 
205
- assert latch.await(1, Latches::TimeUnit::SECONDS), "timed out"
244
+ latch.fail_after_sec
206
245
  assert_equal "ya_rly!", response
207
246
  end
208
247
 
209
- def test_should_support_replayble_messages
248
+ def test_should_support_replyable_messages
210
249
 
211
250
  klass = Class.new do
212
251
  include Mailbox
@@ -254,9 +293,35 @@ class MailboxTest < Test::Unit::TestCase
254
293
 
255
294
  end
256
295
 
257
- def test_should_expose_hooks_to_message_enqueue_and_dequeue
296
+ def test_should_maintain_queue_depth
297
+ klass = Class.new do
298
+ include Mailbox
299
+ include Test::Unit::Assertions
300
+
301
+ def initialize latch
302
+ @latch = latch
303
+ __fiber__.execute do
304
+ latch.fail_after_sec
305
+ end
306
+ end
258
307
 
308
+ mailslot
309
+ def test_method latch
310
+ latch.count_down
311
+ end
312
+ end
259
313
 
314
+ hold_latch = jrl_latch
315
+ agent = klass.new hold_latch
316
+ method_latch = jrl_latch 10
317
+ 10.times { agent.test_method method_latch }
318
+ assert_equal 10, agent.__queue_depth__
319
+ hold_latch.count_down
320
+ method_latch.fail_after_sec
321
+ assert_equal 0, agent.__queue_depth__
322
+ end
323
+
324
+ def test_should_expose_hooks_to_message_enqueue_and_dequeue
260
325
  klass = Class.new do
261
326
  include Mailbox
262
327
  attr_accessor :msg_info
@@ -279,13 +344,13 @@ class MailboxTest < Test::Unit::TestCase
279
344
 
280
345
  end
281
346
 
282
- latch = JRL::Concurrent::Latch.new 2
347
+ latch = jrl_latch 2
283
348
 
284
349
  test_agent = klass.new latch
285
350
  test_agent.test_method
286
351
  test_agent.test_method
287
352
 
288
- assert latch.await(1), "timed out waiting for test_method to trip latch twice"
353
+ latch.fail_after_sec
289
354
 
290
355
  expected = ['enqueued test_method', 'dequeued test_method', 'enqueued test_method', 'dequeued test_method']
291
356
  assert_equal expected, test_agent.msg_info
@@ -301,13 +366,14 @@ class MailboxTest < Test::Unit::TestCase
301
366
  end
302
367
 
303
368
  test_agent = klass.new
304
- latch = JRL::Concurrent::Latch.new 1
369
+ latch = jrl_latch
305
370
  test_agent.count_down latch
306
- assert latch.await(1), "timed out waiting for first latch"
371
+
372
+ latch.fail_after_sec
307
373
 
308
374
  test_agent.dispose
309
375
 
310
- latch = JRL::Concurrent::Latch.new 1
376
+ latch = jrl_latch
311
377
  test_agent.count_down latch
312
378
  assert !latch.await(1), "latch didn't time out after fiber was disposed"
313
379
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 5
9
- version: 0.2.5
8
+ - 6
9
+ version: 0.2.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Joel Friedman
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-21 00:00:00 -05:00
18
+ date: 2011-04-19 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency