Class: Concurrent::LockFreeStack

Inherits:
Synchronization::Object
  • Object
show all
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 to concurrent-ruby when finalised.

Defined Under Namespace

Classes: Node

Constant Summary collapse

EMPTY =

The singleton for empty node

Node[nil, nil]

Instance Method Summary collapse

Constructor Details

#initialize(head = EMPTY) ⇒ LockFreeStack

Returns a new instance of LockFreeStack.

Parameters:

  • head (Node) (defaults to: EMPTY)


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

#cleartrue, false

Returns:

  • (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

Yields:

  • over the cleared stack

Yield Parameters:

  • value (Object)

Returns:

  • (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

Parameters:

Returns:

  • (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

Parameters:

Returns:

  • (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

Parameters:

Returns:

  • (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

Parameters:

  • head (Node)
  • value (Object)

Returns:

  • (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

Parameters:

  • head (Node) (defaults to: nil)

Returns:

  • (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

Parameters:

  • head (Node) (defaults to: head())

Returns:

  • (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

#peekNode

Returns:



79
80
81
# File 'lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb', line 79

def peek
  head
end

#popObject

Returns:

  • (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

Parameters:

  • value (Object)

Returns:

  • (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

Parameters:

Returns:

  • (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_sString Also known as: inspect

Returns Short string representation.

Returns:

  • (String)

    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
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy