This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig standard library. Private Function
fngetLocked(q: *TypeErasedQueue, io: Io, buffer: []u8, min: usize, uncancelable: bool) (QueueClosedError || Cancelable)!usize {
// The ring buffer gets first priority, then data should come from any// queued putters, then finally the ring buffer should be filled with// data from putters so they can be resumed.// The number of elements we received immediately, before possibly blocking.varn: usize = 0;
while (q.gettableSlice()) |slice| {
constcopy_len = @min(slice.len, buffer.len - n);
assert(copy_len > 0);
@memcpy(buffer[n..][0..copy_len], slice[0..copy_len]);
q.start += copy_len;
if (q.buffer.len - q.start == 0) q.start = 0;
q.len -= copy_len;
n += copy_len;
if (n == buffer.len) {
q.fillRingBufferFromPutters(io);
returnbuffer.len;
}
}
// Copy directly from putters into buffer.while (q.putters.popFirst()) |putter_node| {
constputter: *Put = @alignCast(@fieldParentPtr("node", putter_node));
constcopy_len = @min(putter.remaining.len, buffer.len - n);
assert(copy_len > 0);
@memcpy(buffer[n..][0..copy_len], putter.remaining[0..copy_len]);
putter.remaining = putter.remaining[copy_len..];
putter.needed -|= copy_len;
n += copy_len;
if (putter.needed == 0) {
putter.condition.signal(io);
} else {
assert(n == buffer.len); // we didn't have enough space for the putterq.putters.prepend(putter_node);
}
if (n == buffer.len) {
q.fillRingBufferFromPutters(io);
returnbuffer.len;
}
}
// No need to call `fillRingBufferFromPutters` from this point onwards,// because we emptied the ring buffer *and* the putter queue!// Don't block if we hit the min or if the queue is closed. Return how// many elements we could get immediately, unless the queue was closed and// empty, in which case report `error.Closed`.if (n == 0andq.closed) returnerror.Closed;
if (n >= minorq.closed) returnn;
varpending: Get = .{
.remaining = buffer[n..],
.needed = min - n,
.condition = .init,
.node = .{},
};
q.getters.append(&pending.node);
deferif (pending.needed > 0) q.getters.remove(&pending.node);
while (pending.needed > 0and !q.closed) {
if (uncancelable) {
pending.condition.waitUncancelable(io, &q.mutex);
continue;
}
pending.condition.wait(io, &q.mutex) catch |err| switch (err) {
error.Canceled => if (pending.remaining.len == buffer.len) {
// Canceled while waiting, and received no elements.returnerror.Canceled;
} else {
// Canceled while waiting, but received some elements, so report those first.io.recancel();
returnbuffer.len - pending.remaining.len;
},
};
}
if (pending.remaining.len == buffer.len) {
// The queue was closed while we were waiting. We received no elements.assert(q.closed);
returnerror.Closed;
}
returnbuffer.len - pending.remaining.len;
}