concurrent-ruby 0.6.1 → 0.7.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/concurrent.rb +3 -4
  4. data/lib/concurrent/atomic.rb +46 -0
  5. data/lib/concurrent/atomic_reference/concurrent_update_error.rb +7 -0
  6. data/lib/concurrent/atomic_reference/delegated_update.rb +28 -0
  7. data/lib/concurrent/atomic_reference/direct_update.rb +28 -0
  8. data/lib/concurrent/atomic_reference/jruby.rb +8 -0
  9. data/lib/concurrent/atomic_reference/mutex_atomic.rb +47 -0
  10. data/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb +24 -0
  11. data/lib/concurrent/atomic_reference/rbx.rb +16 -0
  12. data/lib/concurrent/atomic_reference/ruby.rb +16 -0
  13. data/lib/concurrent/atomics.rb +1 -1
  14. data/lib/concurrent/configuration.rb +1 -1
  15. data/lib/concurrent/supervisor.rb +1 -1
  16. data/lib/concurrent/timer_task.rb +0 -36
  17. data/lib/concurrent/version.rb +1 -1
  18. data/lib/concurrent_ruby_ext.so +0 -0
  19. data/lib/extension_helper.rb +9 -0
  20. metadata +16 -148
  21. data/lib/concurrent/actor/actor.rb +0 -270
  22. data/lib/concurrent/actor/postable.rb +0 -102
  23. data/lib/concurrent/actors.rb +0 -2
  24. data/lib/concurrent/atomic/atomic.rb +0 -48
  25. data/lib/concurrent/runnable.rb +0 -90
  26. data/lib/concurrent/stoppable.rb +0 -20
  27. data/spec/concurrent/actor/actor_spec.rb +0 -376
  28. data/spec/concurrent/actor/postable_shared.rb +0 -218
  29. data/spec/concurrent/actress_spec.rb +0 -211
  30. data/spec/concurrent/agent_spec.rb +0 -500
  31. data/spec/concurrent/async_spec.rb +0 -352
  32. data/spec/concurrent/atomic/atomic_boolean_spec.rb +0 -172
  33. data/spec/concurrent/atomic/atomic_fixnum_spec.rb +0 -186
  34. data/spec/concurrent/atomic/atomic_spec.rb +0 -133
  35. data/spec/concurrent/atomic/condition_spec.rb +0 -171
  36. data/spec/concurrent/atomic/copy_on_notify_observer_set_spec.rb +0 -10
  37. data/spec/concurrent/atomic/copy_on_write_observer_set_spec.rb +0 -10
  38. data/spec/concurrent/atomic/count_down_latch_spec.rb +0 -151
  39. data/spec/concurrent/atomic/cyclic_barrier_spec.rb +0 -248
  40. data/spec/concurrent/atomic/event_spec.rb +0 -200
  41. data/spec/concurrent/atomic/observer_set_shared.rb +0 -242
  42. data/spec/concurrent/atomic/thread_local_var_spec.rb +0 -113
  43. data/spec/concurrent/channel/buffered_channel_spec.rb +0 -151
  44. data/spec/concurrent/channel/channel_spec.rb +0 -39
  45. data/spec/concurrent/channel/probe_spec.rb +0 -77
  46. data/spec/concurrent/channel/unbuffered_channel_spec.rb +0 -132
  47. data/spec/concurrent/collection/blocking_ring_buffer_spec.rb +0 -149
  48. data/spec/concurrent/collection/priority_queue_spec.rb +0 -317
  49. data/spec/concurrent/collection/ring_buffer_spec.rb +0 -126
  50. data/spec/concurrent/configuration_spec.rb +0 -69
  51. data/spec/concurrent/dataflow_spec.rb +0 -242
  52. data/spec/concurrent/delay_spec.rb +0 -91
  53. data/spec/concurrent/dereferenceable_shared.rb +0 -146
  54. data/spec/concurrent/exchanger_spec.rb +0 -66
  55. data/spec/concurrent/executor/cached_thread_pool_shared.rb +0 -115
  56. data/spec/concurrent/executor/fixed_thread_pool_shared.rb +0 -136
  57. data/spec/concurrent/executor/global_thread_pool_shared.rb +0 -35
  58. data/spec/concurrent/executor/immediate_executor_spec.rb +0 -12
  59. data/spec/concurrent/executor/java_cached_thread_pool_spec.rb +0 -44
  60. data/spec/concurrent/executor/java_fixed_thread_pool_spec.rb +0 -64
  61. data/spec/concurrent/executor/java_single_thread_executor_spec.rb +0 -21
  62. data/spec/concurrent/executor/java_thread_pool_executor_spec.rb +0 -71
  63. data/spec/concurrent/executor/per_thread_executor_spec.rb +0 -57
  64. data/spec/concurrent/executor/ruby_cached_thread_pool_spec.rb +0 -69
  65. data/spec/concurrent/executor/ruby_fixed_thread_pool_spec.rb +0 -39
  66. data/spec/concurrent/executor/ruby_single_thread_executor_spec.rb +0 -18
  67. data/spec/concurrent/executor/ruby_thread_pool_executor_spec.rb +0 -171
  68. data/spec/concurrent/executor/safe_task_executor_spec.rb +0 -103
  69. data/spec/concurrent/executor/thread_pool_class_cast_spec.rb +0 -52
  70. data/spec/concurrent/executor/thread_pool_executor_shared.rb +0 -155
  71. data/spec/concurrent/executor/thread_pool_shared.rb +0 -269
  72. data/spec/concurrent/executor/timer_set_spec.rb +0 -183
  73. data/spec/concurrent/future_spec.rb +0 -329
  74. data/spec/concurrent/ivar_spec.rb +0 -215
  75. data/spec/concurrent/mvar_spec.rb +0 -380
  76. data/spec/concurrent/obligation_shared.rb +0 -102
  77. data/spec/concurrent/obligation_spec.rb +0 -282
  78. data/spec/concurrent/observable_shared.rb +0 -177
  79. data/spec/concurrent/observable_spec.rb +0 -56
  80. data/spec/concurrent/options_parser_spec.rb +0 -71
  81. data/spec/concurrent/promise_spec.rb +0 -367
  82. data/spec/concurrent/runnable_shared.rb +0 -68
  83. data/spec/concurrent/runnable_spec.rb +0 -235
  84. data/spec/concurrent/scheduled_task_spec.rb +0 -340
  85. data/spec/concurrent/stoppable_shared.rb +0 -37
  86. data/spec/concurrent/supervisor_spec.rb +0 -1149
  87. data/spec/concurrent/timer_task_spec.rb +0 -256
  88. data/spec/concurrent/tvar_spec.rb +0 -137
  89. data/spec/concurrent/utility/processor_count_spec.rb +0 -20
  90. data/spec/concurrent/utility/timeout_spec.rb +0 -50
  91. data/spec/concurrent/utility/timer_spec.rb +0 -52
  92. data/spec/spec_helper.rb +0 -41
  93. data/spec/support/example_group_extensions.rb +0 -52
  94. data/spec/support/less_than_or_equal_to_matcher.rb +0 -5
