Skip to content

Commit f6c9e70

Browse files
committed
Better Atomic documentation.
1 parent fb51736 commit f6c9e70

File tree

9 files changed

+94
-41
lines changed

9 files changed

+94
-41
lines changed

lib/concurrent/atomic.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,50 @@
1616

1717
if defined? Concurrent::JavaAtomic
1818

19+
# @!macro [attach] atomic_reference
20+
#
21+
# An object reference that may be updated atomically.
22+
#
23+
# @since 0.7.0.rc0
24+
# @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html
25+
# @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html
1926
class Concurrent::Atomic < Concurrent::JavaAtomic
2027
end
2128

2229
elsif defined? Concurrent::CAtomic
2330

31+
# @!macro [attach] concurrent_update_error
32+
#
33+
# This exception may be thrown by methods that have detected concurrent
34+
# modification of an object when such modification is not permissible.
2435
class Concurrent::Atomic < Concurrent::CAtomic
2536
end
2637

2738
elsif defined? Concurrent::RbxAtomic
2839

40+
# @!macro atomic_reference
2941
class Concurrent::Atomic < Concurrent::RbxAtomic
3042
end
3143

3244
else
3345

46+
# @!macro atomic_reference
3447
class Concurrent::Atomic < Concurrent::MutexAtomic
3548
end
3649
end
3750

51+
# @!macro atomic_reference
3852
class Atomic < Concurrent::Atomic
3953

54+
# @!macro concurrent_update_error
4055
ConcurrentUpdateError = Class.new(Concurrent::ConcurrentUpdateError)
4156

42-
def initialize(*args)
57+
# @!macro [attach] atomic_reference_method_initialize
58+
#
59+
# Creates a new Atomic reference with null initial value.
60+
#
61+
# @param [Object] value the initial value
62+
def initialize(value)
4363
warn "[DEPRECATED] Please use Concurrent::Atomic instead."
4464
super
4565
end

lib/concurrent/atomic_reference/concurrent_update_error.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module Concurrent
22

3+
# @!macro atomic_reference
34
class ConcurrentUpdateError < ThreadError
45
# frozen pre-allocated backtrace to speed ConcurrentUpdateError
56
CONC_UP_ERR_BACKTRACE = ['backtrace elided; set verbose to enable'].freeze

lib/concurrent/atomic_reference/delegated_update.rb

Lines changed: 0 additions & 28 deletions
This file was deleted.

lib/concurrent/atomic_reference/direct_update.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,36 @@ module Concurrent
44

55
# Define update methods that use direct paths
66
module AtomicDirectUpdate
7+
8+
# @!macro [attach] atomic_reference_method_update
9+
#
710
# Pass the current value to the given block, replacing it
811
# with the block's result. May retry if the value changes
912
# during the block's execution.
13+
#
14+
# @yield [Object] Calculate a new value for the atomic reference using
15+
# given (old) value
16+
# @yieldparam [Object] old_value the starting value of the atomic reference
17+
#
18+
# @return [Object] the new value
1019
def update
1120
true until compare_and_set(old_value = get, new_value = yield(old_value))
1221
new_value
1322
end
1423

24+
# @!macro [attach] atomic_reference_method_try_update
25+
#
26+
# Pass the current value to the given block, replacing it
27+
# with the block's result. Raise an exception if the update
28+
# fails.
29+
#
30+
# @yield [Object] Calculate a new value for the atomic reference using
31+
# given (old) value
32+
# @yieldparam [Object] old_value the starting value of the atomic reference
33+
#
34+
# @return [Object] the new value
35+
#
36+
# @raise [Concurrent::ConcurrentUpdateError] if the update fails
1537
def try_update
1638
old_value = get
1739
new_value = yield old_value

lib/concurrent/atomic_reference/jruby.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
require 'concurrent/atomic_reference/direct_update'
33

44
module Concurrent
5+
6+
# @!macro atomic_reference
57
class JavaAtomic
68
include Concurrent::AtomicDirectUpdate
79
end

lib/concurrent/atomic_reference/mutex_atomic.rb

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,66 @@
44

55
module Concurrent
66

