tiny.zen.SitePageStorage
Defined in tiny.zen.
API (18)
Actions
Public operations.
Types and contracts
Public types and contracts.
Fields and members
Public fields and members.
Source
Source: lib/zen/src/site/page/storage.zig:17
zig
pub const Storage = struct { phase: alloc_phase.capacity.Phase, capacity: capacity_mod.Capacity, bytes: []u8, in_use: bool = false, loaded_page_bytes: usize = 0, high_water_page_bytes: usize = 0, rejected_page_count: u64 = 0, pub const Limits: type = capacity_mod.Limits; pub const Capacity: type = capacity_mod.Capacity; pub const Exhaustion: type = model.Exhaustion; pub const InitError = std.mem.Allocator.Error || capacity_mod.DeriveError; pub const claim: alloc_phase.capacity.Declaration = .{ .source = .{ .id = "zen.site_page_storage", .kind = .phase_static, .limit_source = .caller, .storage = .{ .covered = &.{ .{ .id = "one_reusable_surveyed_markdown_page_plus_overload_lookahead_byte", .lifetime = .steady, .detail = "one reusable surveyed Markdown page plus overload lookahead byte", }, }, .excluded = &.{ "caller-owned page paths, source directory capability, and kernel file state", "frontmatter, retained site catalog, rendered page, theme, asset, and filesystem output owners", }, }, .capacity = .{ .inputs = &.{ alloc_phase.capacity.bindInput(Limits, "max_page_bytes", "max_page_bytes"), }, .type_selectors = &.{}, .nodes = &.{ .{ .input = 0 }, .{ .constant = 1 }, .{ .add = .{ .left = 0, .right = 1 } }, }, .assertions = &.{.{ .scope = .closure_total, .measure = .retained, .relation = .exact, .expression = 2, }}, }, .overload = .{ .kind = .drop, .detail = "an oversized or concurrently grown page is rejected before parser mutation and the reusable input region remains available", }, .risks = .{ .transitive = .{ .status = .witnessed, .detail = "activated page acquisition uses only the preacquired byte region and consumers release every borrow before reuse", }, .foreign = .{ .status = .excluded, .detail = "directory reads and kernel file state remain effects outside the reusable page input owner", }, }, .obligations = &.{ .{ .key = "zen_site_page_capacity", .role = .capacity_model }, .{ .key = "zen_site_page_acquisition", .role = .custom }, .{ .key = "zen_site_page_oom", .role = .custom }, .{ .key = "zen_site_page_boundaries", .role = .overload }, .{ .key = "zen_site_page_growth", .role = .overload }, .{ .key = "zen_site_page_reuse", .role = .custom }, .{ .key = "zen_site_page_sealed", .role = .transitive_risk }, .{ .key = "zen_site_page_root", .role = .custom }, .{ .key = "zen_site_page_consumer_transitive_risk", .role = .transitive_risk }, .{ .key = "zen_site_page_consumer_foreign_risk", .role = .foreign_risk }, }, }, .bindings = .{ .owner = @This(), .seal = .{ .family = alloc_phase.capacity.selector(@This().activate), .premise = .{ .class = .checked_semantic_fact, .authority = .checker, }, }, .teardown = .{ .family = alloc_phase.capacity.selector(@This().deinit), .premise = .{ .class = .checked_semantic_fact, .authority = .checker, }, }, }, }; pub fn init(allocator: std.mem.Allocator, limits: Limits) InitError!Storage { const capacity = try Capacity.derive(limits); const bytes = try allocator.alloc(u8, capacity.storage_bytes); return .{ .phase = .initialization, .capacity = capacity, .bytes = bytes, }; } pub fn activate(self: *Storage) void { std.debug.assert(self.phase == .initialization); std.debug.assert(self.bytes.len == self.capacity.storage_bytes); std.debug.assert(self.bytes.len > self.capacity.page_bytes); self.phase = .steady; } pub fn readFile( self: *Storage, directory: std.Io.Dir, io: std.Io, relative_path: []const u8, ) ![]const u8 { try self.requireAvailable(); const page = directory.readFile(io, relative_path, self.bytes) catch |err| switch (err) { error.FileTooBig => return self.reject(), else => return err, }; return try self.admit(page.len); } pub fn release(self: *Storage) void { std.debug.assert(self.phase == .steady); std.debug.assert(self.in_use); self.in_use = false; self.loaded_page_bytes = 0; } pub fn status(self: *const Storage) Status { return .{ .phase = self.phase, .in_use = self.in_use, .storage_bytes = self.capacity.storage_bytes, .max_page_bytes = self.capacity.page_bytes, .loaded_page_bytes = self.loaded_page_bytes, .high_water_page_bytes = self.high_water_page_bytes, .rejected_page_count = self.rejected_page_count, }; } pub fn deinit(self: *Storage, allocator: std.mem.Allocator) void { std.debug.assert(self.phase != .teardown); std.debug.assert(!self.in_use); std.debug.assert(self.bytes.len == self.capacity.storage_bytes); self.phase = .teardown; allocator.free(self.bytes); self.bytes = &.{}; self.loaded_page_bytes = 0; } fn requireAvailable(self: *Storage) Exhaustion!void { std.debug.assert(self.phase == .steady); std.debug.assert(self.bytes.len == self.capacity.storage_bytes); std.debug.assert(self.loaded_page_bytes <= self.capacity.page_bytes); if (self.in_use) return error.SitePageStorageInUse; std.debug.assert(self.loaded_page_bytes == 0); } fn admit(self: *Storage, page_bytes: usize) Exhaustion![]const u8 { std.debug.assert(self.phase == .steady); std.debug.assert(!self.in_use); std.debug.assert(page_bytes <= self.capacity.storage_bytes); if (page_bytes > self.capacity.page_bytes) return self.reject(); self.in_use = true; self.loaded_page_bytes = page_bytes; self.high_water_page_bytes = @max(self.high_water_page_bytes, page_bytes); return self.bytes[0..page_bytes]; } fn reject(self: *Storage) Exhaustion { std.debug.assert(self.phase == .steady); std.debug.assert(!self.in_use); std.debug.assert(self.loaded_page_bytes == 0); self.rejected_page_count +|= 1; return error.SitePageCapacityExceeded; }};Source: lib/zen/src/root.zig:312
zig
/// Reusable caller-allocated buffer for one surveyed Markdown page.pub const SitePageStorage = site_page.Storage;Also reachable as
Complete caller list for SitePageStorage.init
7 direct callers.
lib.zen.src.site.page.storage.checkInitFailures[function] — private source atlib/zen/src/site/page/storage.zig:200in nearest public ownerlib.zen.src.site.page.storagelib.zen.src.site.page.storage.test_site_page_borrow_requires_release_before_address_reuse[function] — test source atlib/zen/src/site/page/storage.zig:307in nearest public ownerlib.zen.src.site.page.storagelib.zen.src.site.page.storage.test_site_page_reads_remain_allocation-free_after_storage_seals[function] — test source atlib/zen/src/site/page/storage.zig:358in nearest public ownerlib.zen.src.site.page.storagelib.zen.src.site.page.storage.test_site_page_rejection_telemetry_saturates[function] — test source atlib/zen/src/site/page/storage.zig:341in nearest public ownerlib.zen.src.site.page.storagelib.zen.src.site.page.storage.test_site_page_storage_accepts_the_exact_limit_and_rejects_max_plus_one[function] — test source atlib/zen/src/site/page/storage.zig:243in nearest public ownerlib.zen.src.site.page.storagelib.zen.src.site.page.storage.test_site_page_storage_acquires_one_exact_surveyed_region[function] — test source atlib/zen/src/site/page/storage.zig:205in nearest public ownerlib.zen.src.site.page.storagelib.zen.src.site.page.storage.test_site_page_storage_recovers_after_concurrent_file_growth[function] — test source atlib/zen/src/site/page/storage.zig:276in nearest public ownerlib.zen.src.site.page.storage
Audit
| Definitions | 12 |
|---|---|
| Public names | 24 |
| Members | 7 |
| Version | 26.7.0 |
| Revision | daab053ee433 |