authorgravatar for liam@bumblebee.net.nzMovingtoMars <liam@bumblebee.net.nz> 2016-01-28 13:18:29+13:00
committergravatar for liam@bumblebee.net.nzMovingtoMars <liam@bumblebee.net.nz> 2016-01-28 13:18:29+13:00
log04b721d53530c1de825f7d1df93f2e23916e092d
tree42a9058685f1a5eadc87ee588f7994c33c9dbc64
parent1a913f6bf2ac33426f889900b75afa471cc4cee5

malloc fails on proper errors


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

std/mem.zig+21-5
...@@ -1,5 +1,6 @@...@@ -1,5 +1,6 @@
1import "syscall.zig";1import "syscall.zig";
2import "std.zig";2import "std.zig";
3import "errno.zig";
34
4pub fn malloc(bytes: isize) -> ?&u8 {5pub fn malloc(bytes: isize) -> ?&u8 {
5 if (bytes > 4096) {6 if (bytes > 4096) {
...@@ -7,13 +8,28 @@ pub fn malloc(bytes: isize) -> ?&u8 {...@@ -7,13 +8,28 @@ pub fn malloc(bytes: isize) -> ?&u8 {
7 return null;8 return null;
8 }9 }
910
10 const result = mmap(0, 4096, MMAP_PROT_READ|MMAP_PROT_WRITE, MMAP_MAP_ANON|MMAP_MAP_SHARED, -1, 0);11 const result = mmap(isize(0), 4096, MMAP_PROT_READ|MMAP_PROT_WRITE, MMAP_MAP_ANON|MMAP_MAP_SHARED, -1, 0);
1112
12 if (result == -1) {13 const failed: bool = switch (-result) {
13 return null;14 0 => true,
14 }15 EINVAL => true,
16 EACCES => true,
17 EAGAIN => true,
18 EBADF => true,
19 EMFILE => true,
20 ENODEV => true,
21 ENOMEM => true,
22 EOPNOTSUPP => true,
23 ENXIO => true,
24 EOVERFLOW => true,
25 else => false,
26 };
1527
16 (&u8)(result)28 if (failed) {
29 null
30 } else {
31 (&u8)(result)
32 }
17}33}
1834
19pub fn free(ptr: &u8) {35pub fn free(ptr: &u8) {