From 09c0cf2dcf30774852dddfbd703cb40387f400e5 Mon Sep 17 00:00:00 2001 From: Marc Tiehuis Date: Wed, 18 Oct 2017 01:13:04 +1300 Subject: [PATCH] Add c allocator (#542) --- std/c/index.zig | 4 ++++ std/mem.zig | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/std/c/index.zig b/std/c/index.zig index 9e33ed2196..62ca99d1bb 100644 --- a/std/c/index.zig +++ b/std/c/index.zig @@ -43,3 +43,7 @@ pub extern "c" fn sigaction(sig: c_int, noalias act: &const Sigaction, noalias o pub extern "c" fn nanosleep(rqtp: &const timespec, rmtp: ?×pec) -> c_int; pub extern "c" fn setreuid(ruid: c_uint, euid: c_uint) -> c_int; pub extern "c" fn setregid(rgid: c_uint, egid: c_uint) -> c_int; + +pub extern "c" fn malloc(usize) -> ?&c_void; +pub extern "c" fn realloc(&c_void, usize) -> ?&c_void; +pub extern "c" fn free(&c_void); diff --git a/std/mem.zig b/std/mem.zig index 2b8f74b60c..6f4a1e16e0 100644 --- a/std/mem.zig +++ b/std/mem.zig @@ -5,6 +5,7 @@ const os = @import("os/index.zig"); const io = @import("io.zig"); const builtin = @import("builtin"); const Os = builtin.Os; +const c = @import("c/index.zig"); pub const Cmp = math.Cmp; @@ -84,6 +85,38 @@ pub const Allocator = struct { } }; +pub var c_allocator = Allocator { + .allocFn = cAlloc, + .reallocFn = cRealloc, + .freeFn = cFree, +}; + +fn cAlloc(self: &Allocator, n: usize, alignment: usize) -> %[]u8 { + if (c.malloc(usize(n))) |mem| { + @ptrCast(&u8, mem)[0..n] + } else { + error.OutOfMemory + } +} + +fn cRealloc(self: &Allocator, old_mem: []u8, new_size: usize, alignment: usize) -> %[]u8 { + if (new_size <= old_mem.len) { + old_mem[0..new_size] + } else { + const old_ptr = @ptrCast(&c_void, old_mem.ptr); + if (c.realloc(old_ptr, usize(new_size))) |mem| { + @ptrCast(&u8, mem)[0..new_size] + } else { + error.OutOfMemory + } + } +} + +fn cFree(self: &Allocator, old_mem: []u8) { + const old_ptr = @ptrCast(&c_void, old_mem.ptr); + c.free(old_ptr); +} + pub const IncrementingAllocator = struct { allocator: Allocator, bytes: []u8,