concurrent-ruby 0.1.1.pre.3 → 0.1.1.pre.4

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.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -21
  3. data/README.md +275 -279
  4. data/lib/concurrent.rb +27 -28
  5. data/lib/concurrent/agent.rb +114 -108
  6. data/lib/concurrent/cached_thread_pool.rb +129 -130
  7. data/lib/concurrent/defer.rb +65 -67
  8. data/lib/concurrent/event.rb +60 -60
  9. data/lib/concurrent/event_machine_defer_proxy.rb +23 -23
  10. data/lib/concurrent/executor.rb +93 -95
  11. data/lib/concurrent/fixed_thread_pool.rb +95 -89
  12. data/lib/concurrent/functions.rb +120 -120
  13. data/lib/concurrent/future.rb +42 -47
  14. data/lib/concurrent/global_thread_pool.rb +16 -16
  15. data/lib/concurrent/goroutine.rb +29 -29
  16. data/lib/concurrent/null_thread_pool.rb +22 -22
  17. data/lib/concurrent/obligation.rb +67 -67
  18. data/lib/concurrent/promise.rb +174 -166
  19. data/lib/concurrent/reactor.rb +161 -162
  20. data/lib/concurrent/reactor/drb_async_demux.rb +74 -74
  21. data/lib/concurrent/reactor/tcp_sync_demux.rb +98 -98
  22. data/lib/concurrent/thread_pool.rb +76 -69
  23. data/lib/concurrent/utilities.rb +32 -34
  24. data/lib/concurrent/version.rb +3 -3
  25. data/lib/concurrent_ruby.rb +1 -1
  26. data/md/agent.md +123 -123
  27. data/md/defer.md +174 -174
  28. data/md/event.md +32 -32
  29. data/md/executor.md +176 -176
  30. data/md/future.md +83 -83
  31. data/md/goroutine.md +52 -52
  32. data/md/obligation.md +32 -32
  33. data/md/promise.md +227 -227
  34. data/md/thread_pool.md +224 -224
  35. data/spec/concurrent/agent_spec.rb +386 -380
  36. data/spec/concurrent/cached_thread_pool_spec.rb +125 -125
  37. data/spec/concurrent/defer_spec.rb +195 -195
  38. data/spec/concurrent/event_machine_defer_proxy_spec.rb +256 -253
  39. data/spec/concurrent/event_spec.rb +134 -134
  40. data/spec/concurrent/executor_spec.rb +184 -184
  41. data/spec/concurrent/fixed_thread_pool_spec.rb +83 -84
  42. data/spec/concurrent/functions_spec.rb +217 -217
  43. data/spec/concurrent/future_spec.rb +108 -108
  44. data/spec/concurrent/global_thread_pool_spec.rb +38 -38
  45. data/spec/concurrent/goroutine_spec.rb +67 -67
  46. data/spec/concurrent/null_thread_pool_spec.rb +54 -54
  47. data/spec/concurrent/obligation_shared.rb +135 -121
  48. data/spec/concurrent/promise_spec.rb +312 -305
  49. data/spec/concurrent/reactor/drb_async_demux_spec.rb +12 -12
  50. data/spec/concurrent/reactor/tcp_sync_demux_spec.rb +12 -12
  51. data/spec/concurrent/reactor_spec.rb +351 -10
  52. data/spec/concurrent/thread_pool_shared.rb +209 -210
  53. data/spec/concurrent/utilities_spec.rb +74 -74
  54. data/spec/spec_helper.rb +44 -30
  55. metadata +11 -22
  56. data/lib/concurrent/smart_mutex.rb +0 -66
  57. data/spec/concurrent/smart_mutex_spec.rb +0 -234
@@ -1,74 +1,74 @@
1
- require 'spec_helper'
2
- require 'thread'
3
-
4
- describe 'utilities' do
5
-
6
- context '#atomic' do
7
-
8
- it 'calls the block' do
9
- @expected = false
10
- atomic{ @expected = true }
11
- @expected.should be_true
12
- end
13
-
14
- it 'passes all arguments to the block' do
15
- @expected = nil
16
- atomic(1, 2, 3, 4) do |a, b, c, d|
17
- @expected = [a, b, c, d]
18
- end
19
- @expected.should eq [1, 2, 3, 4]
20
- end
21
-
22
- it 'returns the result of the block' do
23
- expected = atomic{ 'foo' }
24
- expected.should eq 'foo'
25
- end
26
-
27
- it 'raises an exception if no block is given' do
28
- lambda {
29
- atomic()
30
- }.should raise_error(ArgumentError)
31
- end
32
-
33
- it 'creates a new Fiber' do
34
- fiber = Fiber.new{ 'foo' }
35
- Fiber.should_receive(:new).with(no_args()).and_return(fiber)
36
- atomic{ 'foo' }
37
- end
38
-
39
- it 'immediately runs the Fiber' do
40
- fiber = Fiber.new{ 'foo' }
41
- Fiber.stub(:new).with(no_args()).and_return(fiber)
42
- fiber.should_receive(:resume).with(no_args())
43
- atomic{ 'foo' }
44
- end
45
- end
46
-
47
- context Mutex do
48
-
49
- context '#sync_with_timeout' do
50
-
51
- it 'returns the result of the block if a lock is obtained before timeout' do
52
- mutex = Mutex.new
53
- result = mutex.sync_with_timeout(30){ 42 }
54
- result.should eq 42
55
- end
56
-
57
- it 'raises Timeout::Error if the timeout is exceeded' do
58
- mutex = Mutex.new
59
- thread = Thread.new{ mutex.synchronize{ sleep(30) } }
60
- sleep(0.1)
61
- lambda {
62
- mutex.sync_and_wait(1)
63
- }.should raise_error(NoMethodError)
64
- Thread.kill(thread)
65
- end
66
-
67
- it 'raises an exception if no block given' do
68
- lambda {
69
- Mutex.new.sync_with_timeout()
70
- }.should raise_error(ArgumentError)
71
- end
72
- end
73
- end
74
- end
1
+ require 'spec_helper'
2
+ require 'thread'
3
+
4
+ describe 'utilities' do
5
+
6
+ context '#atomic' do
7
+
8
+ it 'calls the block' do
9
+ @expected = false
10
+ atomic{ @expected = true }
11
+ @expected.should be_true
12
+ end
13
+
14
+ it 'passes all arguments to the block' do
15
+ @expected = nil
16
+ atomic(1, 2, 3, 4) do |a, b, c, d|
17
+ @expected = [a, b, c, d]
18
+ end
19
+ @expected.should eq [1, 2, 3, 4]
20
+ end
21
+
22
+ it 'returns the result of the block' do
23
+ expected = atomic{ 'foo' }
24
+ expected.should eq 'foo'
25
+ end
26
+
27
+ it 'raises an exception if no block is given' do
28
+ lambda {
29
+ atomic()
30
+ }.should raise_error(ArgumentError)
31
+ end
32
+
33
+ it 'creates a new Fiber' do
34
+ fiber = Fiber.new{ 'foo' }
35
+ Fiber.should_receive(:new).with(no_args()).and_return(fiber)
36
+ atomic{ 'foo' }
37
+ end
38
+
39
+ it 'immediately runs the Fiber' do
40
+ fiber = Fiber.new{ 'foo' }
41
+ Fiber.stub(:new).with(no_args()).and_return(fiber)
42
+ fiber.should_receive(:resume).with(no_args())
43
+ atomic{ 'foo' }
44
+ end
45
+ end
46
+
47
+ context Mutex do
48
+
49
+ context '#sync_with_timeout' do
50
+
51
+ it 'returns the result of the block if a lock is obtained before timeout' do
52
+ mutex = Mutex.new
53
+ result = mutex.sync_with_timeout(30){ 42 }
54
+ result.should eq 42
55
+ end
56
+
57
+ it 'raises Timeout::Error if the timeout is exceeded' do
58
+ mutex = Mutex.new
59
+ thread = Thread.new{ mutex.synchronize{ sleep(30) } }
60
+ sleep(0.1)
61
+ lambda {
62
+ mutex.sync_and_wait(1)
63
+ }.should raise_error(NoMethodError)
64
+ Thread.kill(thread)
65
+ end
66
+
67
+ it 'raises an exception if no block given' do
68
+ lambda {
69
+ Mutex.new.sync_with_timeout()
70
+ }.should raise_error(ArgumentError)
71
+ end
72
+ end
73
+ end
74
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,30 +1,44 @@
1
- require 'simplecov'
2
- SimpleCov.start do
3
- project_name 'concurrent-ruby'
4
- add_filter '/md/'
5
- add_filter '/pkg/'
6
- add_filter '/spec/'
7
- add_filter '/tasks/'
8
- end
9
-
10
- require 'eventmachine'
11
-
12
- require 'concurrent'
13
- require 'concurrent/functions'
14
-
15
- # import all the support files
16
- Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require File.expand_path(f) }
17
-
18
- RSpec.configure do |config|
19
- config.order = 'random'
20
-
21
- config.before(:suite) do
22
- end
23
-
24
- config.before(:each) do
25
- end
26
-
27
- config.after(:each) do
28
- end
29
-
30
- end
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ project_name 'concurrent-ruby'
4
+ add_filter '/md/'
5
+ add_filter '/pkg/'
6
+ add_filter '/spec/'
7
+ add_filter '/tasks/'
8
+ end
9
+
10
+ require 'eventmachine'
11
+
12
+ require 'concurrent'
13
+ require 'concurrent/functions'
14
+
15
+ require 'rbconfig'
16
+
17
+ def mri?
18
+ RbConfig::CONFIG['ruby_install_name'] =~ /^ruby$/i
19
+ end
20
+
21
+ def jruby?
22
+ RbConfig::CONFIG['ruby_install_name'] =~ /^jruby$/i
23
+ end
24
+
25
+ def rbx?
26
+ RbConfig::CONFIG['ruby_install_name'] =~ /^rbx$/i
27
+ end
28
+
29
+ # import all the support files
30
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require File.expand_path(f) }
31
+
32
+ RSpec.configure do |config|
33
+ config.order = 'random'
34
+
35
+ config.before(:suite) do
36
+ end
37
+
38
+ config.before(:each) do
39
+ end
40
+
41
+ config.after(:each) do
42
+ end
43
+
44
+ end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: concurrent-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1.pre.3
5
- prerelease: 6
4
+ version: 0.1.1.pre.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jerry D'Antonio
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-08-12 00:00:00.000000000 Z
11
+ date: 2013-08-13 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: functional-ruby
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,23 +27,19 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: bundler
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
- description: ! ' A gem for adding Erlang, Clojure, and Go inspired concurrent programming
47
- tools to Ruby.
48
-
49
- '
41
+ description: |2
42
+ A gem for adding Erlang, Clojure, and Go inspired concurrent programming tools to Ruby.
50
43
  email: jerry.dantonio@gmail.com
