Goose

32_pool_worker_snapshots.goose

// A flat pool snapshot includes the initialized items and allocator metadata.
// The worker reconstructs its own root owners from ordinary copied arguments.
import slot_pool;
import slice_pool;

thread_fn worker(var items: i64[>..], var free_slots: i64[>..<],
                 var runs: i64[>..], var nodes: slice_pool_detail::node[>..],
                 tree: slice_pool_detail::tree) {
    var slots = slot_pool<i64> { items: copy(items), free_slots: copy(free_slots) };
    var slices = slice_pool<i64> { items: copy(runs), nodes: copy(nodes), tree: tree };
    assert(slots.alloc_index(20) == 0);
    let run = slices.alloc_slice(2);
    assert(slices.items.range_index(run) == 1);
    run[0] = 30;
    print("worker reused the copied slot and span");
}

fn main() {
    var slots = slot_pool<i64> {};
    slots.alloc_index(10); slots.free(0);
    var slices = slice_pool<i64> {};
    let run = slices.alloc_slice(4);
    run[1] = 11;
    slices.free_slice(run[1..3]);
    thread_wait(thread_spawn(worker, copy(slots.items), copy(slots.free_slots),
                             copy(slices.items), copy(slices.nodes), slices.tree));
    assert(slots.items[0] == 10 && run[1] == 11);
    assert(slots.alloc_index(40) == 0);
    assert(slices.items.range_index(slices.alloc_slice(2)) == 1);
    print("parent pools retain their own values and freelists");
}