aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-08-01 19:23:57 +0200
committerHimbeer <himbeer@disroot.org>2024-08-01 19:24:15 +0200
commite132f69a8adea80e8bf668f67edc2e27e9183648 (patch)
tree96c68004b371483d59a457de53f4cb2ab0047016
parenteb8bc65a151d818253890ec0dd5e328249f926d5 (diff)
process: Leave all channels on termination
Fixes #72.
-rw-r--r--src/channel.zig12
-rw-r--r--src/process.zig3
2 files changed, 14 insertions, 1 deletions
diff --git a/src/channel.zig b/src/channel.zig
index d22bc77..ef34531 100644
--- a/src/channel.zig
+++ b/src/channel.zig
@@ -50,9 +50,14 @@ pub fn join(pid: u16, id: usize) !void {
pub fn leave(pid: u16, id: usize) void {
const queues = joined.getPtr(pid) orelse return;
+ freeQueue(queues, id);
+ _ = queues.swapRemove(id);
+}
+
+pub fn leaveAll(pid: u16) void {
+ const queues = joined.getPtr(pid) orelse return;
freeQueues(queues);
queues.clearAndFree();
- _ = queues.swapRemove(id);
}
// The channel takes ownership of `bytes`.
@@ -119,6 +124,11 @@ fn freeQueues(queues: *Queues) void {
}
}
+fn freeQueue(queues: *Queues, id: usize) void {
+ const messages = queues.getPtr(id) orelse return;
+ freeMessages(messages);
+}
+
fn freeMessages(messages: *Messages) void {
while (messages.popFirst()) |message| {
message.data.dropReference();
diff --git a/src/process.zig b/src/process.zig
index 1b1486b..9970f2e 100644
--- a/src/process.zig
+++ b/src/process.zig
@@ -5,6 +5,7 @@
const builtin = @import("builtin");
const std = @import("std");
const TrapFrame = @import("TrapFrame.zig");
+const channel = @import("channel.zig");
const paging = @import("paging.zig");
const riscv = @import("riscv.zig");
const time = @import("sbi/time.zig");
@@ -114,6 +115,8 @@ pub const Info = struct {
paging.free(self.stack);
if (self.thread_id == 0) {
+ channel.leaveAll(self.id);
+
self.page_table.unmap();
paging.free(self.page_table);
self.freeSections();