Make ConsumableQueue nogc.
This commit is contained in:
parent
90a60f7981
commit
4a605640bc
|
@ -1,5 +1,8 @@
|
|||
module eventcore.internal.consumablequeue;
|
||||
|
||||
import eventcore.internal.utils : mallocNT, freeNT;
|
||||
|
||||
|
||||
/** FIFO queue with support for chunk-wise consumption.
|
||||
*/
|
||||
final class ConsumableQueue(T)
|
||||
|
@ -18,6 +21,12 @@ final class ConsumableQueue(T)
|
|||
size_t m_pendingCount;
|
||||
}
|
||||
|
||||
~this()
|
||||
@trusted @nogc nothrow {
|
||||
if (m_storage !is null)
|
||||
freeNT(m_storage);
|
||||
}
|
||||
|
||||
@property size_t length() const { return m_pendingCount; }
|
||||
|
||||
@property bool empty() const { return length == 0; }
|
||||
|
@ -43,11 +52,15 @@ final class ConsumableQueue(T)
|
|||
while (new_capacity < min_capacity) new_capacity *= 2;
|
||||
auto new_capacity_mask = new_capacity - 1;
|
||||
|
||||
auto new_storage = new Slot[new_capacity];
|
||||
auto new_storage = mallocNT!Slot(new_capacity);
|
||||
foreach (i; 0 .. m_consumedCount + m_pendingCount)
|
||||
new_storage[(m_first + i) & new_capacity_mask] = m_storage[(m_first + i) & m_capacityMask];
|
||||
|
||||
m_storage = new_storage;
|
||||
() @trusted {
|
||||
if (m_storage !is null)
|
||||
freeNT(m_storage);
|
||||
m_storage = new_storage;
|
||||
} ();
|
||||
m_capacityMask = new_capacity_mask;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue