aboutsummaryrefslogtreecommitdiff
path: root/src/lib/vfs.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/vfs.zig')
-rw-r--r--src/lib/vfs.zig16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig
index 12c40a2..d9a7b90 100644
--- a/src/lib/vfs.zig
+++ b/src/lib/vfs.zig
@@ -132,9 +132,11 @@ pub const ResourceDescriptor = struct {
pub fn read(self: ResourceDescriptor, proc: *process.Info, buffer: []u8) !noreturn {
return switch (self.inode.resource) {
.stream => |stream| {
+ const driver = process.latestThread(self.inode.pid).?;
+
const readFn = stream.readFn orelse return Error.ReadNotSupported;
proc.state = .suspended;
- try call(self.inode.pid, readFn, .{ buffer.ptr, buffer.len }, .{
+ try call(driver, readFn, .{ buffer.ptr, buffer.len }, .{
.hookFn = crossProcessReturn,
.context = proc,
});
@@ -147,9 +149,11 @@ pub const ResourceDescriptor = struct {
pub fn write(self: ResourceDescriptor, proc: *process.Info, bytes: []const u8) !noreturn {
return switch (self.inode.resource) {
.stream => |stream| {
+ const driver = process.latestThread(self.inode.pid).?;
+
const writeFn = stream.writeFn orelse return Error.WriteNotSupported;
proc.state = .suspended;
- try call(self.inode.pid, writeFn, .{ bytes.ptr, bytes.len }, .{
+ try call(driver, writeFn, .{ bytes.ptr, bytes.len }, .{
.hookFn = crossProcessReturn,
.context = proc,
});
@@ -215,8 +219,10 @@ pub fn open(proc: *process.Info, path: []const u8, pid: u16, data: usize) !Resou
const node = find(path) orelse return Error.NotFound;
return switch (node.data.resource) {
.hook => |hook| {
+ const driver = process.latestThread(node.data.pid).?;
+
proc.state = .suspended;
- try call(node.data.pid, hook.callback, .{ pid, data }, .{
+ try call(driver, hook.callback, .{ pid, data }, .{
.hookFn = crossProcessReturn,
.context = proc,
});
@@ -229,10 +235,8 @@ pub fn openZ(proc: *process.Info, path_c: [*:0]const u8, pid: u16, data: usize)
return open(proc, mem.sliceTo(path_c, 0), pid, data);
}
-fn call(pid: u16, function: *const anyopaque, args: anytype, termHook: ?process.Info.TermHook) !noreturn {
- const proc = process.latestThread(pid).?;
+fn call(proc: *process.Info, function: *const anyopaque, args: anytype, termHook: ?process.Info.TermHook) !noreturn {
const callback_thread = try proc.createThread(null);
-
callback_thread.call(@intFromPtr(function), args, termHook);
}