authorgravatar for andrea@orru.ioAndrea Orru <andrea@orru.io> 2018-04-12 22:24:57-07:00
committergravatar for andrea@orru.ioAndrea Orru <andrea@orru.io> 2018-04-12 22:24:57-07:00
logc5f088e52c5f49524f79dcdceb82f13d295b7d70
treec64c719953535f94cfc3edb54947c2b770a4952e
parent70f2bb03fd0ac63243afd985ece7713055845363

Pass up to 5 arguments in Zen IPC


1 files changed, 26 insertions(+), 21 deletions(-)

std/os/zen.zig+26-21
......@@ -1,3 +1,6 @@
1const std = @import("../index.zig");
2const assert = std.debug.assert;
3
14//////////////////////////
25//// IPC structures ////
36//////////////////////////
......@@ -5,28 +8,36 @@
58pub const Message = struct {
69 sender: MailboxId,
710 receiver: MailboxId,
8 type: usize,
9 payload: usize,
10 buffer: ?[]const u8,
11 code: usize,
12 args: [5]usize,
13 payload: ?[]const u8,
1114
1215 pub fn from(mailbox_id: &const MailboxId) Message {
1316 return Message {
1417 .sender = MailboxId.Undefined,
1518 .receiver = *mailbox_id,
16 .type = 0,
17 .payload = 0,
18 .buffer = null,
19 .code = undefined,
20 .args = undefined,
21 .payload = null,
1922 };
2023 }
2124
22 pub fn to(mailbox_id: &const MailboxId, msg_type: usize) Message {
23 return Message {
25 pub fn to(mailbox_id: &const MailboxId, msg_code: usize, args: ...) Message {
26 var message = Message {
2427 .sender = MailboxId.This,
2528 .receiver = *mailbox_id,
26 .type = msg_type,
27 .payload = 0,
28 .buffer = null,
29 .code = msg_code,
30 .args = undefined,
31 .payload = null,
2932 };
33
34 assert (args.len <= message.args.len);
35 comptime var i = 0;
36 inline while (i < args.len) : (i += 1) {
37 message.args[i] = args[i];
38 }
39
40 return message;
3041 }
3142
3243 pub fn as(self: &const Message, sender: &const MailboxId) Message {
......@@ -35,15 +46,9 @@ pub const Message = struct {
3546 return message;
3647 }
3748
38 pub fn data(self: &const Message, var_data: var) Message {
49 pub fn withPayload(self: &const Message, payload: []const u8) Message {
3950 var message = *self;
40
41 if (@canImplicitCast([]const u8, var_data)) {
42 message.buffer = var_data;
43 } else {
44 message.payload = var_data;
45 }
46
51 message.payload = payload;
4752 return message;
4853 }
4954};
......@@ -91,7 +96,7 @@ pub fn read(fd: i32, buf: &u8, count: usize) usize {
9196 var message = Message.from(MailboxId.This);
9297 receive(&message);
9398
94 buf[i] = u8(message.payload);
99 buf[i] = u8(message.args[0]);
95100 }
96101 },
97102 else => unreachable,
......@@ -104,7 +109,7 @@ pub fn write(fd: i32, buf: &const u8, count: usize) usize {
104109 switch (fd) {
105110 STDOUT_FILENO, STDERR_FILENO => {
106111 send(Message.to(Server.Terminal, 1)
107 .data(buf[0..count]));
112 .withPayload(buf[0..count]));
108113 },
109114 else => unreachable,
110115 }