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 }