lib/gpalloc/src/page/lifecycle.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const config = @import("../root.zig").config;
 3 const sys = @import("sys");
 4 const model = @import("model.zig");
 5 
 6 const Page = model.Page;
 7 const page_size = config.page_size;
 8 
 9 pub fn discardUnused(page: *Page) ?usize {
10     if (page.discarded) return null;
11     const discardable = page.discardableSlice() orelse return null;
12     if (discardable.len == 0) return null;
13     sys.memory.discard(discardable) catch return null;
14     page.discarded = true;
15     page.discarded_bytes = @intCast(discardable.len);
16     page.free_list = null;
17     page.next_unallocated = 0;
18     return discardable.len;
19 }
20 
21 pub fn restoreDiscarded(page: *Page) ?usize {
22     if (!page.discarded) return null;
23     const discarded_bytes: usize = @intCast(page.discarded_bytes);
24     page.free_list = null;
25     page.next_unallocated = 0;
26     page.discarded = false;
27     page.discarded_bytes = 0;
28     return discarded_bytes;
29 }
30 
31 test {
32     std.testing.refAllDecls(@This());
33 }
34 
35 test "discard reports nothing when page has no discardable bytes" {
36     var page: Page = undefined;
37     Page.init(&page, 0, undefined, page_size);
38     page.block_area_offset = page_size - 1;
39 
40     try std.testing.expectEqual(@as(?usize, null), discardUnused(&page));
41     try std.testing.expectEqual(@as(?usize, null), restoreDiscarded(&page));
42 }