Skip to content

Commit f4885e7

Browse files
committed
fix deadlock when multiple goroutines are trying to delete the same node
1 parent 8cde6bd commit f4885e7

File tree

1 file changed

+4
-16
lines changed

1 file changed

+4
-16
lines changed

list.go

+4-16
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,11 @@ func (self *element[K, V]) search(c uintptr, key K) (*element[K, V], *element[K,
102102
}
103103
}
104104

105-
// remove removes the current node
105+
// remove marks a node for deletion
106+
// the node will be removed in the next iteration via `element.next()`
106107
func (self *element[K, V]) remove() {
107-
for !self.add(marked) {
108+
deletionNode := &element[K, V]{keyHash: marked}
109+
for !self.isDeleted() && !self.addBefore(marked, deletionNode, self.next()) {
108110
}
109111
}
110112

@@ -115,17 +117,3 @@ func (self *element[K, V]) isDeleted() bool {
115117
}
116118
return false
117119
}
118-
119-
func (self *element[K, V]) add(c uintptr) bool {
120-
alloc := &element[K, V]{keyHash: c}
121-
for {
122-
// If we are deleted then we do not allow adding new children.
123-
if self.isDeleted() {
124-
return false
125-
}
126-
// If we succeed in adding before our perceived next, just return true.
127-
if self.addBefore(c, alloc, self.next()) {
128-
return true
129-
}
130-
}
131-
}

0 commit comments

Comments
 (0)