Skip to content

Commit 8fa3f05

Browse files
committed
Making rubocop happy (sort of)
1 parent a3d9e74 commit 8fa3f05

File tree

2 files changed

+76
-118
lines changed

2 files changed

+76
-118
lines changed

lib/concurrent/atomic/semaphore.rb

Lines changed: 67 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
require 'concurrent/atomic/condition'
22

33
module Concurrent
4-
54
class MutexSemaphore
6-
75
# @!macro [attach] semaphore_method_initialize
86
#
97
# Create a new `Semaphore` with the initial `count`.
@@ -13,7 +11,7 @@ class MutexSemaphore
1311
# @raise [ArgumentError] if `count` is not an integer or is less than zero
1412
def initialize(count)
1513
unless count.is_a?(Fixnum) && count >= 0
16-
raise ArgumentError.new('count must be an non-negative integer')
14+
fail ArgumentError, 'count must be an non-negative integer'
1715
end
1816
@mutex = Mutex.new
1917
@condition = Condition.new
@@ -22,16 +20,18 @@ def initialize(count)
2220

2321
# @!macro [attach] semaphore_method_acquire
2422
#
25-
# Acquires the given number of permits from this semaphore, blocking until all are available.
23+
# Acquires the given number of permits from this semaphore,
24+
# blocking until all are available.
2625
#
2726
# @param [Fixnum] permits Number of permits to acquire
2827
#
29-
# @raise [ArgumentError] if `permits` is not an integer or is less than one
28+
# @raise [ArgumentError] if `permits` is not an integer or is less than
29+
# one
3030
#
3131
# @return [True]
3232
def acquire(permits = 1)
3333
unless permits.is_a?(Fixnum) && permits > 0
34-
raise ArgumentError.new('permits must be an integer greater than zero')
34+
fail ArgumentError, 'permits must be an integer greater than zero'
3535
end
3636
@mutex.synchronize do
3737
try_acquire_timed(permits, nil)
@@ -60,19 +60,23 @@ def drain_permits
6060

6161
# @!macro [attach] semaphore_method_try_acquire
6262
#
63-
# Acquires the given number of permits from this semaphore, only if all are available at the time of invocation.
63+
# Acquires the given number of permits from this semaphore,
64+
# only if all are available at the time of invocation or within
65+
# `timeout` interval
6466
#
6567
# @param [Fixnum] permits the number of permits to acquire
6668
#
67-
# @param [Fixnum] timeout the number of seconds to wait for the counter or `nil`
68-
# to return immediately
69+
# @param [Fixnum] timeout the number of seconds to wait for the counter
70+
# or `nil` to return immediately
6971
#
70-
# @raise [ArgumentError] if `permits` is not an integer or is less than one
72+
# @raise [ArgumentError] if `permits` is not an integer or is less than
73+
# one
7174
#
72-
# @return [Boolean] `false` if no permits are available, `true` when acquired a permit
75+
# @return [Boolean] `false` if no permits are available, `true` when
76+
# acquired a permit
7377
def try_acquire(permits = 1, timeout = nil)
7478
unless permits.is_a?(Fixnum) && permits > 0
75-
raise ArgumentError.new('permits must be an integer greater than zero')
79+
fail ArgumentError, 'permits must be an integer greater than zero'
7680
end
7781
@mutex.synchronize do
7882
if timeout.nil?
@@ -94,7 +98,7 @@ def try_acquire(permits = 1, timeout = nil)
9498
# @return [True]
9599
def release(permits = 1)
96100
unless permits.is_a?(Fixnum) && permits > 0
97-
raise ArgumentError.new('permits must be an integer greater than zero')
101+
fail ArgumentError, 'permits must be an integer greater than zero'
98102
end
99103
@mutex.synchronize do
100104
@free += permits
@@ -116,14 +120,13 @@ def release(permits = 1)
116120
# @return [True]
117121
def reduce_permits(reduction)
118122
unless reduction.is_a?(Fixnum) && reduction >= 0
119-
raise ArgumentError.new('reduction must be an non-negative integer')
123+
fail ArgumentError, 'reduction must be an non-negative integer'
120124
end
121125
unless @free - reduction >= 0
122-
raise ArgumentError.new('cannot reduce number of available_permits below zero')
123-
end
124-
@mutex.synchronize do
125-
@free -= reduction
126+
fail(ArgumentError,
127+
'cannot reduce number of available_permits below zero')
126128
end
129+
@mutex.synchronize { @free -= reduction }
127130
true
128131
end
129132

@@ -150,116 +153,78 @@ def try_acquire_timed(permits, timeout)
150153

