11require 'concurrent/atomic/condition'
22
33module 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
0 commit comments