Skip to content

Basic recycler

Description

Basic recycler.

  • Create a pool with hooks for the Event tag.
  • pl.get with available_or_new allocates a fresh item.
  • pl.put returns it — the hook resets it to defaults on put.
  • pl.get again recycles the same item, now holding default data.

Diagram

 pl.get (available_or_new) ──► slot (new via on_get)
      │ pl.put ──► on_put resets data ──► pool (recycled)
      │ pl.get (available_or_new) ──► slot (same item, data reset)
      │ EventPolyHelper.destroy ──► freed

Source

pub fn basic_recycler(allocator: std.mem.Allocator, io: std.Io) !void {
    var ctx: hooks.AlwaysCreateHooks = .{ .alloc = allocator };
    const tags = [_]*const anyopaque{items.Event.EventPolyHelper.TAG};

    var pl_slot: Slot = null;
    try pool.new(io, allocator, ctx.poolHooks(&tags), &pl_slot);
    const pl: *Pool = Pool.moveFromSlot(&pl_slot).?;
    defer {
        pl.close();
        pool.destroy(pl, allocator);
    }

    var slot: Slot = null;
    defer pl.put(&slot);

    try pl.get(items.Event.EventPolyHelper.TAG, .available_or_new, &slot);
    const ev = items.Event.EventPolyHelper.fromSlot(&slot) orelse return error.WrongTag;
    ev.code = 89;
    std.log.info("got fresh Event, set code={d}", .{ev.code});

    pl.put(&slot);
    std.log.info("returned Event to pool", .{});

    try pl.get(items.Event.EventPolyHelper.TAG, .available_or_new, &slot);
    const ev2 = items.Event.EventPolyHelper.fromSlot(&slot) orelse return error.WrongTag;
    std.log.info("recycled Event code={d}", .{ev2.code});
    try helpers.expect(error.BasicRecyclerFailed, ev2.code == 0, "recycled item was not reset by the hook");

    items.Event.EventPolyHelper.destroy(allocator, &slot);
}

const items = @import("../items/items.zig");
const hooks = @import("../hooks/hooks.zig");
const helpers = @import("../helpers/helpers.zig");
const matryoshka = @import("matryoshka");
const std = @import("std");
const pool = matryoshka.pool;
const Pool = matryoshka.Pool;
const polynode = matryoshka.polynode;
const Slot = polynode.Slot;