aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-08-01 19:14:53 +0200
committerHimbeer <himbeer@disroot.org>2024-08-01 19:14:53 +0200
commiteb8bc65a151d818253890ec0dd5e328249f926d5 (patch)
tree849e5233f62e399427c934842abe127d13b1fca9 /src
parent21654e0a7ded9d5370c5468807d7d18e3c101320 (diff)
channel: Filter unicast message receivers at transmission instead of reception
This lowers the performance cost of the receive operation.
Diffstat (limited to 'src')
-rw-r--r--src/channel.zig28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/channel.zig b/src/channel.zig
index 061331e..d22bc77 100644
--- a/src/channel.zig
+++ b/src/channel.zig
@@ -13,7 +13,6 @@ pub const Error = error{
pub const Message = struct {
bytes: []const u8,
refcount: usize = 1,
- process_filter: u16,
sender: u16,
fn addReference(self: *Message) !void {
@@ -63,18 +62,29 @@ pub fn pass(pid: u16, id: usize, receiver: u16, identify: bool, bytes: []const u
message.* = .{
.bytes = bytes,
- .process_filter = receiver,
.sender = if (identify) pid else 0,
};
+ if (receiver != 0) {
+ try message.addReference();
+ errdefer message.dropReference();
+
+ try passTo(joined.getPtr(receiver) orelse return, id, message);
+ return;
+ }
+
var it = joined.iterator();
while (it.next()) |queues| {
- if (queues.value_ptr.getPtr(id)) |messages| {
- try message.addReference();
- errdefer message.dropReference();
+ try message.addReference();
+ errdefer message.dropReference();
- try enqueue(messages, message);
- }
+ try passTo(queues.value_ptr, id, message);
+ }
+}
+
+fn passTo(queues: *Queues, id: usize, message: *Message) !void {
+ if (queues.getPtr(id)) |messages| {
+ try enqueue(messages, message);
}
}
@@ -86,10 +96,6 @@ pub fn receive(pid: u16, id: usize, sender: ?*u16, buffer: []u8) !usize {
defer alloc.destroy(message);
defer message.data.dropReference();
- if (message.data.process_filter != pid and message.data.process_filter != 0) {
- return Error.WouldBlock;
- }
-
if (sender) |sender_id| sender_id.* = message.data.sender;
const len = @min(buffer.len, message.data.bytes.len);