diff options
author | Himbeer <himbeer@disroot.org> | 2024-08-01 19:14:53 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-08-01 19:14:53 +0200 |
commit | eb8bc65a151d818253890ec0dd5e328249f926d5 (patch) | |
tree | 849e5233f62e399427c934842abe127d13b1fca9 /src | |
parent | 21654e0a7ded9d5370c5468807d7d18e3c101320 (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.zig | 28 |
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); |