Skip to documentation
SLOP

tiny.gpalloc.large

Reference tiny.gpalloc large

Defined in tiny.gpalloc.

API (38)

Actions

Public operations.

Types and contracts

Public types and contracts.

Namespaces

Public namespaces.

Values and defaults

Public values and defaults.

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

Source

Source: lib/gpalloc/src/large/cache.zig:12

zig
pub const Cache = struct {    bins: [model.class_count]Bin = @as([model.class_count]Bin, @splat(.{})),    cached_bytes: usize = 0,    eviction_cursor: usize = 0,    pub fn pop(self: *Cache, class: Class) ?[*]u8 {        const ptr = self.bins[class.index].pop() orelse return null;        self.cached_bytes -= class.size;        return ptr;    }    pub fn popAtLeast(self: *Cache, class: Class) ?Entry {        const end_index = if (class.index < model.small_class_count)            model.small_class_count        else            self.bins.len;        var index = class.index;        while (index < end_index) : (index += 1) {            const cached_class = class_policy.classForIndex(index);            const ptr = self.pop(cached_class) orelse continue;            return .{ .class = cached_class, .ptr = ptr };        }        return null;    }    pub fn push(        self: *Cache,        class: Class,        ptr: [*]u8,        byte_limit: usize,        allocator: Allocator,        ret_addr: usize,    ) bool {        if (class.size > byte_limit) return false;        if (self.bins[class.index].count >= model.bin_capacity) return false;        while (self.cached_bytes + class.size > byte_limit) {            if (!self.evictOne(allocator, ret_addr)) return false;        }        if (!self.bins[class.index].push(ptr, model.bin_capacity)) return false;        self.cached_bytes += class.size;        return true;    }    pub fn destroyAll(self: *Cache, allocator: Allocator, ret_addr: usize) void {        for (&self.bins, 0..) |*bin, index| {            const class_size = class_policy.sizeForIndex(index);            while (bin.pop()) |ptr| {                allocator.rawFree(ptr[0..class_policy.backingSizeForClassSize(class_size)], model.alignment, ret_addr);            }        }        self.cached_bytes = 0;        self.eviction_cursor = 0;    }    fn evictOne(self: *Cache, allocator: Allocator, ret_addr: usize) bool {        var offset: usize = 0;        while (offset < self.bins.len) : (offset += 1) {            const index = (self.eviction_cursor + offset) % self.bins.len;            const class_size = class_policy.sizeForIndex(index);            const ptr = self.bins[index].pop() orelse continue;            self.cached_bytes -= class_size;            self.eviction_cursor = (index + 1) % self.bins.len;            allocator.rawFree(                ptr[0..class_policy.backingSizeForClassSize(class_size)],                model.alignment,                ret_addr,            );            return true;        }        return false;    }};

Source: lib/gpalloc/src/large/medium/cache.zig:11

zig
pub const Cache = struct {    bins: [model.medium_class_count]Bin = @as([model.medium_class_count]Bin, @splat(.{})),    cached_bytes: usize = 0,    eviction_cursor: usize = 0,    pub fn pop(self: *Cache, class: Class) ?[*]u8 {        const ptr = self.bins[class.index].pop() orelse return null;        self.cached_bytes -= class.size;        return ptr;    }    pub fn popAtLeast(self: *Cache, class: Class) ?Entry {        var index = class.index;        while (index < self.bins.len) : (index += 1) {            const cached_class = class_policy.classForIndex(index);            const ptr = self.pop(cached_class) orelse continue;            return .{ .class = cached_class, .ptr = ptr };        }        return null;    }    pub fn push(        self: *Cache,        class: Class,        ptr: [*]u8,        byte_limit: usize,        allocator: Allocator,        ret_addr: usize,    ) bool {        if (class.size > byte_limit) return false;        if (self.bins[class.index].count >= model.bin_capacity) return false;        while (self.cached_bytes + class.size > byte_limit) {            if (!self.evictOne(allocator, ret_addr)) return false;        }        if (!self.bins[class.index].push(ptr, model.bin_capacity)) return false;        self.cached_bytes += class.size;        return true;    }    pub fn destroyAll(self: *Cache, allocator: Allocator, ret_addr: usize) void {        for (&self.bins, 0..) |*bin, index| {            const class_size = class_policy.sizeForIndex(index);            while (bin.pop()) |ptr| {                allocator.rawFree(                    ptr[0..class_policy.backingSizeForClassSize(class_size)],                    model.alignment,                    ret_addr,                );            }        }        self.cached_bytes = 0;        self.eviction_cursor = 0;    }    fn evictOne(self: *Cache, allocator: Allocator, ret_addr: usize) bool {        var offset: usize = 0;        while (offset < self.bins.len) : (offset += 1) {            const index = (self.eviction_cursor + offset) % self.bins.len;            const class_size = class_policy.sizeForIndex(index);            const ptr = self.bins[index].pop() orelse continue;            self.cached_bytes -= class_size;            self.eviction_cursor = (index + 1) % self.bins.len;            allocator.rawFree(                ptr[0..class_policy.backingSizeForClassSize(class_size)],                model.alignment,                ret_addr,            );            return true;        }        return false;    }};
Called byCallsNo direct callersprivate sourcelib.deadalloc.src.allocatorrawFreelarge.CachedestroyAll
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callslarge.CachepopAtLeasttest sourcelib.gpalloc.src.large.cachetest: large cache admits newer classe...large.Cachepop
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.gpalloc.src.large.cachetest: large cache can reuse a larger ...test sourcelib.gpalloc.src.large.cachetest: large cache does not reuse huge...test sourcelib.gpalloc.src.large.cachetest: large cache reuses multi-megaby...large.Cachepoplarge.CachepopAtLeast
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallstest sourcelib.gpalloc.src.large.cachetest: large cache admits newer classe...test sourcelib.gpalloc.src.large.cachetest: large cache can reuse a larger ...test sourcelib.gpalloc.src.large.cachetest: large cache does not reuse huge...test sourcelib.gpalloc.src.large.cachetest: large cache reuses multi-megaby...private sourcelib.gpalloc.src.large.cache.CacheevictOnelarge.Cachepush
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/gpalloc/src/large/class.zig:36

