Skip to content

Ownership transfer via Slot

Description

Ownership transfer via Slot.

  • Create an Event, wrap it in a Slot.
  • Transfer the Slot into a list, clear the Slot.
  • Pop the item back out of the list, assign it to a Slot.
  • Verify the recovered data, then free it.

Diagram

 alloc.create ──► slot (non-null)
      │ list.append + slot=null
 list (owns item)
      │ list.popFirst + slot=item
 slot (owns item again)
      │ freeSlot
 freed

Source

pub fn ownership_transfer_via_slot(allocator: std.mem.Allocator, io: std.Io) !void {
    _ = io;

    var slot: Slot = null;
    defer items.Event.EventPolyHelper.destroy(allocator, &slot);
    try items.Event.EventPolyHelper.create(allocator, &slot);
    const ev: *items.Event = items.Event.EventPolyHelper.mustIdentifySlotAs(&slot);
    ev.*.code = 42;
    try helpers.expect(error.OwnershipTransferFailed, slot != null, "slot should be non-null after create");

    // Transfer to list — clear slot to signal transfer.
    var list: std.DoublyLinkedList = .{};
    list.append(&slot.?.node);
    slot = null;
    try helpers.expect(error.OwnershipTransferFailed, slot == null, "slot should be null after transfer");

    // Recover from list — assign back to slot.
    const node: *std.DoublyLinkedList.Node = list.popFirst() orelse return error.EmptyList;
    slot = @fieldParentPtr("node", node);
    try helpers.expect(error.OwnershipTransferFailed, slot != null, "slot should be non-null after recovery");

    const recovered: *items.Event = items.Event.EventPolyHelper.mustIdentifySlotAs(&slot);
    try helpers.expect(error.OwnershipTransferFailed, recovered.*.code == 42, "wrong event code");

    items.freeSlot(&slot, allocator);
    try helpers.expect(error.OwnershipTransferFailed, slot == null, "slot should be null after destroy");
    // defer runs as no-op
}

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