This repository was archived by the owner on Mar 15, 2022. It is now read-only.
File tree Expand file tree Collapse file tree 2 files changed +37
-4
lines changed Expand file tree Collapse file tree 2 files changed +37
-4
lines changed Original file line number Diff line number Diff line change 1
1
module ThreadSafe
2
2
module Util
3
- # An overhead-less atomic reference.
4
3
AtomicReference =
5
4
if defined? ( Rubinius ::AtomicReference )
5
+ # An overhead-less atomic reference.
6
6
Rubinius ::AtomicReference
7
7
else
8
- require 'atomic'
9
- defined? ( Atomic ::InternalReference ) ? Atomic ::InternalReference : Atomic
8
+ begin
9
+ require 'atomic'
10
+ defined? ( Atomic ::InternalReference ) ? Atomic ::InternalReference : Atomic
11
+ rescue NameError
12
+ require 'thread' # get Mutex on 1.8
13
+ class FullLockingAtomicReference
14
+ def initialize ( value = nil )
15
+ @___mutex = Mutex . new
16
+ @___value = value
17
+ end
18
+
19
+ def get
20
+ @___mutex . synchronize { @___value }
21
+ end
22
+ alias_method :value , :get
23
+
24
+ def set ( new_value )
25
+ @___mutex . synchronize { @___value = new_value }
26
+ end
27
+ alias_method :value= , :set
28
+
29
+ def compare_and_set ( old_value , new_value )
30
+ return false unless @___mutex . try_lock
31
+ begin
32
+ return false unless @___value . equal? old_value
33
+ @___value = new_value
34
+ ensure
35
+ @___mutex . unlock
36
+ end
37
+ true
38
+ end
39
+ end
40
+
41
+ FullLockingAtomicReference
42
+ end
10
43
end
11
44
end
12
45
end
Original file line number Diff line number Diff line change @@ -19,6 +19,6 @@ Gem::Specification.new do |gem|
19
19
gem . version = ThreadSafe ::VERSION
20
20
gem . license = "Apache-2.0"
21
21
22
- gem . add_dependency 'atomic' , [ '>= 1.1.7' , '< 2' ]
22
+ gem . add_development_dependency 'atomic' , [ '>= 1.1.7' , '< 2' ]
23
23
gem . add_development_dependency 'rake'
24
24
end
You can’t perform that action at this time.
0 commit comments