zig
pub fn backingSize(class: Class) usize {    return backingSizeForClassSize(class.size);}
Called byCallsNo direct callersprivate sourcelib.gpalloc.src.large.classbackingSizeForClassSizelargebackingSize
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/gpalloc/src/large/class.zig:8

zig
pub fn classFor(len: usize, requested_alignment: Alignment) ?Class {    if (requested_alignment.toByteUnits() > size_class.min_alignment) return null;    if (len > size_class.max_small_size and len <= model.max_small_cached_size) {        const class_size = std.mem.alignForward(usize, len, model.class_step);        if (class_size < model.min_cached_size or class_size > model.max_small_cached_size) return null;        return .{            .index = (class_size - model.min_cached_size) / model.class_step,            .size = class_size,        };    }    if (len >= model.min_huge_cached_size and len <= model.max_cached_size) {        const class_size = std.mem.alignForward(usize, len, model.huge_class_step);        if (class_size < model.min_huge_cached_size or class_size > model.max_cached_size) return null;        return .{            .index = model.small_class_count + (class_size - model.min_huge_cached_size) / model.huge_class_step,            .size = class_size,        };    }    return null;}
Called byCallsNo direct callstest sourcelib.gpalloc.src.large.classtest: large cache leaves medium page-...largeclassFor
Static calls · unresolved targets: 0 · external targets: 1.

Source: lib/gpalloc/src/large/class.zig:29

zig
pub fn classForIndex(index: usize) Class {    return .{        .index = index,        .size = sizeForIndex(index),    };}
Called byCallsNo direct callersprivate sourcelib.gpalloc.src.large.classsizeForIndexlargeclassForIndex
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/gpalloc/src/large/header.zig:28

zig
pub fn baseFromUserPointer(ptr: [*]u8) [*]u8 {    return ptr - model.header_size;}

Source: lib/gpalloc/src/large/header.zig:22

zig
pub fn classFromHeader(header: *const Header) ?Class {    if (header.magic != model.header_magic) return null;    if (header.class_index >= model.class_count) return null;    return class_policy.classForIndex(header.class_index);}
Called byCallsNo direct callstest sourcelib.gpalloc.src.large.headertest: large cache header stores only ...largeclassFromHeader
Static calls · unresolved targets: 0 · external targets: 1.

Source: lib/gpalloc/src/large/header.zig:18

zig
pub fn headerFromUserPointer(ptr: [*]u8) *Header {    return @ptrCast(@alignCast(ptr - model.header_size));}
Called byCallsNo direct callstest sourcelib.gpalloc.src.large.headertest: large cache header stores only ...largeheaderFromUserPointer
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/gpalloc/src/large/header.zig:9

