Open
Description
We have LockFreeLinkedListNode
and co. based on the "Lock-Free and Practical Doubly Linked List-Based Deques Using Single-Word Compare-and-Swap" paper.
The implementation has a long-standing tail of issues:
- The paper itself is known for having non-linearizability issues that trigger various failures when the data structure is stressed enough
- DCLL is too generic: it allows all operations a trivial double-linked list (bi-directional iterations, mid-section removals etc.), which makes the reasoning and the maintenance of the concurrent invariants a tough task. Attempts to bisect a compact subset of only required invariants all failed.
- The implementation is slower than it could be: any mutating operation implies at least 4 CASes; any added element corresponds to a separate object with multiple atomic fields (prev, next, removal marker)
- Due to 2 & 3, the correct implementation is bloated, which contributes ~10% of optimized DEX size of
kotlinx.coroutines
.
The proposed solution is straightforward -- get rid of DCLL and replace it with recently added FADD-based ConcurrentLinkedList
that semaphore, mutex and channels leverage