123456789_123456789_123456789_123456789_123456789_

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

Instance Attribute Summary

Constructor Details

.new(pred, curr) ⇒ Window

[ GitHub ]

  
# 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.

[ GitHub ]

  
# 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