mirror of
https://github.com/ziglang/zig.git
synced 2025-12-16 11:13:08 +00:00
Get stuff vaguely working
This commit is contained in:
parent
eb1628b033
commit
ba38a6d122
@ -259,22 +259,49 @@ test "" {
|
||||
const WasmPageAllocator = struct {
|
||||
const FreeBlock = struct {
|
||||
offset: usize = 0,
|
||||
data: []u8 = &[_]u8{},
|
||||
packed_data: std.PackedIntSlice(u1) = std.PackedIntSlice(u1).init(&[_]u8{}, 0),
|
||||
|
||||
fn initData(self: *FreeBlock, data: []u8) void {
|
||||
// 0 == used, 1 == free
|
||||
std.mem.set(u8, data, 0);
|
||||
self.data = data;
|
||||
self.packed_data = std.PackedIntSlice(u1).init(data, data.len * 8);
|
||||
}
|
||||
|
||||
fn totalPages(self: FreeBlock) usize {
|
||||
return self.data.len * @typeInfo(usize).Int.bits;
|
||||
return self.packed_data.int_count;
|
||||
}
|
||||
|
||||
// TODO: optimize this terribleness
|
||||
fn alloc(self: *FreeBlock, num_pages: usize) ?[]u8 {
|
||||
var found_idx: usize = 0;
|
||||
var found_size: usize = 0;
|
||||
|
||||
var i: usize = 0;
|
||||
while (i < self.packed_data.int_count) : (i += 1) {
|
||||
if (self.packed_data.get(i) == 0) {
|
||||
found_size = 0;
|
||||
} else {
|
||||
if (found_size == 0) {
|
||||
found_idx = i;
|
||||
}
|
||||
found_size += 1;
|
||||
|
||||
if (found_size >= num_pages) {
|
||||
const page_ptr = @intToPtr([*]u8, (found_idx + self.offset) * std.mem.page_size);
|
||||
return page_ptr[0 .. found_size * std.mem.page_size];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
fn reclaim(self: *FreeBlock, start_page: usize, end_page: usize) void {}
|
||||
fn reclaim(self: *FreeBlock, start_index: usize, end_index: usize) void {
|
||||
var i = start_index - self.offset;
|
||||
while (i < end_index - self.offset) : (i += 1) {
|
||||
std.debug.assert(self.packed_data.get(i) == 0);
|
||||
self.packed_data.set(i, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var conventional = FreeBlock{};
|
||||
@ -321,14 +348,14 @@ const WasmPageAllocator = struct {
|
||||
var free_end = nPages(@ptrToInt(old_mem.ptr) + old_mem.len);
|
||||
|
||||
if (free_end > free_start) {
|
||||
if (conventional.data.len == 0) {
|
||||
if (conventional.totalPages() == 0) {
|
||||
conventional.initData(__heap_base[0..@intCast(usize, @"llvm.wasm.memory.size.i32"(0) * std.mem.page_size)]);
|
||||
}
|
||||
|
||||
if (free_start < conventional.totalPages()) {
|
||||
conventional.reclaim(free_start, free_end);
|
||||
} else {
|
||||
if (extended.data.len == 0) {
|
||||
if (extended.totalPages() == 0) {
|
||||
extended.offset = conventional.totalPages();
|
||||
|
||||
// Steal the last page from the memory currently being reclaimed
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user