51
44
  executables: []
52
45
  extensions: []
@@ -73,7 +66,6 @@ files:
73
66
  - lib/concurrent/reactor/drb_async_demux.rb
74
67
  - lib/concurrent/reactor/tcp_sync_demux.rb
75
68
  - lib/concurrent/reactor.rb
76
- - lib/concurrent/smart_mutex.rb
77
69
  - lib/concurrent/thread_pool.rb
78
70
  - lib/concurrent/utilities.rb
79
71
  - lib/concurrent/version.rb
@@ -105,34 +97,32 @@ files:
105
97
  - spec/concurrent/reactor/drb_async_demux_spec.rb
106
98
  - spec/concurrent/reactor/tcp_sync_demux_spec.rb
107
99
  - spec/concurrent/reactor_spec.rb
108
- - spec/concurrent/smart_mutex_spec.rb
109
100
  - spec/concurrent/thread_pool_shared.rb
110
101
  - spec/concurrent/utilities_spec.rb
111
102
  - spec/spec_helper.rb
112
103
  homepage: https://github.com/jdantonio/concurrent-ruby/
113
104
  licenses:
114
105
  - MIT
106
+ metadata: {}
115
107
  post_install_message:
116
108
  rdoc_options: []
117
109
  require_paths:
118
110
  - lib
119
111
  required_ruby_version: !ruby/object:Gem::Requirement
120
- none: false
121
112
  requirements:
122
- - - ! '>='
113
+ - - '>='
123
114
  - !ruby/object:Gem::Version
124
115
  version: 1.9.2
125
116
  required_rubygems_version: !ruby/object:Gem::Requirement
126
- none: false
127
117
  requirements:
128
- - - ! '>'
118
+ - - '>'
129
119
  - !ruby/object:Gem::Version
130
120
  version: 1.3.1
131
121
  requirements: []
132
122
  rubyforge_project:
133
- rubygems_version: 1.8.24
123
+ rubygems_version: 2.0.6
134
124
  signing_key:
135
- specification_version: 3
125
+ specification_version: 4
136
126
  summary: Erlang, Clojure, and Go inspired concurrent programming tools for Ruby.
137
127
  test_files:
138
128
  - spec/concurrent/agent_spec.rb
@@ -152,7 +142,6 @@ test_files:
152
142
  - spec/concurrent/reactor/drb_async_demux_spec.rb
153
143
  - spec/concurrent/reactor/tcp_sync_demux_spec.rb
154
144
  - spec/concurrent/reactor_spec.rb
155
- - spec/concurrent/smart_mutex_spec.rb
156
145
  - spec/concurrent/thread_pool_shared.rb
157
146
  - spec/concurrent/utilities_spec.rb
158
147
  - spec/spec_helper.rb
@@ -1,66 +0,0 @@
1
- require 'thread'
2
- require 'concurrent/utilities'
3
-
4
- module Concurrent
5
-
6
- class SmartMutex
7
-
8
- def initialize
9
- @mutex = Mutex.new
10
- end
11
-
12
- def alone?
13
- Thread.list.length <= 1
14
- end
15
-
16
- def lock
17
- atomic do
18
- @mutex.lock unless alone?
19
- self
20
- end
21
- end
22
-
23
- def locked?
24
- atomic do
25
- if alone?
26
- false
27
- else
28
- @mutex.locked?
29
- end
30
- end
31
- end
32
-
33
- def sleep(timeout)
34
- if alone?
35
- Kernel.sleep(timeout)
36
- else
37
- @mutex.sleep(timeout)
38
- end
39
- end
40
-
41
- def synchronize(&block)
42
- if alone?
43
- yield
44
- else
45
- @mutex.synchronize(&block)
46
- end
47
- end
48
-
49
- def try_lock
50
- atomic do
51
- if alone?
52
- true
53
- else
54
- @mutex.try_lock
55
- end
56
- end
57
- end
58
-
59
- def unlock
60
- atomic do
61
- @mutex.unlock unless alone?
62
- self
63
- end
64
- end
65
- end
66
- end
@@ -1,234 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Concurrent
4
-
5
- describe SmartMutex do
6
-
7
- subject{ SmartMutex.new }
8
-
9
- def fly_solo
10
- Thread.stub(:list).and_return(Array.new)
11
- end
12
-
13
- def run_with_the_pack
14
- Thread.stub(:list).and_return([1,2,3,4])
15
- end
16
-
17
- context '#initialize' do
18
-
19
- it 'creates a new mutex' do
20
- Mutex.should_receive(:new).with(no_args())
21
- SmartMutex.new
22
- end
23
- end
24
-
25
- context '#alone?' do
26
-
27
- it 'returns true when there is only one thread' do
28
- fly_solo
29
- subject.alone?.should be_true
30
- end
31
-
32
- it 'returns false when there is more than one thread' do
33
- run_with_the_pack
34
- subject.alone?.should be_false
35
- end
36
- end
37
-
38
- context '#lock' do
39
-
40
- it 'does not lock when there is only one thread' do
41
- fly_solo
42
-
43
- mutex = Mutex.new
44
- mutex.should_not_receive(:lock)
45
- Mutex.should_receive(:new).with(no_args()).and_return(mutex)
46
-
47
- subject.lock
48
- end
49
-
50
- it 'locks when not locked and there is more than one thread' do
51
- run_with_the_pack
52
-
53
- mutex = Mutex.new
54
- mutex.should_receive(:lock)
55
- Mutex.should_receive(:new).with(no_args()).and_return(mutex)
56
-
57
- subject.lock
58
- end
59
-
60
- it 'raises an exception when locked and there is more than one thread' do
61
- run_with_the_pack
62
- subject.lock
63
- lambda {
64
- subject.lock
65
- }.should raise_error(ThreadError)
66
- end
67
-
68
- it 'does not raise an exception when lock called twice and there is only one thread' do
69
- fly_solo
70
- subject.lock
71
- lambda {
72
- subject.lock
73
- }.should_not raise_error
74
- end
75
-
76
- it 'returns self' do
77
- fly_solo
78
- mutex = SmartMutex.new
79
- mutex.lock.should eq mutex
80
-
81
- run_with_the_pack
82
- mutex.lock.should eq mutex
83
- end
84
- end
85
-
86
- context '#locked?' do
87
-
88
- it 'returns false when there is only one thread' do
89
- fly_solo
90
- subject.should_not be_locked
91
- end
92
-
93
- it 'returns true when locked and there is more than one thread' do
94
- run_with_the_pack
95
- subject.lock
96
- subject.should be_locked
97
- end
98
-
99
- it 'returns false when not locked and there is more than one thread' do
100
- run_with_the_pack
101
- subject.should_not be_locked
102
- end
103
- end
104
-
105
- context '#sleep' do
106
-
107
- it 'sleeps when there is only one thread' do
108
- fly_solo
109
- Kernel.should_receive(:sleep).with(0.1).and_return(0.1)
110
- subject.sleep(0.1)
111
- end
112
-
113
- it 'sleeps when locked and there is more than one thread' do
114
- mutex = Mutex.new
115
- mutex.should_receive(:sleep).with(0.1).and_return(0.1)
116
- Mutex.should_receive(:new).with(no_args()).and_return(mutex)
117
-
118
- run_with_the_pack
119
- subject.lock
120
- subject.sleep(0.1)
121
- end
122
-
123
- it 'raises an exception when not locked and there is more than one thread' do
124
- run_with_the_pack
125
- lambda {
126
- subject.sleep(0.1)
127
- }.should raise_error(ThreadError)
128
- end
129
-
130
- it 'returns the number of seconds slept' do
131
- fly_solo
132
- subject.sleep(1).should eq 1
133
-
134
- run_with_the_pack
135
- subject.lock
136
- subject.sleep(1).should eq 1
137
- end
138
- end
139
-
140
- context '#synchronize' do
141
-
142
- it 'yields to the block when there is only one thread' do
143
- fly_solo
144
- @expected = false
145
- subject.synchronize{ @expected = true }
146
- @expected.should be_true
147
- end
148
-
149
- it 'locks when there is more than one thread' do
150
- mutex = Mutex.new
151
- mutex.should_receive(:synchronize).with(no_args())
152
- Mutex.should_receive(:new).with(no_args()).and_return(mutex)
153
-
154
- run_with_the_pack
155
- subject.synchronize{ nil }
156
- end
157
-
158
- it 'yields to the block when there is more than one thread' do
159
- run_with_the_pack
160
- @expected = false
161
- subject.synchronize{ @expected = true }
162
- @expected.should be_true
163
- end
164
-
165
- it 'returns the result of the block' do
166
- fly_solo
167
- subject.synchronize{ 42 }.should eq 42
168
-
169
- run_with_the_pack
170
- subject.synchronize{ 42 }.should eq 42
171
- end
172
- end
173
-
174
- context '#try_lock' do
175
-
176
- it 'returns true when there is only one thread' do
177
- fly_solo
178
- subject.try_lock.should be_true
179
- end
180
-
181
- it 'returns true when the lock is obtained and there is more than one thread' do
182
- run_with_the_pack
183
- subject.try_lock.should be_true
184
- end
185
-
186
- it 'returns false when the lock is not obtained and there is more than one thread' do
187
- run_with_the_pack
188
- subject.lock
189
- subject.try_lock.should be_false
190
- end
191
- end
192
-
193
- context '#unlock' do
194
-
195
- it 'does not unlock when there is only one thread' do
196
- fly_solo
197
-
198
- mutex = Mutex.new
199
- mutex.should_not_receive(:unlock)
200
- Mutex.should_receive(:new).with(no_args()).and_return(mutex)
201
-
202
- subject.unlock
203
- end
204
-
205
- it 'unlocks when locked and there is more than one thread' do
206
- run_with_the_pack
207
-
208
- mutex = Mutex.new
209
- mutex.should_receive(:unlock)
210
- Mutex.should_receive(:new).with(no_args()).and_return(mutex)
211
-
212
- subject.lock
213
- subject.unlock
214
- end
215
-
216
- it 'raises an exception when not locked and there is more than one thread' do
217
- run_with_the_pack
218
- lambda {
219
- subject.unlock
220
- }.should raise_error(ThreadError)
221
- end
222
-
223
- it 'returns self' do
224
- fly_solo
225
- mutex = SmartMutex.new
226
- mutex.unlock.should eq mutex
227
-
228
- run_with_the_pack
229
- mutex.lock
230
- mutex.unlock.should eq mutex
231
- end
232
- end
233
- end
234
- end