17#ifndef __KIS_LOCKLESS_STACK_H
18#define __KIS_LOCKLESS_STACK_H
20#include <QAtomicPointer>
48 }
while (!
m_top.testAndSetOrdered(top, newNode));
65 if(
m_top.testAndSetOrdered(top, next)) {
100 Node *top =
m_top.fetchAndStoreOrdered(0);
102 int removedChunkSize = 0;
108 m_numNodes.fetchAndAddOrdered(-removedChunkSize);
133 Node *otherTop = other.
m_top.fetchAndStoreOrdered(0);
134 if (!otherTop)
return;
136 int removedChunkSize = 1;
137 Node *last = otherTop;
142 other.
m_numNodes.fetchAndAddOrdered(-removedChunkSize);
149 }
while (!
m_top.testAndSetOrdered(top, otherTop));
151 m_numNodes.fetchAndAddOrdered(removedChunkSize);
174 }
while (!
m_freeNodes.testAndSetOrdered(top, node));
179 if (!cleanChain)
return;
190 Node *last = cleanChain;
191 while (last->
next) last = last->
next;
197 last->
next = freeTop;
198 }
while (!
m_freeNodes.testAndSetOrdered(freeTop, cleanChain));
float value(const T *src, size_t ch)
QAtomicPointer< Node > m_freeNodes
void releaseNode(Node *node)
QAtomicInt m_deleteBlockers
QAtomicPointer< Node > m_top
void mergeFrom(KisLocklessStack< T > &other)
void freeList(Node *first)