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 @@...@@ -1,3 +1,6 @@
1const std = @import("../index.zig");
2const assert = std.debug.assert;
3
1//////////////////////////4//////////////////////////
2//// IPC structures ////5//// IPC structures ////
3//////////////////////////6//////////////////////////
...@@ -5,28 +8,36 @@...@@ -5,28 +8,36 @@
5pub const Message = struct {8pub const Message = struct {
6 sender: MailboxId,9 sender: MailboxId,
7 receiver: MailboxId,10 receiver: MailboxId,
8 type: usize,11 code: usize,
9 payload: usize,12 args: [5]usize,
10 buffer: ?[]const u8,13 payload: ?[]const u8,
1114
12 pub fn from(mailbox_id: &const MailboxId) Message {15 pub fn from(mailbox_id: &const MailboxId) Message {
13 return Message {16 return Message {
14 .sender = MailboxId.Undefined,17 .sender = MailboxId.Undefined,
15 .receiver = *mailbox_id,18 .receiver = *mailbox_id,
16 .type = 0,19 .code = undefined,
17 .payload = 0,20 .args = undefined,
18 .buffer = null,21 .payload = null,
19 };22 };
20 }23 }
2124
22 pub fn to(mailbox_id: &const MailboxId, msg_type: usize) Message {25 pub fn to(mailbox_id: &const MailboxId, msg_code: usize, args: ...) Message {
23 return Message {26 var message = Message {
24 .sender = MailboxId.This,27 .sender = MailboxId.This,
25 .receiver = *mailbox_id,28 .receiver = *mailbox_id,
26 .type = msg_type,29 .code = msg_code,
27 .payload = 0,30 .args = undefined,
28 .buffer = null,31 .payload = null,
29 };32 };
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;
30 }41 }
3142
32 pub fn as(self: &const Message, sender: &const MailboxId) Message {43 pub fn as(self: &const Message, sender: &const MailboxId) Message {
...@@ -35,15 +46,9 @@ pub const Message = struct {...@@ -35,15 +46,9 @@ pub const Message = struct {
35 return message;46 return message;
36 }47 }
3748
38 pub fn data(self: &const Message, var_data: var) Message {49 pub fn withPayload(self: &const Message, payload: []const u8) Message {
39 var message = *self;50 var message = *self;
4051 message.payload = payload;
41 if (@canImplicitCast([]const u8, var_data)) {
42 message.buffer = var_data;
43 } else {
44 message.payload = var_data;
45 }
46
47 return message;52 return message;
48 }53 }
49};54};
...@@ -91,7 +96,7 @@ pub fn read(fd: i32, buf: &u8, count: usize) usize {...@@ -91,7 +96,7 @@ pub fn read(fd: i32, buf: &u8, count: usize) usize {
91 var message = Message.from(MailboxId.This);96 var message = Message.from(MailboxId.This);
92 receive(&message);97 receive(&message);
9398
94 buf[i] = u8(message.payload);99 buf[i] = u8(message.args[0]);
95 }100 }
96 },101 },
97 else => unreachable,102 else => unreachable,
...@@ -104,7 +109,7 @@ pub fn write(fd: i32, buf: &const u8, count: usize) usize {...@@ -104,7 +109,7 @@ pub fn write(fd: i32, buf: &const u8, count: usize) usize {
104 switch (fd) {109 switch (fd) {
105 STDOUT_FILENO, STDERR_FILENO => {110 STDOUT_FILENO, STDERR_FILENO => {
106 send(Message.to(Server.Terminal, 1)111 send(Message.to(Server.Terminal, 1)
107 .data(buf[0..count]));112 .withPayload(buf[0..count]));
108 },113 },
109 else => unreachable,114 else => unreachable,
110 }115 }