7-
# Portable/generic (but not very memory or scheduling-efficient) fallback
8-
class MutexAtomic #:nodoc: all
7+
# @!macro atomic_reference
8+
class MutexAtomic
99
include Concurrent::AtomicDirectUpdate
1010
include Concurrent::AtomicNumericCompareAndSetWrapper
1111

12+
# @!macro atomic_reference_method_initialize
1213
def initialize(value = nil)
1314
@mutex = Mutex.new
1415
@value = value
1516
end
1617

18+
# @!macro [attach] atomic_reference_method_get
19+
#
20+
# Gets the current value.
21+
#
22+
# @return [Object] the current value
1723
def get
1824
@mutex.synchronize { @value }
1925
end
20-
alias value get
26+
alias_method :value, :get
2127

28+
# @!macro [attach] atomic_reference_method_set
29+
#
30+
# Sets to the given value.
31+
#
32+
# @param [Object] new_value the new value
33+
#
34+
# @return [Object] the new value
2235
def set(new_value)
2336
@mutex.synchronize { @value = new_value }
2437
end
25-
alias value= set
38+
alias_method :value=, :set
2639

40+
# @!macro [attach] atomic_reference_method_get_and_set
41+
#
42+
# Atomically sets to the given value and returns the old value.
43+
#
44+
# @param [Object] new_value the new value
45+
#
46+
# @return [Object] the old value
2747
def get_and_set(new_value)
2848
@mutex.synchronize do
2949
old_value = @value
3050
@value = new_value
3151
old_value
3252
end
3353
end
34-
alias swap get_and_set
54+
alias_method :swap, :get_and_set
3555

36-
def _compare_and_set(old_value, new_value)
56+
# @!macro [attach] atomic_reference_method_compare_and_set
57+
#
58+
# Atomically sets the value to the given updated value if
59+
# the current value == the expected value.
60+
#
61+
# @param [Object] old_value the expected value
62+
# @param [Object] new_value the new value
63+
#
64+
# @return [Boolean] `true` if successful. A `false` return indicates
65+
# that the actual value was not equal to the expected value.
66+
def _compare_and_set(old_value, new_value) #:nodoc:
3767
return false unless @mutex.try_lock
3868
begin
3969
return false unless @value.equal? old_value

lib/concurrent/atomic_reference/numeric_cas_wrapper.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
module Concurrent
22

3+
# Special "compare and set" handling of numeric values.
34
module AtomicNumericCompareAndSetWrapper
4-
#alias _compare_and_set compare_and_set
55

6+
# @!macro atomic_reference_method_compare_and_set
67
def compare_and_set(expected, new)
78
if expected.kind_of? Numeric
89
while true
@@ -19,6 +20,6 @@ def compare_and_set(expected, new)
1920
_compare_and_set(expected, new)
2021
end
2122
end
22-
alias compare_and_swap compare_and_set
23+
alias_method :compare_and_swap, :compare_and_set
2324
end
2425
end

lib/concurrent/atomic_reference/rbx.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33

44
module Concurrent
55

6-
# extend Rubinius's version adding aliases and numeric logic
6+
# @!macro atomic_reference
7+
#
8+
# @note Extends `Rubinius::AtomicReference` version adding aliases
9+
# and numeric logic.
710
class RbxAtomic < Rubinius::AtomicReference
811
alias _compare_and_set compare_and_set
912
include Concurrent::AtomicDirectUpdate
1013
include Concurrent::AtomicNumericCompareAndSetWrapper
1114

12-
alias value get
13-
alias value= set
14-
alias swap get_and_set
15+
alias_method :value, :get
16+
alias_method :value=, :set
17+
alias_method :swap, :get_and_set
1518
end
1619
end

lib/concurrent/atomic_reference/ruby.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
require 'concurrent/atomic_reference/numeric_cas_wrapper'
1010

1111
module Concurrent
12+
13+
# @!macro atomic_reference
1214
class CAtomic
1315
include Concurrent::AtomicDirectUpdate
1416
include Concurrent::AtomicNumericCompareAndSetWrapper

0 commit comments

Comments
 (0)