151154
if RUBY_PLATFORM == 'java'
152155

153-
# @!macro count_down_latch
156+
# @!macro semaphore
154157
class JavaSemaphore
155-
156-
# @!macro count_down_latch_method_initialize
158+
# @!macro semaphore_method_initialize
157159
def initialize(count)
158160
unless count.is_a?(Fixnum) && count >= 0
159-
raise ArgumentError.new('count must be in integer greater than or equal zero')
161+
fail(ArgumentError,
162+
'count must be in integer greater than or equal zero')
160163
end
161164
@semaphore = java.util.concurrent.Semaphore.new(count)
162165
end
163166

167+
# @!macro semaphore_method_acquire
164168
def acquire(permits = 1)
165169
unless permits.is_a?(Fixnum) && permits > 0
166-
raise ArgumentError.new('permits must be an integer greater than zero')
170+
fail ArgumentError, 'permits must be an integer greater than zero'
167171
end
168-
@semaphore.acquire(permits);
172+
@semaphore.acquire(permits)
169173
end
170174

171-
172-
# @!macro [attach] semaphore_method_available_permits
173-
#
174-
# Returns the current number of permits available in this semaphore.
175-
#
176-
# @return [Integer]
177-
def available_permits
178-
@semaphore.availablePermits
179-
end
180-
181-
# @!macro [attach] semaphore_method_drain_permits
182-
#
183-
# Acquires and returns all permits that are immediately available.
184-
#
185-
# @return [Integer]
186-
def drain_permits
187-
@semaphore.drainPermits
188-
end
189-
190-
# @!macro [attach] semaphore_method_try_acquire
191-
#
192-
# Acquires the given number of permits from this semaphore, only if all are available at the time of invocation.
193-
#
194-
# @param [Fixnum] permits the number of permits to acquire
195-
#
196-
# @param [Fixnum] timeout the number of seconds to wait for the counter or `nil`
197-
# to return immediately
198-
#
199-
# @raise [ArgumentError] if `permits` is not an integer or is less than one
200-
#
201-
# @return [Boolean] `false` if no permits are available, `true` when acquired a permit
202-
def try_acquire(permits = 1, timeout = nil)
203-
unless permits.is_a?(Fixnum) && permits > 0
204-
raise ArgumentError.new('permits must be an integer greater than zero')
175+
# @!macro semaphore_method_available_permits
176+
def available_permits
177+
@semaphore.availablePermits
205178
end
206-
if timeout.nil?
207-
@semaphore.try_acquire(permits)
208-
else
209-
@semaphore.try_acquire(permits, timeout, java.util.concurrent.TimeUnit::SECONDS)
210-
end
211-
end
212179

213-
# @!macro [attach] semaphore_method_release
214-
#
215-
# Releases the given number of permits, returning them to the semaphore.
216-
#
217-
# @param [Fixnum] permits Number of permits to return to the semaphore.
218-
#
219-
# @raise [ArgumentError] if `permits` is not a number or is less than one
220-
#
221-
# @raise [ArgumentError] if `permits` + `@free` is larger than `@count`
222-
#
223-
# @return [True]
224-
def release(permits = 1)
225-
unless permits.is_a?(Fixnum) && permits > 0
226-
raise ArgumentError.new('permits must be an integer greater than zero')
180+
# @!macro semaphore_method_drain_permits
181+
def drain_permits
182+
@semaphore.drainPermits
227183
end
228-
@semaphore.release(permits)
229-
true
230-
end
231184

232-
# @!macro [attach] semaphore_method_reduce_permits
233-
#
234-
# Shrinks the number of available permits by the indicated reduction.
235-
#
236-
# @param [Fixnum] reduction Number of permits to remove.
237-
#
238-
# @raise [ArgumentError] if `reduction` is not an integer or is negative
239-
#
240-
# @raise [ArgumentError] if the operation would bring `@free` below zero
241-
#
242-
# @return [True]
243-
def reduce_permits(reduction)
244-
unless reduction.is_a?(Fixnum) && reduction >= 0
245-
raise ArgumentError.new('reduction must be an non-negative integer')
246-
end
247-
unless @free - reduction >= 0
248-
raise ArgumentError.new('cannot reduce number of available_permits below zero')
185+
# @!macro semaphore_method_try_acquire
186+
def try_acquire(permits = 1, timeout = nil)
187+
unless permits.is_a?(Fixnum) && permits > 0
188+
fail ArgumentError, 'permits must be an integer greater than zero'
189+
end
190+
if timeout.nil?
191+
@semaphore.try_acquire(permits)
192+
else
193+
@semaphore.try_acquire(permits,
194+
timeout,
195+
java.util.concurrent.TimeUnit::SECONDS)
196+
end
249197
end
250-
@semaphore.reducePermits(void)
251-
end
252198

