Files
zing/src/arena.zig
T

31 lines
837 B
Zig

const physMemory = @import("mem/phys.zig");
const log = @import("debug.zig").log;
const mem = @import("mem.zig");
pub const Arena = struct {
physBase: mem.PhysicalAddress,
capacity: usize,
len: usize,
pub fn setup(cap: usize) ?Arena {
const physBase = physMemory.alloc_pages(cap / mem.vmm.PAGE_SIZE) orelse return null;
return .{
.physBase = physBase,
.capacity = cap,
.len = 0
};
}
pub fn create(self: *@This(), comptime T: type) *T {
if (self.len + @sizeOf(T) > self.capacity) {
log.panic("Out of memory. Cannot allocate {} bytes", .{ @sizeOf(T) });
}
const v = self.physBase.add(self.len).virtualize();
const ptr = @as(*T, @ptrFromInt(v));
self.len += @sizeOf(T);
return ptr;
}
};