tiny.gpalloc.page
Defined in tiny.gpalloc.
API (18)
Actions
Public operations.
Page.allocatePage.allocationSlicePage.blockPtrPage.discardableSlicePage.freePage.initPage.mappedBytesPage.mappingSlicecreateFromBackingcreateFromOsdestroyFromOsdestroyInBackingdiscardUnusedfromBlockrestoreDiscarded
Types and contracts
Public types and contracts.
Values and defaults
Public values and defaults.
Source
Source: lib/gpalloc/src/page/model.zig:10
zig
pub const FreeNode = extern struct { next: ?*FreeNode,};Source: lib/gpalloc/src/page/model.zig:14
zig
pub const Page = struct { magic: u64, class_index: u16, block_size: u32, capacity: u16, live_count: u16, free_count: u16, next_unallocated: u16, block_area_offset: u16, mapping_base: [*]align(std.heap.page_size_min) u8, mapping_len: usize, discarded: bool, discarded_bytes: u32, free_list: ?*FreeNode, next_all: ?*Page, previous_all: ?*Page, next_partial: ?*Page, next_cached: ?*Page, pub fn init( page: *Page, class_index: usize, mapping_base: [*]align(std.heap.page_size_min) u8, mapping_len: usize, ) void { const block_size = size_class.size(class_index); const block_alignment = size_class.blockAlignment(block_size); const block_area_offset = std.mem.alignForward(usize, @sizeOf(Page), block_alignment); const capacity = (page_size - block_area_offset) / block_size; assert(capacity > 0); assert(capacity <= std.math.maxInt(u16)); page.* = .{ .magic = magic, .class_index = @intCast(class_index), .block_size = @intCast(block_size), .capacity = @intCast(capacity), .live_count = 0, .free_count = @intCast(capacity), .next_unallocated = 0, .block_area_offset = @intCast(block_area_offset), .mapping_base = mapping_base, .mapping_len = mapping_len, .discarded = false, .discarded_bytes = 0, .free_list = null, .next_all = null, .previous_all = null, .next_partial = null, .next_cached = null, }; } pub fn blockPtr(page: *Page, index: usize) [*]u8 { return page.blockArea() + index * page.block_size; } fn blockArea(page: *Page) [*]u8 { return @as([*]u8, @ptrCast(page)) + page.block_area_offset; } pub fn allocationSlice(page: *Page) []u8 { return @as([*]u8, @ptrCast(page))[0..page_size]; } pub fn mappingSlice(page: *Page) []align(std.heap.page_size_min) u8 { return page.mapping_base[0..page.mapping_len]; } pub fn mappedBytes(page: *Page) usize { return page.mapping_len; } pub fn discardableSlice(page: *Page) ?[]align(std.heap.page_size_min) u8 { const start_offset = std.mem.alignForward(usize, page.block_area_offset, std.heap.page_size_min); if (start_offset >= page_size) return null; const start_addr = @intFromPtr(page) + start_offset; const ptr: [*]align(std.heap.page_size_min) u8 = @ptrFromInt(start_addr); return ptr[0 .. page_size - start_offset]; } pub fn allocate(page: *Page) [*]u8 { const ptr = if (page.free_list) |node| blk: { page.free_list = node.next; break :blk @as([*]u8, @ptrCast(node)); } else blk: { assert(page.next_unallocated < page.capacity); const block = page.blockPtr(page.next_unallocated); page.next_unallocated += 1; break :blk block; }; page.free_count -= 1; page.live_count += 1; return ptr; } pub fn free(page: *Page, ptr: [*]u8) void { assert(page.magic == magic); assert(page.live_count > 0); const node: *FreeNode = @ptrCast(@alignCast(ptr)); node.* = .{ .next = page.free_list }; page.free_list = node; page.free_count += 1; page.live_count -= 1; }};Source: lib/gpalloc/src/page/lifecycle.zig:9
zig
pub fn discardUnused(page: *Page) ?usize { if (page.discarded) return null; const discardable = page.discardableSlice() orelse return null; if (discardable.len == 0) return null; sys.memory.discard(discardable) catch return null; page.discarded = true; page.discarded_bytes = @intCast(discardable.len); page.free_list = null; page.next_unallocated = 0; return discardable.len;}Source: lib/gpalloc/src/page/lifecycle.zig:21
zig
pub fn restoreDiscarded(page: *Page) ?usize { if (!page.discarded) return null; const discarded_bytes: usize = @intCast(page.discarded_bytes); page.free_list = null; page.next_unallocated = 0; page.discarded = false; page.discarded_bytes = 0; return discarded_bytes;}Source: lib/gpalloc/src/page/mapping.zig:10
zig
pub fn createFromBacking(backing_allocator: Allocator, class_index: usize, ret_addr: usize) ?*Page { const memory = backing_allocator.rawAlloc(page_size, .fromByteUnits(page_size), ret_addr) orelse return null; const page: *Page = @ptrCast(@alignCast(memory)); Page.init(page, class_index, @ptrCast(@alignCast(memory)), page_size); return page;}Source: lib/gpalloc/src/page/mapping.zig:22
zig
pub fn createFromOs(class_index: usize) ?*Page { const mapping = sys.memory.mapAnonymous(page_size * 2, .{ .read = true, .write = true }) catch return null; const mapping_addr = @intFromPtr(mapping.ptr); const page_addr = std.mem.alignForward(usize, mapping_addr, page_size); const page_offset = page_addr - mapping_addr; const page_end = page_offset + page_size; std.debug.assert(page_end <= mapping.len); if (page_offset > 0) sys.memory.unmap(mapping[0..page_offset]); if (page_end < mapping.len) { const suffix: [*]align(std.heap.page_size_min) u8 = @ptrFromInt(mapping_addr + page_end); sys.memory.unmap(suffix[0 .. mapping.len - page_end]); } const page: *Page = @ptrFromInt(page_addr); const page_mapping: [*]align(std.heap.page_size_min) u8 = @ptrFromInt(page_addr); Page.init(page, class_index, page_mapping, page_size); return page;}Source: lib/gpalloc/src/page/mapping.zig:42
zig
pub fn destroyFromOs(page: *Page) void { const mapping = page.mappingSlice(); page.magic = 0; sys.memory.unmap(mapping);}Source: lib/gpalloc/src/page/mapping.zig:17
zig
pub fn destroyInBacking(backing_allocator: Allocator, page: *Page, ret_addr: usize) void { page.magic = 0; backing_allocator.rawFree(page.allocationSlice(), .fromByteUnits(page_size), ret_addr);}Source: lib/gpalloc/src/page/mapping.zig:48
zig
pub fn fromBlock(ptr: [*]u8) *Page { const page_addr = std.mem.alignBackward(usize, @intFromPtr(ptr), page_size); return @ptrFromInt(page_addr);}Source: lib/gpalloc/src/page/model.zig:8
zig
pub const magic: u64 = 0x5441_4c4c_4f43_0001;Source: lib/gpalloc/src/page/root.zig
zig
const lifecycle = @import("lifecycle.zig");const mapping = @import("mapping.zig");const model = @import("model.zig");pub const magic = model.magic;pub const FreeNode = model.FreeNode;pub const Page = model.Page;pub const createFromBacking = mapping.createFromBacking;pub const createFromOs = mapping.createFromOs;pub const destroyFromOs = mapping.destroyFromOs;pub const destroyInBacking = mapping.destroyInBacking;pub const discardUnused = lifecycle.discardUnused;pub const fromBlock = mapping.fromBlock;pub const restoreDiscarded = lifecycle.restoreDiscarded;Source: lib/gpalloc/src/root.zig:42
zig
pub const page = @import("page/root.zig");Audit
| Definitions | 19 |
|---|---|
| Public names | 19 |
| Members | 18 |
| Version | 26.7.0 |
| Revision | daab053ee433 |