@@ -1,102 +0,0 @@
1
- require 'spec_helper'
2
-
3
- share_examples_for :obligation do
4
-
5
- context '#state' do
6
-
7
- it 'is :pending when first created' do
8
- f = pending_subject
9
- f.state.should == :pending
10
- f.should be_pending
11
- end
12
-
13
- it 'is :fulfilled when the handler completes' do
14
- f = fulfilled_subject
15
- f.state.should == :fulfilled
16
- f.should be_fulfilled
17
- end
18
-
19
- it 'is :rejected when the handler raises an exception' do
20
- f = rejected_subject
21
- f.state.should == :rejected
22
- f.should be_rejected
23
- end
24
- end
25
-
26
- context '#value' do
27
-
28
- let!(:supports_timeout) { pending_subject.method(:value).arity != 0 }
29
-
30
- it 'returns nil when reaching the optional timeout value' do
31
- if supports_timeout
32
- f = pending_subject
33
- f.value(0).should be_nil
34
- f.should be_pending
35
- end
36
- end
37
-
38
- it 'returns immediately when timeout is zero' do
39
- if supports_timeout
40
- Concurrent.should_not_receive(:timeout).with(any_args())
41
- f = pending_subject
42
- f.value(0).should be_nil
43
- f.should be_pending
44
- end
45
- end
46
-
47
- it 'returns the value when fulfilled before timeout' do
48
- if supports_timeout
49
- f = pending_subject
50
- f.value(10).should be_true
51
- f.should be_fulfilled
52
- end
53
- end
54
-
55
- it 'returns nil when timeout reached' do
56
- if supports_timeout
57
- f = pending_subject
58
- f.value(0.1).should be_nil
59
- f.should be_pending
60
- end
61
- end
62
-
63
- it 'is nil when :pending' do
64
- if supports_timeout
65
- expected = pending_subject.value(0)
66
- expected.should be_nil
67
- end
68
- end
69
-
70
- it 'blocks the caller when :pending and timeout is nil' do
71
- f = pending_subject
72
- f.value.should be_true
73
- f.should be_fulfilled
74
- end
75
-
76
- it 'is nil when :rejected' do
77
- expected = rejected_subject.value
78
- expected.should be_nil
79
- end
80
-
81
- it 'is set to the return value of the block when :fulfilled' do
82
- expected = fulfilled_subject.value
83
- expected.should eq fulfilled_value
84
- end
85
- end
86
-
87
- context '#reason' do
88
-
89
- it 'is nil when :pending' do
90
- pending_subject.reason.should be_nil
91
- end
92
-
93
- it 'is nil when :fulfilled' do
94
- fulfilled_subject.reason.should be_nil
95
- end
96
-
97
- it 'is set to error object of the exception when :rejected' do
98
- rejected_subject.reason.should be_a(Exception)
99
- rejected_subject.reason.to_s.should =~ /#{rejected_reason}/
100
- end
101
- end
102
- end
@@ -1,282 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Concurrent
4
-
5
- describe Obligation do
6
-
7
- let (:obligation_class) do
8
-
9
- Class.new do
10
- include Obligation
11
-
12
- def initialize
13
- init_mutex
14
- end
15
-
16
- public :state=, :compare_and_set_state, :if_state, :mutex
17
- attr_writer :value, :reason
18
- end
19
- end
20
-
21
- let (:obligation) { obligation_class.new }
22
- let (:event) { double 'event' }
23
-
24
- share_examples_for :incomplete do
25
- it 'should be not completed' do
26
- obligation.should_not be_completed
27
- end
28
-
29
- it 'should be incomplete' do
30
- obligation.should be_incomplete
31
- end
32
-
33
- methods = [:value, :value!, :no_error!]
34
- methods.each do |method|
35
- describe "##{method}" do
36
-
37
- it 'should return immediately if timeout is zero' do
38
- obligation.send(method, 0).should(method == :no_error! ? eq(obligation) : be_nil)
39
- end
40
-
41
- it 'should block on the event if timeout is not set' do
42
- obligation.stub(:event).and_return(event)
43
- event.should_receive(:wait).with(nil)
44
-
45
- obligation.send method
46
- end
47
-
48
- it 'should block on the event if timeout is not zero' do
49
- obligation.stub(:event).and_return(event)
50
- event.should_receive(:wait).with(5)
51
-
52
- obligation.send(method, 5)
53
- end
54
-
55
- end
56
- end
57
- end
58
-
59
- context 'unscheduled' do
60
- before(:each) { obligation.state = :unscheduled }
61
- it_should_behave_like :incomplete
62
- end
63
-
64
- context 'pending' do
65
- before(:each) { obligation.state = :pending }
66
- it_should_behave_like :incomplete
67
- end
68
-
69
- context 'fulfilled' do
70
-
71
- before(:each) do
72
- obligation.state = :fulfilled
73
- obligation.send(:value=, 42)
74
- obligation.stub(:event).and_return(event)
75
- end
76
-
77
- it 'should be completed' do
78
- obligation.should be_completed
79
- end
80
-
81
- it 'should be not incomplete' do
82
- obligation.should_not be_incomplete
83
- end
84
-
85
- describe '#value' do
86
-
87
- it 'should return immediately if timeout is zero' do
88
- obligation.value(0).should eq 42
89
- end
90
-
91
- it 'should return immediately if timeout is not set' do
92
- event.should_not_receive(:wait)
93
-
94
- obligation.value.should eq 42
95
- end
96
-
97
- it 'should return immediately if timeout is not zero' do
98
- event.should_not_receive(:wait)
99
-
100
- obligation.value(5).should eq 42
101
- end
102
-
103
- end
104
-
105
- describe '#value!' do
106
-
107
- it 'should return immediately if timeout is zero' do
108
- obligation.value!(0).should eq 42
109
- end
110
-
111
- it 'should return immediately if timeout is not set' do
112
- event.should_not_receive(:wait)
113
-
114
- obligation.value!.should eq 42
115
- end
116
-
117
- it 'should return immediately if timeout is not zero' do
118
- event.should_not_receive(:wait)
119
-
120
- obligation.value!(5).should eq 42
121
- end
122
-
123
- end
124
-
125
- describe '#no_error!' do
126
-
127
- it 'should return immediately if timeout is zero' do
128
- obligation.no_error!(0).should eq obligation
129
- end
130
-
131
- it 'should return immediately if timeout is not set' do
132
- event.should_not_receive(:wait)
133
-
134
- obligation.no_error!.should eq obligation
135
- end
136
-
137
- it 'should return immediately if timeout is not zero' do
138
- event.should_not_receive(:wait)
139
-
140
- obligation.no_error!(5).should eq obligation
141
- end
142
-
143
- end
144
-
145
- end
146
-
147
- context 'rejected' do
148
-
149
- before(:each) do
150
- obligation.state = :rejected
151
- obligation.stub(:event).and_return(event)
152
- end
153
-
154
- it 'should be completed' do
155
- obligation.should be_completed
156
- end
157
-
158
- it 'should be not incomplete' do
159
- obligation.should_not be_incomplete
160
- end
161
-
162
-
163
- describe '#value' do
164
-
165
- it 'should return immediately if timeout is zero' do
166
- event.should_not_receive(:wait)
167
-
168
- obligation.value(0).should be_nil
169
- end
170
-
171
- it 'should return immediately if timeout is not set' do
172
- event.should_not_receive(:wait)
173
-
174
- obligation.value.should be_nil
175
- end
176
-
177
- it 'should return immediately if timeout is not zero' do
178
- event.should_not_receive(:wait)
179
-
180
- obligation.value(5).should be_nil
181
- end
182
-
183
- end
184
-
185
- describe '#value!' do
186
-
187
- it 'should return immediately if timeout is zero' do
188
- event.should_not_receive(:wait)
189
-
190
- -> { obligation.value!(0) }.should raise_error
191
- end
192
-
193
- it 'should return immediately if timeout is not set' do
194
- event.should_not_receive(:wait)
195
-
196
- -> { obligation.value! }.should raise_error
197
- end
198
-
199
- it 'should return immediately if timeout is not zero' do
200
- event.should_not_receive(:wait)
201
-
202
- -> { obligation.value!(5) }.should raise_error
203
- end
204
-
205
- end
206
-
207
- describe '#no_error!' do
208
-
209
- it 'should return immediately if timeout is zero' do
210
- event.should_not_receive(:wait)
211
-
212
- -> { obligation.no_error!(0) }.should raise_error
213
- end
214
-
215
- it 'should return immediately if timeout is not set' do
216
- event.should_not_receive(:wait)
217
-
218
- -> { obligation.no_error! }.should raise_error
219
- end
220
-
221
- it 'should return immediately if timeout is not zero' do
222
- event.should_not_receive(:wait)
223
-
224
- -> { obligation.no_error!(5) }.should raise_error
225
- end
226
-
227
- end
228
-
229
- end
230
-
231
- describe '#compare_and_set_state' do
232
-
233
- before(:each) { obligation.state = :unscheduled }
234
-
235
- context 'unexpected state' do
236
- it 'should return false if state is not the expected one' do
237
- obligation.compare_and_set_state(:pending, :rejected).should be_false
238
- end
239
-
240
- it 'should not change the state if current is not the expected one' do
241
- obligation.compare_and_set_state(:pending, :rejected)
242
- obligation.state.should eq :unscheduled
243
- end
244
- end
245
-
246
- context 'expected state' do
247
- it 'should return true if state is the expected one' do
248
- obligation.compare_and_set_state(:pending, :unscheduled).should be_true
249
- end
250
-
251
- it 'should not change the state if current is not the expected one' do
252
- obligation.compare_and_set_state(:pending, :unscheduled)
253
- obligation.state.should eq :pending
254
- end
255
- end
256
-
257
- end
258
-
259
- describe '#if_state' do
260
-
261
- before(:each) { obligation.state = :unscheduled }
262
-
263
- it 'should raise without block' do
264
- expect { obligation.if_state(:pending) }.to raise_error(ArgumentError)
265
- end
266
-
267
- it 'should return false if state is not expected' do
268
- obligation.if_state(:pending, :rejected) { 42 }.should be_false
269
- end
270
-
271
- it 'should the block value if state is expected' do
272
- obligation.if_state(:rejected, :unscheduled) { 42 }.should eq 42
273
- end
274
-
275
- it 'should execute the block within the mutex' do
276
- obligation.if_state(:unscheduled) { obligation.mutex.should be_locked }
277
- end
278
-
279
- end
280
-
281
- end
282
- end
@@ -1,177 +0,0 @@
1
- require 'spec_helper'
2
-
3
- share_examples_for :observable do
4
-
5
- let(:observer_set) do
6
- subject.instance_variable_get(:@observers)
7
- end
8
-
9
- let(:observer_class) do
10
- Class.new do
11
- def initialize(&block)
12
- @block = block
13
- end
14
- def update(*args)
15
- @block.call(*args) if @block
16
- end
17
- end
18
- end
19
-
20
- let(:observer){ observer_class.new }
21
-
22
- let!(:observer_func){ :notify }
23
-
24
- let(:observer_with_func_class) do
25
- Class.new do
26
- def initialize(&block)
27
- @block = block
28
- end
29
- def notify(*args)
30
- @block.call(*args) if @block
31
- end
32
- end
33
- end
34
-
35
- let(:observer_with_func){ observer_with_func_class.new }
36
-
37
- context '#add_observer' do
38
-
39
- it 'adds an observer if called before first notification' do
40
- observer_set.should_receive(:add_observer).with(any_args)
41
- subject.add_observer(observer)
42
- end
43
-
44
- it 'adds an observer with :func if called before first notification' do
45
- observer_set.should_receive(:add_observer).with(observer_with_func, :notify)
46
- subject.add_observer(observer_with_func, observer_func)
47
- end
48
-
49
- it 'creates an observer from a block if called before first notification' do
50
- block = proc{ nil }
51
- observer_set.should_receive(:add_observer).with(any_args)
52
- subject.add_observer(&block)
53
- end
54
-
55
- it 'raises an exception if not given an observer or a block' do
56
- expect {
57
- subject.add_observer
58
- }.to raise_error(ArgumentError)
59
- end
60
-
61
- it 'raises an exception when given both an observer and a block' do
62
- expect {
63
- subject.add_observer(observer){ nil }
64
- }.to raise_error(ArgumentError)
65
- end
66
- end
67
-
68
- context '#delete_observer' do
69
-
70
- it 'deletes the given observer if called before first notification' do
71
- subject.count_observers.should eq 0
72
- subject.add_observer(observer)
73
- subject.count_observers.should eq 1
74
- subject.delete_observer(observer)
75
- subject.count_observers.should eq 0
76
- end
77
-
78
- it 'returns the removed observer if found in the observer set' do
79
- subject.add_observer(observer)
80
- subject.delete_observer(observer).should eq observer
81
- end
82
-
83
- it 'returns the given observer even when not found in the observer set' do
84
- subject.delete_observer(observer).should eq observer
85
- end
86
- end
87
-
88
- context '#delete_observers' do
89
-
90
- it 'deletes all observers when called before first notification' do
91
- 5.times{ subject.add_observer(observer_class.new) }
92
- subject.count_observers.should eq 5
93
- subject.delete_observers
94
- subject.count_observers.should eq 0
95
- end
96
-
97
- it 'returns self' do
98
- subject.delete_observers.should eq subject
99
- end
100
- end
101
-
102
- context '#count_observers' do
103
-
104
- it 'returns zero for a new observable object' do
105
- subject.count_observers.should eq 0
106
- end
107
-
108
- it 'returns a count of registered observers if called before first notification' do
109
- 5.times{ subject.add_observer(observer_class.new) }
110
- subject.count_observers.should eq 5
111
- end
112
-
113
- it 'returns zero after #delete_observers has been called' do
114
- 5.times{ subject.add_observer(observer_class.new) }
115
- subject.delete_observers
116
- subject.count_observers.should eq 0
117
- end
118
- end
119
-
120
- context 'first notification' do
121
-
122
- it 'calls the #update method on all observers without a specified :func' do
123
- latch = Concurrent::CountDownLatch.new(5)
124
- 5.times do
125
- subject.add_observer(observer_class.new{ latch.count_down })
126
- end
127
- trigger_observable(subject)
128
- latch.count.should eq 0
129
- end
130
-
131
- it 'calls the appropriate function on all observers which specified a :func' do
132
- latch = Concurrent::CountDownLatch.new(5)
133
- 5.times do
134
- obs = observer_with_func_class.new{ latch.count_down }
135
- subject.add_observer(obs, observer_func)
136
- end
137
- trigger_observable(subject)
138
- latch.wait(1)
139
- latch.count.should eq 0
140
- end
141
-
142
- it 'calls the proc for all observers added as a block' do
143
- latch = Concurrent::CountDownLatch.new(5)
144
- 5.times do
145
- subject.add_observer{ latch.count_down }
146
- end
147
- trigger_observable(subject)
148
- latch.wait(1)
149
- latch.count.should eq 0
150
- end
151
-
152
- it 'does not notify any observers removed with #delete_observer' do
153
- latch = Concurrent::CountDownLatch.new(5)
154
-
155
- obs = observer_class.new{ latch.count_down }
156
- subject.add_observer(obs)
157
- subject.delete_observer(obs)
158
-
159
- trigger_observable(subject)
160
- latch.wait(1)
161
- latch.count.should eq 5
162
- end
163
-
164
- it 'does not notify any observers after #delete_observers called' do
165
- latch = Concurrent::CountDownLatch.new(5)
166
- 5.times do
167
- subject.add_observer(observer_class.new{ latch.count_down })
168
- end
169
-
170
- subject.delete_observers
171
-
172
- trigger_observable(subject)
173
- latch.wait(1)
174
- latch.count.should eq 5
175
- end
176
- end
177
- end