35 lines
936 B
Zig
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,
|
|
};
|
|
}
|
|
};
|
|
}
|