authorgravatar for contact@fengb.meBenjamin Feng <contact@fengb.me> 2019-12-03 17:41:05-06:00
committergravatar for contact@fengb.meBenjamin Feng <contact@fengb.me> 2019-12-04 00:07:52-06:00
logbaffaf7986d34b47580819eb70b66a5311556046
treea7782c39cedc4d805e0b8508fc48582721cf8f72
parentb33211ed51901bfbc36d23cb5a02d1c8ca3b072e

Extract setBits


1 files changed, 12 insertions(+), 12 deletions(-)

lib/std/heap.zig+12-12
...@@ -272,6 +272,13 @@ const WasmPageAllocator = struct {...@@ -272,6 +272,13 @@ const WasmPageAllocator = struct {
272 return self.packed_data.int_count;272 return self.packed_data.int_count;
273 }273 }
274274
275 fn setBits(self: *FreeBlock, start_idx: usize, len: usize, val: u1) void {
276 var i: usize = 0;
277 while (i < len) : (i += 1) {
278 self.packed_data.set(i + start_idx + self.offset, val);
279 }
280 }
281
275 fn useRecycled(self: *FreeBlock, num_pages: usize) ?[*]u8 {282 fn useRecycled(self: *FreeBlock, num_pages: usize) ?[*]u8 {
276 var found_idx: usize = 0;283 var found_idx: usize = 0;
277 var found_size: usize = 0;284 var found_size: usize = 0;
...@@ -296,10 +303,7 @@ const WasmPageAllocator = struct {...@@ -296,10 +303,7 @@ const WasmPageAllocator = struct {
296 found_size += 1;303 found_size += 1;
297304
298 if (found_size >= num_pages) {305 if (found_size >= num_pages) {
299 while (found_size > 0) {306 self.setBits(found_idx, found_size, 0);
300 found_size -= 1;
301 self.packed_data.set(found_idx + found_size, 0);
302 }
303 return @intToPtr([*]u8, (found_idx + self.offset) * std.mem.page_size);307 return @intToPtr([*]u8, (found_idx + self.offset) * std.mem.page_size);
304 }308 }
305 }309 }
...@@ -308,12 +312,8 @@ const WasmPageAllocator = struct {...@@ -308,12 +312,8 @@ const WasmPageAllocator = struct {
308 return null;312 return null;
309 }313 }
310314
311 fn recycle(self: *FreeBlock, start_index: usize, end_index: usize) void {315 fn recycle(self: *FreeBlock, start_idx: usize, len: usize) void {
312 var i = start_index - self.offset;316 self.setBits(start_idx, len, 1);
313 while (i < end_index - self.offset) : (i += 1) {
314 std.debug.assert(self.packed_data.get(i) == 0);
315 self.packed_data.set(i, 1);
316 }
317 }317 }
318 };318 };
319319
...@@ -369,7 +369,7 @@ const WasmPageAllocator = struct {...@@ -369,7 +369,7 @@ const WasmPageAllocator = struct {
369 }369 }
370370
371 if (free_start < conventional.totalPages()) {371 if (free_start < conventional.totalPages()) {
372 conventional.recycle(free_start, free_end);372 conventional.recycle(free_start, free_end - free_start);
373 } else {373 } else {
374 if (extended.totalPages() == 0) {374 if (extended.totalPages() == 0) {
375 extended.offset = conventional.offset + conventional.totalPages();375 extended.offset = conventional.offset + conventional.totalPages();
...@@ -378,7 +378,7 @@ const WasmPageAllocator = struct {...@@ -378,7 +378,7 @@ const WasmPageAllocator = struct {
378 free_end -= 1;378 free_end -= 1;
379 extended.initData(@intToPtr([*]align(16) u8, free_end * std.mem.page_size)[0..std.mem.page_size]);379 extended.initData(@intToPtr([*]align(16) u8, free_end * std.mem.page_size)[0..std.mem.page_size]);
380 }380 }
381 extended.recycle(free_start, free_end);381 extended.recycle(free_start, free_end - free_start);
382 }382 }
383 }383 }
384384