zig
pub fn initializeHeader(base: [*]u8, class: Class) [*]u8 {    const header: *Header = @ptrCast(@alignCast(base));    header.* = .{        .magic = model.header_magic,        .class_index = class.index,    };    return base + model.header_size;}
Called byCallsNo direct callstest sourcelib.gpalloc.src.large.headertest: large cache header stores only ...largeinitializeHeader
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.gpalloc.src.large.medium.cachetest: medium cache can reuse a larger...test sourcelib.gpalloc.src.large.medium.cachetest: medium cache reuses medium clas...private sourcelib.deadalloc.src.allocatorrawFreelarge.MediumCachedestroyAll
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callslarge.MediumCachepopAtLeastlarge.MediumCachepop
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.gpalloc.src.large.medium.cachetest: medium cache can reuse a larger...test sourcelib.gpalloc.src.large.medium.cachetest: medium cache reuses medium clas...large.MediumCachepoplarge.MediumCachepopAtLeast
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallstest sourcelib.gpalloc.src.large.medium.cachetest: medium cache can reuse a larger...test sourcelib.gpalloc.src.large.medium.cachetest: medium cache reuses medium clas...private sourcelib.gpalloc.src.large.medium.cache.CacheevictOnelarge.MediumCachepush
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/gpalloc/src/large/medium/class.zig:19

zig
pub fn backingSize(class: Class) usize {    return backingSizeForClassSize(class.size);}
Called byCallsNo direct callersprivate sourcelib.gpalloc.src.large.medium.classbackingSizeForClassSizelargemediumBackingSize
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/gpalloc/src/large/medium/class.zig:8

zig
pub fn classFor(len: usize, requested_alignment: Alignment) ?Class {    if (requested_alignment.toByteUnits() > size_class.min_alignment) return null;    if (len <= model.max_small_cached_size or len > model.max_medium_cached_size) return null;    const class_size = std.mem.alignForward(usize, len, model.medium_class_step);    if (class_size < model.min_medium_cached_size or class_size > model.max_medium_cached_size) return null;    return .{        .index = (class_size - model.min_medium_cached_size) / model.medium_class_step,        .size = class_size,    };}
Called byCallsNo direct callstest sourcelib.gpalloc.src.large.medium.classtest: medium cache classes cover Barn...largemediumClassFor
Static calls · unresolved targets: 0 · external targets: 1.

Source: lib/gpalloc/src/large/medium/header.zig:26

zig
pub fn baseFromUserPointer(ptr: [*]u8) [*]u8 {    return ptr - model.header_size;}

Source: lib/gpalloc/src/large/medium/header.zig:20

zig
pub fn classFromHeader(header: *const Header) ?Class {    if (header.magic != model.medium_header_magic) return null;    if (header.class_index >= model.medium_class_count) return null;    return class_policy.classForIndex(header.class_index);}

Source: lib/gpalloc/src/large/medium/header.zig:16

zig
pub fn headerFromUserPointer(ptr: [*]u8) *Header {    return @ptrCast(@alignCast(ptr - model.header_size));}

Source: lib/gpalloc/src/large/medium/header.zig:7

zig
pub fn initializeHeader(base: [*]u8, class: Class) [*]u8 {    const header: *Header = @ptrCast(@alignCast(base));    header.* = .{        .magic = model.medium_header_magic,        .class_index = class.index,    };    return base + model.header_size;}

Source: lib/gpalloc/src/large/root.zig

zig
const cache = @import("cache.zig");const class = @import("class.zig");const header = @import("header.zig");const medium = @import("medium/root.zig");pub const model = @import("model.zig");pub const class_step = model.class_step;pub const max_small_cached_size = model.max_small_cached_size;pub const huge_class_step = model.huge_class_step;pub const min_huge_cached_size = model.min_huge_cached_size;pub const max_cached_size = model.max_cached_size;pub const medium_class_step = model.medium_class_step;pub const min_medium_cached_size = model.min_medium_cached_size;pub const max_medium_cached_size = model.max_medium_cached_size;pub const medium_default_limit_bytes = model.medium_default_limit_bytes;pub const alignment = model.alignment;pub const Class = model.Class;pub const Entry = model.Entry;pub const Header = model.Header;pub const header_size = model.header_size;pub const Cache = cache.Cache;pub const MediumCache = medium.Cache;pub const backingSize = class.backingSize;pub const baseFromUserPointer = header.baseFromUserPointer;pub const classFor = class.classFor;pub const classForIndex = class.classForIndex;pub const classFromHeader = header.classFromHeader;pub const headerFromUserPointer = header.headerFromUserPointer;pub const initializeHeader = header.initializeHeader;pub const initializeMediumHeader = medium.initializeHeader;pub const mediumBackingSize = medium.backingSize;pub const mediumBaseFromUserPointer = medium.baseFromUserPointer;pub const mediumClassFor = medium.classFor;pub const mediumClassFromHeader = medium.classFromHeader;pub const mediumHeaderFromUserPointer = medium.headerFromUserPointer;

Source: lib/gpalloc/src/root.zig:41

zig
pub const large = @import("large/root.zig");

Audit

Definitions24
Public names24
Members6
Version26.7.0
Revisiondaab053ee433