Commit b01c5a95c4

Andrea Orru <andrea@orru.io>
2018-04-11 09:31:32
Update zen library
1 parent 43cdfa2
Changed files (2)
std
std/os/zen.zig
@@ -7,6 +7,7 @@ pub const Message = struct {
     receiver: MailboxId,
     type:     usize,
     payload:  usize,
+    buffer:   ?[]const u8,
 
     pub fn from(mailbox_id: &const MailboxId) Message {
         return Message {
@@ -14,6 +15,7 @@ pub const Message = struct {
             .receiver = *mailbox_id,
             .type     = 0,
             .payload  = 0,
+            .buffer   = null,
         };
     }
 
@@ -23,16 +25,26 @@ pub const Message = struct {
             .receiver = *mailbox_id,
             .type     = msg_type,
             .payload  = 0,
+            .buffer   = null,
         };
     }
 
-    pub fn withData(mailbox_id: &const MailboxId, msg_type: usize, payload: usize) Message {
-        return Message {
-            .sender   = MailboxId.This,
-            .receiver = *mailbox_id,
-            .type     = msg_type,
-            .payload  = payload,
-        };
+    pub fn as(self: &const Message, sender: &const MailboxId) Message {
+        var message = *self;
+        message.sender = *sender;
+        return message;
+    }
+
+    pub fn data(self: &const Message, var_data: var) Message {
+        var message = *self;
+
+        if (@canImplicitCast([]const u8, var_data)) {
+            message.buffer = var_data;
+        } else {
+            message.payload = var_data;
+        }
+
+        return message;
     }
 };
 
@@ -91,10 +103,8 @@ pub fn read(fd: i32, buf: &u8, count: usize) usize {
 pub fn write(fd: i32, buf: &const u8, count: usize) usize {
     switch (fd) {
         STDOUT_FILENO, STDERR_FILENO => {
-            var i: usize = 0;
-            while (i < count) : (i += 1) {
-                send(Message.withData(Server.Terminal, 1, buf[i]));
-            }
+            send(Message.to(Server.Terminal, 1)
+                        .data(buf[0..count]));
         },
         else => unreachable,
     }
@@ -108,16 +118,12 @@ pub fn write(fd: i32, buf: &const u8, count: usize) usize {
 
 pub const Syscall = enum(usize) {
     exit          = 0,
-    createPort    = 1,
-    send          = 2,
-    receive       = 3,
-    subscribeIRQ  = 4,
-    inb           = 5,
-    map           = 6,
-    createThread  = 7,
-    createProcess = 8,
-    wait          = 9,
-    portReady     = 10,
+    send          = 1,
+    receive       = 2,
+    subscribeIRQ  = 3,
+    inb           = 4,
+    map           = 5,
+    createThread  = 6,
 };
 
 
@@ -130,13 +136,6 @@ pub fn exit(status: i32) noreturn {
     unreachable;
 }
 
-pub fn createPort(mailbox_id: &const MailboxId) void {
-    _ = switch (*mailbox_id) {
-        MailboxId.Port => |id| syscall1(Syscall.createPort, id),
-        else => unreachable,
-    };
-}
-
 pub fn send(message: &const Message) void {
     _ = syscall1(Syscall.send, @ptrToInt(message));
 }
@@ -161,18 +160,6 @@ pub fn createThread(function: fn()void) u16 {
     return u16(syscall1(Syscall.createThread, @ptrToInt(function)));
 }
 
-pub fn createProcess(elf_addr: usize) u16 {
-    return u16(syscall1(Syscall.createProcess, elf_addr));
-}
-
-pub fn wait(tid: u16) void {
-    _ = syscall1(Syscall.wait, tid);
-}
-
-pub fn portReady(port: u16) bool {
-    return syscall1(Syscall.portReady, port) != 0;
-}
-
 /////////////////////////
 ////  Syscall stubs  ////
 /////////////////////////
std/special/bootstrap.zig
@@ -13,17 +13,11 @@ comptime {
         @export("main", main, strong_linkage);
     } else if (builtin.os == builtin.Os.windows) {
         @export("WinMainCRTStartup", WinMainCRTStartup, strong_linkage);
-    } else if (builtin.os == builtin.Os.zen) {
-        @export("_start", zen_start, strong_linkage);
     } else {
         @export("_start", _start, strong_linkage);
     }
 }
 
-extern fn zen_start() noreturn {
-    std.os.posix.exit(@inlineCall(callMain));
-}
-
 nakedcc fn _start() noreturn {
     switch (builtin.arch) {
         builtin.Arch.x86_64 => {