Skip to content

Commit 9509164

Browse files
committed
LockFreeStack fast constructors for 1,2 elements
1 parent 6d8ad2d commit 9509164

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

lib/concurrent/edge/lock_free_stack.rb

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ class LockFreeStack < Synchronization::Object
44
safe_initialization!
55

66
class Node
7+
# TODO (pitr-ch 20-Dec-2016): Could be unified with Stack class?
8+
79
attr_reader :value, :next_node
10+
# allow to nil-ify to free GC when the entry is no longer relevant, not synchronised
11+
attr_writer :value
812

913
def initialize(value, next_node)
1014
@value = value
@@ -24,9 +28,17 @@ def next_node
2428

2529
private(*attr_atomic(:head))
2630

27-
def initialize
31+
def self.of1(value)
32+
new Node[value, EMPTY]
33+
end
34+
35+
def self.of2(value1, value2)
36+
new Node[value1, Node[value2, EMPTY]]
37+
end
38+
39+
def initialize(head = EMPTY)
2840
super()
29-
self.head = EMPTY
41+
self.head = head
3042
end
3143

3244
def empty?(head = self.head)
@@ -87,6 +99,10 @@ def clear_if(head)
8799
compare_and_set_head head, EMPTY
88100
end
89101

102+
def replace_if(head, new_head)
103+
compare_and_set_head head, new_head
104+
end
105+
90106
def clear_each(&block)
91107
while true
92108
current_head = head

lib/concurrent/edge/promises.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,14 +1358,15 @@ def self.new_blocked1(blocker, *args, &block)
13581358
def self.new_blocked2(blocker1, blocker2, *args, &block)
13591359
blocker_delayed1 = blocker1.promise.delayed
13601360
blocker_delayed2 = blocker2.promise.delayed
1361+
# TODO (pitr-ch 23-Dec-2016): use arrays when we know it will not grow (only flat adds delay)
13611362
delayed = if blocker_delayed1
13621363
if blocker_delayed2
1363-
LockFreeStack.new2(blocker_delayed1, blocker_delayed2)
1364+
LockFreeStack.of2(blocker_delayed1, blocker_delayed2)
13641365
else
1365-
LockFreeStack.new1(blocker_delayed1)
1366+
LockFreeStack.of1(blocker_delayed1)
13661367
end
13671368
else
1368-
blocker_delayed2 ? LockFreeStack.new1(blocker_delayed2) : nil
1369+
blocker_delayed2 ? LockFreeStack.of1(blocker_delayed2) : nil
13691370
end
13701371
promise = new(delayed, 2, *args, &block)
13711372
ensure
@@ -1384,7 +1385,7 @@ def self.add_delayed(delayed, blocker)
13841385
blocker_delayed = blocker.promise.delayed
13851386
if blocker_delayed
13861387
delayed = unless delayed
1387-
LockFreeStack.new1(blocker_delayed)
1388+
LockFreeStack.of1(blocker_delayed)
13881389
else
13891390
delayed.push(blocker_delayed)
13901391
end

0 commit comments

Comments
 (0)