tiny.gpalloc.large
Defined in tiny.gpalloc.
API (38)
Actions
Public operations.
Cache.destroyAllCache.popCache.popAtLeastCache.pushMediumCache.destroyAllMediumCache.popMediumCache.popAtLeastMediumCache.pushbackingSizebaseFromUserPointerclassForclassForIndexclassFromHeaderheaderFromUserPointerinitializeHeaderinitializeMediumHeadermediumBackingSizemediumBaseFromUserPointermediumClassFormediumClassFromHeadermediumHeaderFromUserPointer
Types and contracts
Public types and contracts.
Namespaces
Public namespaces.
Values and defaults
Public values and defaults.
alignmentclass_stepheader_sizehuge_class_stepmax_cached_sizemax_medium_cached_sizemax_small_cached_sizemedium_class_stepmedium_default_limit_bytesmin_huge_cached_sizemin_medium_cached_size
Source
Source: lib/gpalloc/src/large/cache.zig:12
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
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; }};Source: lib/gpalloc/src/large/class.zig:36
pub fn backingSize(class: Class) usize { return backingSizeForClassSize(class.size);}Source: lib/gpalloc/src/large/class.zig:8
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;}Source: lib/gpalloc/src/large/class.zig:29
pub fn classForIndex(index: usize) Class { return .{ .index = index, .size = sizeForIndex(index), };}Source: lib/gpalloc/src/large/header.zig:28
pub fn baseFromUserPointer(ptr: [*]u8) [*]u8 { return ptr - model.header_size;}Source: lib/gpalloc/src/large/header.zig:22
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);}Source: lib/gpalloc/src/large/header.zig:18
pub fn headerFromUserPointer(ptr: [*]u8) *Header { return @ptrCast(@alignCast(ptr - model.header_size));}Source: lib/gpalloc/src/large/header.zig:9
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;}Source: lib/gpalloc/src/large/medium/class.zig:19
pub fn backingSize(class: Class) usize { return backingSizeForClassSize(class.size);}Source: lib/gpalloc/src/large/medium/class.zig:8
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, };}Source: lib/gpalloc/src/large/medium/header.zig:26
pub fn baseFromUserPointer(ptr: [*]u8) [*]u8 { return ptr - model.header_size;}Source: lib/gpalloc/src/large/medium/header.zig:20
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
pub fn headerFromUserPointer(ptr: [*]u8) *Header { return @ptrCast(@alignCast(ptr - model.header_size));}Source: lib/gpalloc/src/large/medium/header.zig:7
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
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
pub const large = @import("large/root.zig");Audit
| Definitions | 24 |
|---|---|
| Public names | 24 |
| Members | 6 |
| Version | 26.7.0 |
| Revision | daab053ee433 |