Class: Concurrent::Edge::LockFreeLinkedSet::Window
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/concurrent-ruby-edge/concurrent/edge/lock_free_linked_set/window.rb |
Class Method Summary
- .find(head, item)
- .new(pred, curr) ⇒ Window constructor
Instance Attribute Summary
Constructor Details
.new(pred, curr) ⇒ Window
# File 'lib/concurrent-ruby-edge/concurrent/edge/lock_free_linked_set/window.rb', line 7
def initialize(pred, curr) @pred, @curr = pred, curr end
Class Method Details
.find(head, item)
This method is used to find a ‘window’ for which Concurrent::Edge::LockFreeLinkedSet#add and Concurrent::Edge::LockFreeLinkedSet#remove methods can use to know where to add and remove from the list. However, it has another responsibilility, which is to physically unlink any nodes marked for removal in the set. This prevents adds/removes from having to retraverse the list to physically unlink nodes.
# File 'lib/concurrent-ruby-edge/concurrent/edge/lock_free_linked_set/window.rb', line 16
def self.find(head, item) loop do break_inner_loops = false pred = head curr = pred.next_node loop do succ, marked = curr.successor_reference.get # Remove sequence of marked nodes while marked removed = pred.successor_reference.compare_and_set curr, succ, false, false # If could not remove node, try again break_inner_loops = true && break unless removed curr = succ succ, marked = curr.successor_reference.get end break if break_inner_loops # We have found a window return new pred, curr if curr >= item pred = curr curr = succ end end end
Instance Attribute Details
#curr (rw)
[ GitHub ]# File 'lib/concurrent-ruby-edge/concurrent/edge/lock_free_linked_set/window.rb', line 5
attr_accessor :pred, :curr
#pred (rw)
[ GitHub ]# File 'lib/concurrent-ruby-edge/concurrent/edge/lock_free_linked_set/window.rb', line 5
attr_accessor :pred, :curr