Class: Concurrent::LockFreeStack
- Inherits:
-
Synchronization::Object
- Object
- Synchronization::AbstractObject
- Synchronization::Object
- Concurrent::LockFreeStack
- Includes:
- Enumerable
- Defined in:
- lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb
Overview
Note:
Edge Features are under active development and may change frequently.
- Deprecations are not added before incompatible changes.
- Edge version: major is always 0, minor bump means incompatible change, patch bump means compatible change.
- Edge features may also lack tests and documentation.
- Features developed in
concurrent-ruby-edge
are expected to move toconcurrent-ruby
when finalised.
Defined Under Namespace
Classes: Node
Constant Summary collapse
- EMPTY =
The singleton for empty node
Node[nil, nil]
Instance Method Summary collapse
- #clear ⇒ true, false
- #clear_each {|value| ... } ⇒ self
- #clear_if(head) ⇒ true, false
- #compare_and_clear(head) ⇒ true, false
- #compare_and_pop(head) ⇒ true, false
- #compare_and_push(head, value) ⇒ true, false
- #each(head = nil) ⇒ self
- #empty?(head = head()) ⇒ true, false
-
#initialize(head = EMPTY) ⇒ LockFreeStack
constructor
A new instance of LockFreeStack.
- #peek ⇒ Node
- #pop ⇒ Object
- #push(value) ⇒ self
- #replace_if(head, new_head) ⇒ true, false
-
#to_s ⇒ String
(also: #inspect)
Short string representation.
Constructor Details
#initialize(head = EMPTY) ⇒ LockFreeStack
Returns a new instance of LockFreeStack.
51 52 53 54 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 51 def initialize(head = EMPTY) super() self.head = head end |
Instance Method Details
#clear ⇒ true, false
118 119 120 121 122 123 124 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 118 def clear while true current_head = head return false if current_head == EMPTY return true if compare_and_set_head current_head, EMPTY end end |
#clear_each {|value| ... } ⇒ self
142 143 144 145 146 147 148 149 150 151 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 142 def clear_each(&block) while true current_head = head return self if current_head == EMPTY if compare_and_set_head current_head, EMPTY each current_head, &block return self end end end |
#clear_if(head) ⇒ true, false
128 129 130 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 128 def clear_if(head) compare_and_set_head head, EMPTY end |
#compare_and_clear(head) ⇒ true, false
99 100 101 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 99 def compare_and_clear(head) compare_and_set_head head, EMPTY end |
#compare_and_pop(head) ⇒ true, false
85 86 87 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 85 def compare_and_pop(head) compare_and_set_head head, head.next_node end |
#compare_and_push(head, value) ⇒ true, false
65 66 67 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 65 def compare_and_push(head, value) compare_and_set_head head, Node[value, head] end |
#each(head = nil) ⇒ self
107 108 109 110 111 112 113 114 115 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 107 def each(head = nil) return to_enum(:each, head) unless block_given? it = head || peek until it.equal?(EMPTY) yield it.value it = it.next_node end self end |
#empty?(head = head()) ⇒ true, false
58 59 60 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 58 def empty?(head = head()) head.equal? EMPTY end |
#peek ⇒ Node
79 80 81 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 79 def peek head end |
#pop ⇒ Object
90 91 92 93 94 95 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 90 def pop while true current_head = head return current_head.value if compare_and_set_head current_head, current_head.next_node end end |
#push(value) ⇒ self
71 72 73 74 75 76 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 71 def push(value) while true current_head = head return self if compare_and_set_head current_head, Node[value, current_head] end end |
#replace_if(head, new_head) ⇒ true, false
135 136 137 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 135 def replace_if(head, new_head) compare_and_set_head head, new_head end |
#to_s ⇒ String Also known as: inspect
Returns Short string representation.
154 155 156 |
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 154 def to_s format '%s %s>', super[0..-2], to_a.to_s end |