Skip to documentation
SLOP

tiny.gpalloc.page

Reference tiny.gpalloc page

Defined in tiny.gpalloc.

API (18)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callstiny.gpallocpage
Static calls · unresolved targets: unknown · external targets: unknown.

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;}
Called byCallsNo direct callstest sourcelib.gpalloc.src.page.lifecycletest: discard reports nothing when pa...pagediscardUnused
Static calls · unresolved targets: 0 · external targets: 2.

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;}
Called byCallsNo direct callstest sourcelib.gpalloc.src.page.lifecycletest: discard reports nothing when pa...pagerestoreDiscarded
Static calls · unresolved targets: 0 · external targets: 0.

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;}
Called byCallsNo direct callerspage.PageinitpagecreateFromBacking
Static calls · unresolved targets: 0 · external targets: 1.

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;}
Called byCallsNo direct callerspage.PageinitpagecreateFromOs
Static calls · unresolved targets: 1 · external targets: 2.

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);}
Called byCallsNo direct callstest sourcelib.gpalloc.src.page.modeltest: page allocation materializes un...page.Pageallocate
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callstest sourcelib.gpalloc.src.page.modeltest: page allocation materializes un...page.PageblockPtr
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callstest sourcelib.gpalloc.src.page.modeltest: page allocation materializes un...page.Pagefree
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.gpalloc.src.allocator.GpAllocatorpopCachedEmptyPagetest sourcelib.gpalloc.src.page.lifecycletest: discard reports nothing when pa...pagecreateFromBackingpagecreateFromOstest sourcelib.gpalloc.src.page.modeltest: page allocation materializes un...page.Pageinit
Static calls · unresolved targets: 1 · external targets: 2.

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

Definitions19
Public names19
Members18
Version26.7.0
Revisiondaab053ee433