Skip to content

Commit 81f4734

Browse files
committed
Changed every mutex.lock - mutex.unlock pair to ensure mutex release even with errors
closes #79
1 parent f187c6f commit 81f4734

13 files changed

+126
-117
lines changed

lib/concurrent/agent.rb

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,14 @@ def rescue(clazz = StandardError, &block)
113113
# @yieldparam [Object] value the result of the last update operation
114114
# @yieldreturn [Boolean] true if the value is valid else false
115115
def validate(&block)
116+
116117
unless block.nil?
117-
mutex.lock
118-
@validator = block
119-
mutex.unlock
118+
begin
119+
mutex.lock
120+
@validator = block
121+
ensure
122+
mutex.unlock
123+
end
120124
end
121125
self
122126
end
@@ -205,12 +209,15 @@ def work(&handler) # :nodoc:
205209
exception = ex
206210
end
207211

208-
mutex.lock
209-
should_notify = if !exception && valid
210-
@value = result
211-
true
212-
end
213-
mutex.unlock
212+
begin
213+
mutex.lock
214+
should_notify = if !exception && valid
215+
@value = result
216+
true
217+
end
218+
ensure
219+
mutex.unlock
220+
end
214221

215222
if should_notify
216223
time = Time.now

lib/concurrent/atomic/atomic.rb

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,36 @@ def initialize(init = nil)
99

1010
def value
1111
@mutex.lock
12-
result = @value
12+
@value
13+
ensure
1314
@mutex.unlock
14-
15-
result
1615
end
1716

1817
def value=(value)
1918
@mutex.lock
20-
result = @value = value
19+
@value = value
20+
ensure
2121
@mutex.unlock
22-
23-
result
2422
end
2523

2624
def modify
2725
@mutex.lock
2826
result = yield @value
2927
@value = result
28+
ensure
3029
@mutex.unlock
31-
32-
result
3330
end
3431

3532
def compare_and_set(expect, update)
3633
@mutex.lock
3734
if @value == expect
3835
@value = update
39-
result = true
36+
true
4037
else
41-
result = false
38+
false
4239
end
40+
ensure
4341
@mutex.unlock
44-
45-
result
4642
end
4743
end
4844

lib/concurrent/atomic/atomic_boolean.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ def initialize(initial = false)
2727
# @return [Boolean] the current value
2828
def value
2929
@mutex.lock
30-
result = @value
30+
@value
31+
ensure
3132
@mutex.unlock
32-
result
3333
end
3434

3535
# @!macro [attach] atomic_boolean_method_value_eq
@@ -42,9 +42,9 @@ def value
4242
def value=(value)
4343
@mutex.lock
4444
@value = !!value
45-
result = @value
45+
@value
46+
ensure
4647
@mutex.unlock
47-
result
4848
end
4949

5050
# @!macro [attach] atomic_boolean_method_is_true
@@ -54,9 +54,9 @@ def value=(value)
5454
# @return [Boolean] true if the current value is `true`, else false
5555
def true?
5656
@mutex.lock
57-
result = @value
57+
@value
58+
ensure
5859
@mutex.unlock
59-
result
6060
end
6161

6262
# @!macro [attach] atomic_boolean_method_is_false
@@ -66,9 +66,9 @@ def true?
6666
# @return [Boolean] true if the current value is `false`, else false
6767
def false?
6868
@mutex.lock
69-
result = !@value
69+
!@value
70+
ensure
7071
@mutex.unlock
71-
result
7272
end
7373

7474
# @!macro [attach] atomic_boolean_method_make_true
@@ -80,9 +80,9 @@ def make_true
8080
@mutex.lock
8181
old = @value
8282
@value = true
83-
@mutex.unlock
84-
8583
!old
84+
ensure
85+
@mutex.unlock
8686
end
8787

8888
# @!macro [attach] atomic_boolean_method_make_false
@@ -94,9 +94,9 @@ def make_false
9494
@mutex.lock
9595
old = @value
9696
@value = false
97-
@mutex.unlock
98-
9997
old
98+
ensure
99+
@mutex.unlock
100100
end
101101
end
102102

lib/concurrent/atomic/atomic_fixnum.rb

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ def initialize(init = 0)
2929
# @return [Fixnum] the current value
3030
def value
3131
@mutex.lock
32-
result = @value
32+
@value
33+
ensure
3334
@mutex.unlock
34-
35-
result
3635
end
3736

3837
# @!macro [attach] atomic_fixnum_method_value_eq
@@ -47,10 +46,9 @@ def value
4746
def value=(value)
4847
raise ArgumentError.new('value must be a Fixnum') unless value.is_a?(Fixnum)
4948
@mutex.lock
50-
result = @value = value
49+
@value = value
50+
ensure
5151
@mutex.unlock
52-
53-
result
5452
end
5553

