authorgravatar for benjamin.feng@glassdoor.comBenjamin Feng <benjamin.feng@glassdoor.com> 2019-12-05 18:28:32-06:00
committergravatar for benjamin.feng@glassdoor.comBenjamin Feng <benjamin.feng@glassdoor.com> 2019-12-05 18:43:51-06:00
log694616adb549fc0dc2d7416e120e17992087e75c
tree3df61ab7d9c62d7aa5de0c23d547d1aab9322a52
parent7d1c4fe4dcb6188d2af0f65bf713aca8d326ea46

Standardize around bigger slices


1 files changed, 14 insertions(+), 23 deletions(-)

lib/std/heap.zig+14-23
......@@ -246,16 +246,12 @@ const PageAllocator = struct {
246246 }
247247};
248248
249extern const __heap_base: [*]u8;
250249// TODO Exposed LLVM intrinsics is a bug
251250// See: https://github.com/ziglang/zig/issues/2291
252251extern fn @"llvm.wasm.memory.size.i32"(u32) u32;
253252extern fn @"llvm.wasm.memory.grow.i32"(u32, u32) i32;
254253
255254const WasmPageAllocator = struct {
256 // TODO: figure out why __heap_base cannot be found
257 var heap_base_wannabe align(16) = [_]u8{0} ** 256;
258
259255 const PageStatus = enum(u1) {
260256 used = 0,
261257 free = 1,
......@@ -264,24 +260,24 @@ const WasmPageAllocator = struct {
264260 };
265261
266262 const FreeBlock = struct {
267 bytes: []align(16) u8,
263 data: []u128,
268264
269265 const Io = std.packed_int_array.PackedIntIo(u1, .Little);
270266
271267 fn totalPages(self: FreeBlock) usize {
272 return self.bytes.len * 8;
268 return self.data.len * 8;
273269 }
274270
275 fn getBit(self: *FreeBlock, idx: usize) PageStatus {
271 fn getBit(self: FreeBlock, idx: usize) PageStatus {
276272 const bit_offset = 0;
277 return @intToEnum(PageStatus, Io.get(self.bytes, idx, bit_offset));
273 return @intToEnum(PageStatus, Io.get(@sliceToBytes(self.data), idx, bit_offset));
278274 }
279275
280 fn setBits(self: *FreeBlock, start_idx: usize, len: usize, val: PageStatus) void {
276 fn setBits(self: FreeBlock, start_idx: usize, len: usize, val: PageStatus) void {
281277 const bit_offset = 0;
282278 var i: usize = 0;
283279 while (i < len) : (i += 1) {
284 Io.set(self.bytes, start_idx + i, bit_offset, @enumToInt(val));
280 Io.set(@sliceToBytes(self.data), start_idx + i, bit_offset, @enumToInt(val));
285281 }
286282 }
287283
......@@ -294,10 +290,9 @@ const WasmPageAllocator = struct {
294290 // Revisit if this is settled: https://github.com/ziglang/zig/issues/3806
295291 const not_found = std.math.maxInt(usize);
296292
297 fn useRecycled(self: *FreeBlock, num_pages: usize) usize {
293 fn useRecycled(self: FreeBlock, num_pages: usize) usize {
298294 @setCold(true);
299 const segments = @bytesToSlice(u128, self.bytes);
300 for (segments) |segment, i| {
295 for (self.data) |segment, i| {
301296 const spills_into_next = @bitCast(i128, segment) < 0;
302297 const has_enough_bits = @popCount(u128, segment) >= num_pages;
303298
......@@ -319,13 +314,13 @@ const WasmPageAllocator = struct {
319314 return not_found;
320315 }
321316
322 fn recycle(self: *FreeBlock, start_idx: usize, len: usize) void {
317 fn recycle(self: FreeBlock, start_idx: usize, len: usize) void {
323318 self.setBits(start_idx, len, .free);
324319 }
325320 };
326321
327 var conventional = FreeBlock{ .bytes = &[_]u8{} };
328 var extended = FreeBlock{ .bytes = &[_]u8{} };
322 const conventional = FreeBlock{ .data = &[_]u128{ 0, 0 } };
323 var extended = FreeBlock{ .data = &[_]u128{} };
329324
330325 fn extendedOffset() usize {
331326 return conventional.totalPages();
......@@ -373,15 +368,11 @@ const WasmPageAllocator = struct {
373368 }
374369
375370 pub fn shrink(allocator: *Allocator, old_mem: []u8, old_align: u29, new_size: usize, new_align: u29) []u8 {
371 @setCold(true);
376372 const free_start = nPages(@ptrToInt(old_mem.ptr) + new_size);
377373 var free_end = nPages(@ptrToInt(old_mem.ptr) + old_mem.len);
378374
379375 if (free_end > free_start) {
380 if (conventional.totalPages() == 0) {
381 //conventional.bytes = __heap_base[0..@intCast(usize, @"llvm.wasm.memory.size.i32"(0) * std.mem.page_size)];
382 conventional.bytes = heap_base_wannabe[0..];
383 }
384
385376 if (free_start < extendedOffset()) {
386377 const clamped_end = std.math.min(extendedOffset(), free_end);
387378 conventional.recycle(free_start, clamped_end - free_start);
......@@ -393,9 +384,9 @@ const WasmPageAllocator = struct {
393384 // TODO: would it be better if we use the first page instead?
394385 free_end -= 1;
395386
396 extended.bytes = @intToPtr([*]align(16) u8, free_end * std.mem.page_size)[0..std.mem.page_size];
387 extended.data = @intToPtr([*]u128, free_end * std.mem.page_size)[0 .. std.mem.page_size / @sizeOf(u128)];
397388 // Since this is the first page being freed and we consume it, assume *nothing* is free.
398 std.mem.set(u8, extended.bytes, PageStatus.all_used);
389 std.mem.set(u128, extended.data, PageStatus.all_used);
399390 }
400391 const clamped_start = std.math.max(extendedOffset(), free_start);
401392 extended.recycle(clamped_start - extendedOffset(), free_end - clamped_start);