Make ConsumableQueue nogc.

This commit is contained in:
Sönke Ludwig 2018-10-21 20:15:37 +02:00
parent 90a60f7981
commit 4a605640bc

View file

@ -1,5 +1,8 @@
module eventcore.internal.consumablequeue; module eventcore.internal.consumablequeue;
import eventcore.internal.utils : mallocNT, freeNT;
/** FIFO queue with support for chunk-wise consumption. /** FIFO queue with support for chunk-wise consumption.
*/ */
final class ConsumableQueue(T) final class ConsumableQueue(T)
@ -18,6 +21,12 @@ final class ConsumableQueue(T)
size_t m_pendingCount; 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 size_t length() const { return m_pendingCount; }
@property bool empty() const { return length == 0; } @property bool empty() const { return length == 0; }
@ -43,11 +52,15 @@ final class ConsumableQueue(T)
while (new_capacity < min_capacity) new_capacity *= 2; while (new_capacity < min_capacity) new_capacity *= 2;
auto new_capacity_mask = new_capacity - 1; 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) foreach (i; 0 .. m_consumedCount + m_pendingCount)
new_storage[(m_first + i) & new_capacity_mask] = m_storage[(m_first + i) & m_capacityMask]; 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; m_capacityMask = new_capacity_mask;
} }