craftflut/src/msg_queue/queue.zig
2025-06-01 12:33:53 +02:00

35 lines
936 B
Zig

const std = @import("std");
const mpsc = @import("../mpsc.zig");
pub fn Queue(comptime T: type) type {
return struct {
const Self = @This();
ring_buffer: mpsc.RingBuffer(T),
pub fn init(buffer: []mpsc.Slot(T)) Self {
return .{
.ring_buffer = mpsc.RingBuffer(T).init(buffer),
};
}
pub fn blockingEnqueue(self: *Self, value: T) void {
while (true) {
self.ring_buffer.enqueue(value) catch |err| switch (err) {
error.Overflow => {
std.atomic.spinLoopHint();
continue;
},
};
return;
}
}
pub fn dequeue(self: *Self) ?T {
return self.ring_buffer.dequeue() catch |err| switch (err) {
error.Underflow => return null,
};
}
};
}