5654
# @!macro [attach] atomic_fixnum_method_increment
@@ -61,10 +59,8 @@ def value=(value)
6159
def increment
6260
@mutex.lock
6361
@value += 1
64-
result = @value
62+
ensure
6563
@mutex.unlock
66-
67-
result
6864
end
6965

7066
alias_method :up, :increment
@@ -77,10 +73,8 @@ def increment
7773
def decrement
7874
@mutex.lock
7975
@value -= 1
80-
result = @value
76+
ensure
8177
@mutex.unlock
82-
83-
result
8478
end
8579

8680
alias_method :down, :decrement
@@ -98,13 +92,12 @@ def compare_and_set(expect, update)
9892
@mutex.lock
9993
if @value == expect
10094
@value = update
101-
result = true
95+
true
10296
else
103-
result = false
97+
false
10498
end
99+
ensure
105100
@mutex.unlock
106-
107-
result
108101
end
109102
end
110103

lib/concurrent/atomic/copy_on_notify_observer_set.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@ def add_observer(observer=nil, func=:update, &block)
2828
func = :call
2929
end
3030

31-
@mutex.lock
32-
@observers[observer] = func
33-
@mutex.unlock
31+
begin
32+
@mutex.lock
33+
@observers[observer] = func
34+
ensure
35+
@mutex.unlock
36+
end
3437

35-
observer
38+
observer
3639
end
3740

3841
# @param [Object] observer the observer to remove

lib/concurrent/atomic/copy_on_write_observer_set.rb

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@ def add_observer(observer=nil, func=:update, &block)
2727
func = :call
2828
end
2929

30-
@mutex.lock
31-
new_observers = @observers.dup
32-
new_observers[observer] = func
33-
@observers = new_observers
34-
@mutex.unlock
35-
36-
observer
30+
begin
31+
@mutex.lock
32+
new_observers = @observers.dup
33+
new_observers[observer] = func
34+
@observers = new_observers
35+
observer
36+
ensure
37+
@mutex.unlock
38+
end
3739
end
3840

3941
# @param [Object] observer the observer to remove
@@ -43,9 +45,9 @@ def delete_observer(observer)
4345
new_observers = @observers.dup
4446
new_observers.delete(observer)
4547
@observers = new_observers
46-
@mutex.unlock
47-
4848
observer
49+
ensure
50+
@mutex.unlock
4951
end
5052

5153
# Deletes all observers
@@ -91,25 +93,25 @@ def notify_to(observers, *args)
9193

9294
def observers
9395
@mutex.lock
94-
o = @observers
96+
@observers
97+
ensure
9598
@mutex.unlock
96-
97-
o
9899
end
99100

100101
def observers=(new_set)
101102
@mutex.lock
102103
@observers = new_set
104+
ensure
103105
@mutex.unlock
104106
end
105107

106108
def clear_observers_and_return_old
107109
@mutex.lock
108110
old_observers = @observers
109111
@observers = {}
110-
@mutex.unlock
111-
112112
old_observers
113+
ensure
114+
@mutex.unlock
113115
end
114116
end
115117
end

lib/concurrent/atomic/event.rb

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ def initialize
2929
# @return [Boolean] indicating whether or not the `Event` has been set
3030
def set?
3131
@mutex.lock
32-
result = @set
32+
@set
33+
ensure
3334
@mutex.unlock
34-
35-
result
3635
end
3736

3837
# Trigger the event, setting the state to `set` and releasing all threads
@@ -45,25 +44,24 @@ def set
4544
@set = true
4645
@condition.broadcast
4746
end
48-
@mutex.unlock
49-
5047
true
48+
ensure
49+
@mutex.unlock
5150
end
5251

5352
def try?
5453
@mutex.lock
5554

5655
if @set
57-
result = false
56+
false
5857
else
5958
@set = true
6059
@condition.broadcast
61-
result = true
60+
true
6261
end
6362

63+
ensure
6464
@mutex.unlock
65-
66-
result
6765
end
6866

6967
# Reset a previously set event back to the `unset` state.
@@ -73,9 +71,9 @@ def try?
7371
def reset
7472
@mutex.lock
7573
@set = false
76-
@mutex.unlock
77-
7874
true
75+
ensure
76+
@mutex.unlock
7977
end
8078

8179
# Wait a given number of seconds for the `Event` to be set by another
@@ -93,11 +91,9 @@ def wait(timeout = nil)
9391
end
9492
end
9593

96-
result = @set
97-
94+
@set
95+
ensure
9896
@mutex.unlock
99-
100-
result
10197
end
10298
end
10399
end

lib/concurrent/delay.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,9 @@ def initialize(opts = {}, &block)
7373
def value
7474
mutex.lock
7575
execute_task_once
76-
result = apply_deref_options(@value)
76+
apply_deref_options(@value)
77+
ensure
7778
mutex.unlock
78-
79-
result
8079
end
8180

8281
private

0 commit comments

Comments
 (0)