pub fn close(q: *TypeErasedQueue, io: Io) void q: *TypeErasedQueueio: Io2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130 pub fn close(q: *TypeErasedQueue, io: Io) void {
q.mutex.lockUncancelable(io);
defer q.mutex.unlock(io);
q.closed = true;
{
var it = q.getters.first;
while (it) |node| : (it = node.next) {
const getter: *Get = @alignCast(@fieldParentPtr("node", node));
getter.condition.signal(io);
}
}
{
var it = q.putters.first;
while (it) |node| : (it = node.next) {
const putter: *Put = @alignCast(@fieldParentPtr("node", node));
putter.condition.signal(io);
}
}
}
After this is called, the queue enters a "closed" state. A closed queue always returns
error.Closedfor put attempts even when there is space in the buffer. However, existing elements of the queue are retrieved beforeerror.Closedis returned.Idempotent. Threadsafe.