199+
# @!macro semaphore_method_release
200+
def release(permits = 1)
201+
unless permits.is_a?(Fixnum) && permits > 0
202+
fail ArgumentError, 'permits must be an integer greater than zero'
203+
end
204+
@semaphore.release(permits)
205+
true
206+
end
253207

208+
# @!macro semaphore_method_reduce_permits
209+
def reduce_permits(reduction)
210+
unless reduction.is_a?(Fixnum) && reduction >= 0
211+
fail ArgumentError, 'reduction must be an non-negative integer'
212+
end
213+
unless @free - reduction >= 0
214+
fail(ArgumentError,
215+
'cannot reduce number of available_permits below zero')
216+
end
217+
@semaphore.reducePermits(void)
218+
end
254219
end
255220

256-
# @!macro count_down_latch
221+
# @!macro semaphore
257222
class Semaphore < JavaSemaphore
258223
end
259224

260225
else
261226

262-
# @!macro count_down_latch
227+
# @!macro semaphore
263228
class Semaphore < MutexSemaphore
264229
end
265230
end

spec/concurrent/atomic/semaphore_spec.rb

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
require 'spec_helper'
22

33
shared_examples :semaphore do
4-
54
let(:semaphore) { described_class.new(3) }
65

76
context '#initialize' do
8-
97
it 'raises an exception if the initial count is not an integer' do
108
expect {
119
described_class.new('foo')
@@ -14,7 +12,6 @@
1412
end
1513

1614
describe '#acquire' do
17-
1815
context 'permits available' do
1916
it 'should return true immediately' do
2017
result = semaphore.acquire
@@ -23,10 +20,9 @@
2320
end
2421

2522
context 'not enough permits available' do
26-
2723
it 'should block thread until permits are available' do
2824
semaphore.drain_permits
29-
Thread.new { sleep(0.2); semaphore.release }
25+
Thread.new { sleep(0.2) && semaphore.release }
3026

3127
result = semaphore.acquire
3228
expect(result).to be_truthy
@@ -69,8 +65,8 @@
6965
end
7066

7167
it 'acquires after if permits are available within timeout' do
72-
x = semaphore.drain_permits
73-
Thread.new { sleep 0.1; semaphore.release }
68+
semaphore.drain_permits
69+
Thread.new { sleep 0.1 && semaphore.release }
7470
result = semaphore.try_acquire(1, 0.2)
7571
expect(result).to be_truthy
7672
end
@@ -86,7 +82,7 @@
8682
describe '#reduce_permits' do
8783
it 'raises ArgumentError if reducing by negative number' do
8884
expect {
89-
semaphore.reduce_permits -1
85+
semaphore.reduce_permits(-1)
9086
}.to raise_error(ArgumentError)
9187
end
9288

@@ -106,13 +102,10 @@
106102
end
107103

108104
module Concurrent
109-
110105
describe MutexSemaphore do
111-
112106
it_should_behave_like :semaphore
113107

114108
context 'spurious wake ups' do
115-
116109
subject { described_class.new(1) }
117110

118111
before(:each) do
@@ -127,7 +120,8 @@ def subject.simulate_spurious_wake_up
127120

128121
it 'should resist to spurious wake ups without timeout' do
129122
@expected = true
130-
Thread.new { @expected = subject.acquire } # would set @expected to false
123+
# would set @expected to false
124+
Thread.new { @expected = subject.acquire }
131125

132126
sleep(0.1)
133127
subject.simulate_spurious_wake_up
@@ -138,24 +132,23 @@ def subject.simulate_spurious_wake_up
138132

139133
it 'should resist to spurious wake ups with timeout' do
140134
@expected = true
141-
t = Thread.new { @expected = subject.try_acquire(1, 0.3) } # sets @expected to false
135+
# sets @expected to false in another thread
136+
t = Thread.new { @expected = subject.try_acquire(1, 0.3) }
142137

143138
sleep(0.1)
144139
subject.simulate_spurious_wake_up
145140

146141
sleep(0.1)
147142
expect(@expected).to be_truthy
148143

149-
t.join()
144+
t.join
150145
expect(@expected).to be_falsey
151146
end
152147
end
153148
end
154149

155150
if TestHelpers.jruby?
156-
157151
describe JavaSemaphore do
158-
159152
it_should_behave_like :semaphore
160153
end
161154
end

0 commit comments

Comments
 (0)