✓
Passing This code compiles and runs correctly.
Code
// `! idle` on `pump:run` — the pump's own effect, fired when a whole pass
// stepped every live row and nobody progressed (no row answered `| running`
// or `| complete` — the only two words the pump reads; the sources' `| quiet`
// here is an author-named no-progress verdict like any other). The arm runs
// inside the loop — sleep, kevent, a tick — and the next pass begins when it
// returns. This is the composition seam for blocking-shaped participants.
//
// The participants are real fds (socketpairs): `tick` delivers a byte every
// third step and answers `quiet` between; `tty`/`sock` poll before reading —
// the orisha shape. `want: 2` retires both sources on the second delivery;
// `tick` retires after seven steps. The four "pump idle" lines pin the passes
// where every live participant made no progress — including the two passes
// where only the unfinished tick was still being stepped.
import std/io
import std/store
import std/pump
import std/time
import lib/srcchan
std/store:new(tick, capacity: 2) { *lib/srcchan:Tick<live!> }
! step t |> lib/srcchan:step-tick(t)
! ticked i |> std/io:print.ln("tick {{ i:d }}")
! discharge t |> lib/srcchan:close-tick(t): id |> std/io:print.ln("tick retired {{ id:d }}")
std/store:new(tty, capacity: 2) { *lib/srcchan:Src<live!> }
! step s |> lib/srcchan:step-src(s)
! moved i |> std/io:print.ln("tty read {{ i:d }}")
! waited i |> std/io:print.ln("tty idle {{ i:d }}")
! discharge s |> lib/srcchan:close-src(s): id |> std/io:print.ln("tty retired {{ id:d }}")
std/store:new(sock, capacity: 2) { *lib/srcchan:Src<live!> }
! step s |> lib/srcchan:step-src(s)
! moved i |> std/io:print.ln("sock read {{ i:d }}")
! waited i |> std/io:print.ln("sock idle {{ i:d }}")
! discharge s |> lib/srcchan:close-src(s): id |> std/io:print.ln("sock retired {{ id:d }}")
lib/srcchan:open-src(id: 1, want: 2): a
|> lib/srcchan:open-src(id: 2, want: 2): b
|> lib/srcchan:open-tick(id: 0, a, b, ticks: 7): t
|> std/store:insert(tick) { t }
| row _ |> std/store:insert(tty) { a }
| row _ |> std/store:insert(sock) { b }
| row _ |> _
| full f |> lib/srcchan:close-src(s: f): id |> std/io:print.ln("dropped sock {{ id:d }}")
| full f |> lib/srcchan:close-src(s: f): id |> std/io:print.ln("dropped tty {{ id:d }}")
|> lib/srcchan:close-src(s: b): id2 |> std/io:print.ln("dropped sock {{ id2:d }}")
| full f |> lib/srcchan:close-tick(t: f): id |> std/io:print.ln("dropped tick {{ id:d }}")
|> lib/srcchan:close-src(s: a): id2 |> std/io:print.ln("dropped tty {{ id2:d }}")
|> lib/srcchan:close-src(s: b): id3 |> std/io:print.ln("dropped sock {{ id3:d }}")
std/pump:create(main)
| drained |> std/io:print.ln("all participants retired")
std/pump(main)
! step |> tick-step()
! live |> tick-live()
std/pump(main)
! step |> tty-step()
! live |> tty-live()
std/pump(main)
! step |> sock-step()
! live |> sock-live()
std/pump:run(main)
! idle |> std/io:print.ln("pump idle — nothing ready anywhere") |> std/time:sleep-ms(ms: 2)
Supporting Files
// Probe-6 participants — synthetic BLOCKING-shaped event sources.
//
// r5's Src was a counter: step always had work. These are real fds —
// socketpair ends — whose readiness the step ASKS about (poll) before reading,
// which is exactly what vaxis's `tryEvent` and orisha's `kevent` bodies do.
// The no-progress verdict is the point: a participant answers `| quiet` —
// "I asked, nothing was ready, I'm still alive" — an author-named word. The
// pump reads only `| running` (progress) and `| complete` (retire); anything
// else counts as no-progress, so a composed pump can see a pass where nobody
// did anything — the `! idle` seam.
//
// Src — an event SOURCE: read end + write end of a socketpair. `step`
// polls; ready → drain + `| running`; not ready → `| quiet`; seen all
// `want` bytes → `| complete`.
// Tick — the producer standing in for "the OS": each step writes a byte to
// the sources' write ends. Ticks down to `| complete`.
//
// close returns a value (not unattended-callable) so `! discharge` is required
// — the retirement path is exercised, same as r5.
const std = @import("std");
pub const Src = struct { id: i64, rfd: i32, wfd: i32, seen: i64, want: i64 };
pub const Tick = struct { id: i64, w1: i32, w2: i32, left: i64 };
~pub tor open-src { id: i64, want: i64 } -> *Src<live!>
~proc open-src|zig {
var sv: [2]i32 = undefined;
if (std.c.socketpair(std.c.AF.UNIX, std.c.SOCK.STREAM, 0, &sv) != 0) unreachable;
const s = std.heap.page_allocator.create($mod.Src) catch unreachable;
s.* = .{ .id = id, .rfd = sv[0], .wfd = sv[1], .seen = 0, .want = want };
return s;
}
~pub tor step-src { s: *Src<live> }
! ?moved i64
! ?waited i64
| running
| quiet
| complete
~proc step-src|zig {
var pfd = [_]std.posix.pollfd{.{ .fd = s.rfd, .events = std.posix.POLL.IN, .revents = 0 }};
const n = std.posix.poll(&pfd, 0) catch return .{ .quiet = .{} };
if (n == 0) {
waited(s.id);
return .{ .quiet = .{} };
}
var buf: [64]u8 = undefined;
const got = std.posix.read(s.rfd, &buf) catch 0;
s.seen += @intCast(got);
if (got > 0) moved(s.id);
if (s.seen >= s.want) return .{ .complete = .{} };
return .{ .running = .{} };
}
// `! wait` interest contract — the return type IS the vocabulary: `-> i32`
// answers a descriptor to poll, `-> i128` a RELATIVE re-poll duration,
// `-> { fd: i32, wait_ns: i128 }` both. A source answers its read fd; a
// tick answers a re-poll duration. The pump polls the union of these once
// per all-idle pass.
~pub tor interest-src { s: *Src<live> } -> i32
! ?polled i32
~proc interest-src|zig {
polled(s.rfd);
return s.rfd;
}
~pub tor close-src { s: *Src<!live> } -> i64
~proc close-src|zig {
const id = s.id;
std.posix.close(s.rfd);
std.posix.close(s.wfd);
std.heap.page_allocator.destroy(s);
return id;
}
~pub tor open-tick { id: i64, a: *Src<live>, b: *Src<live>, ticks: i64 } -> *Tick<live!>
~proc open-tick|zig {
const t = std.heap.page_allocator.create($mod.Tick) catch unreachable;
t.* = .{ .id = id, .w1 = a.wfd, .w2 = b.wfd, .left = ticks };
return t;
}
~pub tor step-tick { t: *Tick<live> }
! ?ticked i64
| running
| quiet
| complete
// Delivers a byte to both pipes every THIRD step — the other steps answer
// `quiet`, so the pump sees whole passes where nobody did anything: the
// `! idle` arm's firing pattern IS the measurement this probe exists for.
~proc step-tick|zig {
if (t.left <= 0) return .{ .complete = .{} };
t.left -= 1;
if (@rem(t.left, 3) != 0) return .{ .quiet = .{} };
_ = std.posix.write(t.w1, "x") catch 0;
_ = std.posix.write(t.w2, "x") catch 0;
ticked(t.id);
if (t.left == 0) return .{ .complete = .{} };
return .{ .running = .{} };
}
~pub tor interest-tick { t: *Tick<live> } -> i128
! ?polled i32
// A tick's interest is a duration: "re-poll me in ~5ms". The pump's union
// wait turns that into the poll timeout, so the tick paces the whole dead
// pass.
~proc interest-tick|zig {
polled(-1);
return 5_000_000;
}
~pub tor close-tick { t: *Tick<!live> } -> i64
~proc close-tick|zig {
const id = t.id;
std.heap.page_allocator.destroy(t);
return id;
}
Actual · Zig
✓ passtick 0
tty read 1
sock read 2
tty idle 1
sock idle 2
pump idle — nothing ready anywhere
tty idle 1
sock idle 2
pump idle — nothing ready anywhere
tick 0
tty read 1
tty retired 1
sock read 2
sock retired 2
pump idle — nothing ready anywhere
pump idle — nothing ready anywhere
tick 0
tick retired 0
all participants retired
Actual · C#
✗ cs-compileExpected output
✓ Zig✗ C#tick 0
tty read 1
sock read 2
tty idle 1
sock idle 2
pump idle — nothing ready anywhere
tty idle 1
sock idle 2
pump idle — nothing ready anywhere
tick 0
tty read 1
tty retired 1
sock read 2
sock retired 2
pump idle — nothing ready anywhere
pump idle — nothing ready anywhere
tick 0
tick retired 0
all participants retired
Emitted Zig source
// Access compiler flags via the per-user compiler_env module
const CompilerEnv = @import("compiler_env").CompilerEnv;
pub const panic = if (@import("builtin").mode == .Debug)
@import("std").debug.FullPanic(@import("std").debug.defaultPanic)
else
@import("std").debug.simple_panic;
const __koru_bare = struct {
extern fn posix_memalign(memptr: *?*anyopaque, alignment: usize, size: usize) c_int;
extern fn free(ptr: ?*anyopaque) void;
fn bareAlloc(_: *anyopaque, len: usize, alignment: @import("std").mem.Alignment, _: usize) ?[*]u8 {
var p: ?*anyopaque = null;
const a = @max(alignment.toByteUnits(), @sizeOf(usize));
if (posix_memalign(&p, a, len) != 0) return null;
return @ptrCast(p);
}
fn bareResize(_: *anyopaque, _: []u8, _: @import("std").mem.Alignment, _: usize, _: usize) bool { return false; }
fn bareRemap(_: *anyopaque, _: []u8, _: @import("std").mem.Alignment, _: usize, _: usize) ?[*]u8 { return null; }
fn bareFree(_: *anyopaque, memory: []u8, _: @import("std").mem.Alignment, _: usize) void { free(@ptrCast(memory.ptr)); }
const vtable = @import("std").mem.Allocator.VTable{ .alloc = bareAlloc, .resize = bareResize, .remap = bareRemap, .free = bareFree };
const allocator = @import("std").mem.Allocator{ .ptr = undefined, .vtable = &vtable };
};
const __koru_backing = if (@import("builtin").link_libc) @import("std").heap.c_allocator else if (@import("builtin").os.tag == .freestanding and !@import("builtin").cpu.arch.isWasm()) __koru_bare.allocator else @import("std").heap.page_allocator;
var __koru_leak_count: @import("std").atomic.Value(usize) = .init(0);
var __koru_par_tasks: @import("std").atomic.Value(usize) = .init(0);
const __koru_par_CAP: usize = 128;
threadlocal var __koru_par_depth: usize = 0;
const __koru_par_DEPTH_CAP: usize = 7;
var __koru_par_pool: @import("std").Thread.Pool = undefined;
var __koru_par_pool_ready: bool = false;
var __koru_par_pool_mtx: @import("std").Thread.Mutex = .{};
fn __koru_par_pool_ensure() *@import("std").Thread.Pool {
__koru_par_pool_mtx.lock();
defer __koru_par_pool_mtx.unlock();
if (!__koru_par_pool_ready) {
@import("std").Thread.Pool.init(&__koru_par_pool, .{ .allocator = @import("std").heap.smp_allocator }) catch @panic("koru: thread pool init failed");
__koru_par_pool_ready = true;
}
return &__koru_par_pool;
}
fn __koru_alloc(ctx: *anyopaque, len: usize, alignment: @import("std").mem.Alignment, ret_addr: usize) ?[*]u8 {
_ = ctx;
const r = __koru_backing.rawAlloc(len, alignment, ret_addr);
if (comptime @import("builtin").mode == .Debug) {
if (r != null) _ = __koru_leak_count.fetchAdd(1, .monotonic);
}
return r;
}
fn __koru_resize(ctx: *anyopaque, memory: []u8, alignment: @import("std").mem.Alignment, new_len: usize, ret_addr: usize) bool {
_ = ctx;
return __koru_backing.rawResize(memory, alignment, new_len, ret_addr);
}
fn __koru_remap(ctx: *anyopaque, memory: []u8, alignment: @import("std").mem.Alignment, new_len: usize, ret_addr: usize) ?[*]u8 {
_ = ctx;
return __koru_backing.rawRemap(memory, alignment, new_len, ret_addr);
}
fn __koru_free(ctx: *anyopaque, memory: []u8, alignment: @import("std").mem.Alignment, ret_addr: usize) void {
_ = ctx;
__koru_backing.rawFree(memory, alignment, ret_addr);
if (comptime @import("builtin").mode == .Debug) {
_ = __koru_leak_count.fetchSub(1, .monotonic);
}
}
const __koru_vtable = @import("std").mem.Allocator.VTable{ .alloc = __koru_alloc, .resize = __koru_resize, .remap = __koru_remap, .free = __koru_free };
pub fn koru_allocator() @import("std").mem.Allocator {
return .{ .ptr = undefined, .vtable = &__koru_vtable };
}
pub inline fn __koru_intcast(comptime T: type, x: anytype) T {
if (comptime (@import("builtin").mode == .Debug or @import("builtin").mode == .ReleaseSafe))
return @as(T, @intCast(x));
const dst = @typeInfo(T);
const src = @typeInfo(@TypeOf(x));
if (comptime (dst == .int and src == .int and dst.int.bits == src.int.bits and dst.int.signedness != src.int.signedness))
return @as(T, @bitCast(x));
return @as(T, @intCast(x));
}
fn __KoruPadI(comptime T: type) type {
const V = switch (@typeInfo(T)) { .comptime_int => i64, .comptime_float => f64, else => T };
return struct {
v: V,
width: usize,
pub fn format(self: @This(), w: *@import("std").Io.Writer) @import("std").Io.Writer.Error!void {
const rendered = @import("std").fmt.count("{d}", .{self.v});
const pad = self.width -| rendered;
for (0..pad) |_| try w.writeByte(' ');
try w.print("{d}", .{self.v});
}
};
}
pub fn __koru_pad_i(width: usize, value: anytype) __KoruPadI(@TypeOf(value)) {
return .{ .v = value, .width = width };
}
pub fn koru_leak_check() void {
if (comptime @import("builtin").mode != .Debug) return;
if (__koru_leak_count.load(.acquire) == 0) return;
if (comptime @import("builtin").target.os.tag == .freestanding) {
if (comptime @import("builtin").cpu.arch == .wasm32 or @import("builtin").cpu.arch == .wasm64) {
@panic("KORU LEAK CHECK FAILED: the produced program leaked");
} else {
const __klc = struct { extern var stdout: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; };
var __lb: [128]u8 = undefined;
const __lm = "KORU LEAK CHECK FAILED: allocations still outstanding at end of run: ";
@memcpy(__lb[0..__lm.len], __lm);
var __ln: usize = __lm.len;
var __lv = __koru_leak_count.load(.acquire);
var __ld: [20]u8 = undefined;
var __lk: usize = 0;
while (__lv > 0) : (__lk += 1) { __ld[__lk] = @intCast('0' + __lv % 10); __lv /= 10; }
for (0..__lk) |__li| { __lb[__ln] = __ld[__lk - 1 - __li]; __ln += 1; }
__lb[__ln] = '\n'; __ln += 1; __lb[__ln] = 0;
_ = __klc.fputs(@as([*:0]const u8, @ptrCast(&__lb)), __klc.stdout);
@trap();
}
} else {
@import("std").debug.print("KORU LEAK CHECK FAILED: the produced program leaked (trace above)\n", .{});
@import("std").process.exit(1);
}
}
pub const main_module = struct {
// std/store: plural store 'tick' created (SoA cell + insert/query/write/take/stripe units); fields __koru_value: *lib/srcchan:Tick<live!>
// std/store: plural store 'tty' created (SoA cell + insert/query/write/take/stripe units); fields __koru_value: *lib/srcchan:Src<live!>
// std/store: plural store 'sock' created (SoA cell + insert/query/write/take/stripe units); fields __koru_value: *lib/srcchan:Src<live!>
// >>> FLOW: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:38 ~lib.srcchan:open_src()
pub fn flow0() void {
const a = koru_lib.koru_srcchan.open_src_event.handler(.{ .id = 1, .want = 2 });
const b = koru_lib.koru_srcchan.open_src_event.handler(.{ .id = 2, .want = 2 });
_ = &b;
const t = koru_lib.koru_srcchan.open_tick_event.handler(.{ .id = 0, .a = a, .b = b, .ticks = 7 });
_ = &t;
const result_3 = main_module.__store_insertf_tick_event.handler(.{ .__koru_value = t, .__site_line = 41 });
_ = &result_3;
switch (result_3) {
// >>> BRANCH: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:42 | row _auto_6 |>
.row => |_| {
const result_4 = main_module.__store_insertf_tty_event.handler(.{ .__koru_value = a, .__site_line = 42 });
_ = &result_4;
switch (result_4) {
// >>> BRANCH: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:43 | row _auto_7 |>
.row => |_| {
const result_5 = main_module.__store_insertf_sock_event.handler(.{ .__koru_value = b, .__site_line = 43 });
_ = &result_5;
switch (result_5) {
// >>> BRANCH: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:44 | row _auto_8 |>
.row => |_| {
},
// >>> BRANCH: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:45 | full f |>
.full => |f| {
const id = koru_lib.koru_srcchan.close_src_event.handler(.{ .s = f });
_ = &id;
(struct { fn __kout(__fd: i32, __b: []const u8) void { if (@import("builtin").os.tag == .freestanding) { const __kc = struct { extern var stdout: ?*anyopaque; extern var stderr: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; }; var __kt: [4096]u8 = undefined; for (0..(__b.len + __kt.len - 2) / (__kt.len - 1)) |__ki| { const __kn = @min(__kt.len - 1, __b.len - __ki * (__kt.len - 1)); @memcpy(__kt[0..__kn], __b[__ki * (__kt.len - 1)..][0..__kn]); __kt[__kn] = 0; @import("std").mem.doNotOptimizeAway(__kc.fputs(@as([*:0]const u8, @ptrCast(&__kt)), if (__fd == 2) __kc.stderr else __kc.stdout)); } } else { @import("std").mem.doNotOptimizeAway(@import("std").posix.write(__fd, __b) catch @as(usize, 0)); } } fn __kw(comptime __f: []const u8, __a: anytype) void { var __kb: [65536]u8 = undefined; const __ks = @import("std").fmt.bufPrint(&__kb, __f, __a) catch __kb[0..0]; __kout(1, __ks); } }).__kw("dropped sock {d}\n", .{id});
},
}
},
// >>> BRANCH: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:46 | full f |>
.full => |f| {
const id = koru_lib.koru_srcchan.close_src_event.handler(.{ .s = f });
_ = &id;
(struct { fn __kout(__fd: i32, __b: []const u8) void { if (@import("builtin").os.tag == .freestanding) { const __kc = struct { extern var stdout: ?*anyopaque; extern var stderr: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; }; var __kt: [4096]u8 = undefined; for (0..(__b.len + __kt.len - 2) / (__kt.len - 1)) |__ki| { const __kn = @min(__kt.len - 1, __b.len - __ki * (__kt.len - 1)); @memcpy(__kt[0..__kn], __b[__ki * (__kt.len - 1)..][0..__kn]); __kt[__kn] = 0; @import("std").mem.doNotOptimizeAway(__kc.fputs(@as([*:0]const u8, @ptrCast(&__kt)), if (__fd == 2) __kc.stderr else __kc.stdout)); } } else { @import("std").mem.doNotOptimizeAway(@import("std").posix.write(__fd, __b) catch @as(usize, 0)); } } fn __kw(comptime __f: []const u8, __a: anytype) void { var __kb: [65536]u8 = undefined; const __ks = @import("std").fmt.bufPrint(&__kb, __f, __a) catch __kb[0..0]; __kout(1, __ks); } }).__kw("dropped tty {d}\n", .{id});
const id2 = koru_lib.koru_srcchan.close_src_event.handler(.{ .s = b });
_ = &id2;
(struct { fn __kout(__fd: i32, __b: []const u8) void { if (@import("builtin").os.tag == .freestanding) { const __kc = struct { extern var stdout: ?*anyopaque; extern var stderr: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; }; var __kt: [4096]u8 = undefined; for (0..(__b.len + __kt.len - 2) / (__kt.len - 1)) |__ki_0| { const __kn = @min(__kt.len - 1, __b.len - __ki_0 * (__kt.len - 1)); @memcpy(__kt[0..__kn], __b[__ki_0 * (__kt.len - 1)..][0..__kn]); __kt[__kn] = 0; @import("std").mem.doNotOptimizeAway(__kc.fputs(@as([*:0]const u8, @ptrCast(&__kt)), if (__fd == 2) __kc.stderr else __kc.stdout)); } } else { @import("std").mem.doNotOptimizeAway(@import("std").posix.write(__fd, __b) catch @as(usize, 0)); } } fn __kw(comptime __f: []const u8, __a: anytype) void { var __kb: [65536]u8 = undefined; const __ks = @import("std").fmt.bufPrint(&__kb, __f, __a) catch __kb[0..0]; __kout(1, __ks); } }).__kw("dropped sock {d}\n", .{id2});
},
}
},
// >>> BRANCH: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:48 | full f |>
.full => |f| {
const id = koru_lib.koru_srcchan.close_tick_event.handler(.{ .t = f });
_ = &id;
(struct { fn __kout(__fd: i32, __b: []const u8) void { if (@import("builtin").os.tag == .freestanding) { const __kc = struct { extern var stdout: ?*anyopaque; extern var stderr: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; }; var __kt: [4096]u8 = undefined; for (0..(__b.len + __kt.len - 2) / (__kt.len - 1)) |__ki| { const __kn = @min(__kt.len - 1, __b.len - __ki * (__kt.len - 1)); @memcpy(__kt[0..__kn], __b[__ki * (__kt.len - 1)..][0..__kn]); __kt[__kn] = 0; @import("std").mem.doNotOptimizeAway(__kc.fputs(@as([*:0]const u8, @ptrCast(&__kt)), if (__fd == 2) __kc.stderr else __kc.stdout)); } } else { @import("std").mem.doNotOptimizeAway(@import("std").posix.write(__fd, __b) catch @as(usize, 0)); } } fn __kw(comptime __f: []const u8, __a: anytype) void { var __kb: [65536]u8 = undefined; const __ks = @import("std").fmt.bufPrint(&__kb, __f, __a) catch __kb[0..0]; __kout(1, __ks); } }).__kw("dropped tick {d}\n", .{id});
const id2 = koru_lib.koru_srcchan.close_src_event.handler(.{ .s = a });
_ = &id2;
(struct { fn __kout(__fd: i32, __b: []const u8) void { if (@import("builtin").os.tag == .freestanding) { const __kc = struct { extern var stdout: ?*anyopaque; extern var stderr: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; }; var __kt: [4096]u8 = undefined; for (0..(__b.len + __kt.len - 2) / (__kt.len - 1)) |__ki_1| { const __kn = @min(__kt.len - 1, __b.len - __ki_1 * (__kt.len - 1)); @memcpy(__kt[0..__kn], __b[__ki_1 * (__kt.len - 1)..][0..__kn]); __kt[__kn] = 0; @import("std").mem.doNotOptimizeAway(__kc.fputs(@as([*:0]const u8, @ptrCast(&__kt)), if (__fd == 2) __kc.stderr else __kc.stdout)); } } else { @import("std").mem.doNotOptimizeAway(@import("std").posix.write(__fd, __b) catch @as(usize, 0)); } } fn __kw(comptime __f: []const u8, __a: anytype) void { var __kb: [65536]u8 = undefined; const __ks = @import("std").fmt.bufPrint(&__kb, __f, __a) catch __kb[0..0]; __kout(1, __ks); } }).__kw("dropped tty {d}\n", .{id2});
const id3 = koru_lib.koru_srcchan.close_src_event.handler(.{ .s = b });
_ = &id3;
(struct { fn __kout(__fd: i32, __b: []const u8) void { if (@import("builtin").os.tag == .freestanding) { const __kc = struct { extern var stdout: ?*anyopaque; extern var stderr: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; }; var __kt: [4096]u8 = undefined; for (0..(__b.len + __kt.len - 2) / (__kt.len - 1)) |__ki_2| { const __kn = @min(__kt.len - 1, __b.len - __ki_2 * (__kt.len - 1)); @memcpy(__kt[0..__kn], __b[__ki_2 * (__kt.len - 1)..][0..__kn]); __kt[__kn] = 0; @import("std").mem.doNotOptimizeAway(__kc.fputs(@as([*:0]const u8, @ptrCast(&__kt)), if (__fd == 2) __kc.stderr else __kc.stdout)); } } else { @import("std").mem.doNotOptimizeAway(@import("std").posix.write(__fd, __b) catch @as(usize, 0)); } } fn __kw(comptime __f: []const u8, __a: anytype) void { var __kb: [65536]u8 = undefined; const __ks = @import("std").fmt.bufPrint(&__kb, __f, __a) catch __kb[0..0]; __kout(1, __ks); } }).__kw("dropped sock {d}\n", .{id3});
},
}
}
// >>> FLOW: tests/regression/600_STDLIB/690_STORE/690_313_pump_idle_arm_fires_on_all_idle_pass/input.k:67 ~input:__pump_run_main()
pub fn flow1() void {
const __koru_eff_disc_0: main_module.__pump_run_main_event.Output = __koru_proc_0: {
while (true) {
var __koru_live: i64 = 0;
__koru_live += main_module.__pump_main_live_0_event.handler(.{});
__koru_live += main_module.__pump_main_live_1_event.handler(.{});
__koru_live += main_module.__pump_main_live_2_event.handler(.{});
if (__koru_live == 0) break;
var __koru_worked: i64 = 0;
__koru_worked += main_module.__pump_main_step_0_event.handler(.{});
__koru_worked += main_module.__pump_main_step_1_event.handler(.{});
__koru_worked += main_module.__pump_main_step_2_event.handler(.{});
if (__koru_worked == 0) { if (true) { { (struct { fn __kout(__fd: i32, __b: []const u8) void { if (@import("builtin").os.tag == .freestanding) { const __kc = struct { extern var stdout: ?*anyopaque; extern var stderr: ?*anyopaque; extern fn fputs(__s: [*:0]const u8, __st: ?*anyopaque) c_int; }; var __kt: [4096]u8 = undefined; for (0..(__b.len + __kt.len - 2) / (__kt.len - 1)) |__ki| { const __kn = @min(__kt.len - 1, __b.len - __ki * (__kt.len - 1)); @memcpy(__kt[0..__kn], __b[__ki * (__kt.len - 1)..][0..__kn]); __kt[__kn] = 0; @import("std").mem.doNotOptimizeAway(__kc.fputs(@as([*:0]const u8, @ptrCast(&__kt)), if (__fd == 2) __kc.stderr else __kc.stdout)); } } else { @import("std").mem.doNotOptimizeAway(@import("std").posix.write(__fd, __b) catch @as(usize, 0)); } } fn __kw(comptime __f: []const u8, __a: anytype) void { var __kb: [65536]u8 = undefined; const __ks = @import("std").fmt.bufPrint(&__kb, __f, __a) catch __kb[0..0]; __kout(1, __ks); } }).__kw("pump idle — nothing ready anywhere\n", .{});
_ = koru_std.koru_time.sleep_ms_event.handler(.{ .ms = 2 });
} } else {
@import("std").Thread.sleep(1_000_000);
} }
}
main_module.__pump_drained_main_event.handler(.{});
break :__koru_proc_0;
};
_ = __koru_eff_disc_0;
}
pub fn koru_start_flow() void {
const result_0 = koru_koru.start_event.handler(.{ });
const result_0_done = result_0.done;
_ = &result_0_done;
}
pub fn koru_end_flow() void {
const result_0 = koru_koru.end_event.handler(.{ });
const result_0_done = result_0.done;
_ = &result_0_done;
}
const __KoruStoreT_tick = struct {
__koru_value: [2]*koru_lib.koru_srcchan.Tick = undefined,
len: usize = 0,
__koru_hslot_row: [2]usize = undefined,
__koru_hslot_gen: [2]u32 = [_]u32{0} ** 2,
__koru_row_hslot: [2]usize = undefined,
__koru_hslot_free: [2]usize = undefined,
__koru_hslot_free_len: usize = 0,
__koru_hslot_next: usize = 0,
// `__koru_ident` — no removal has run, so slot == dense row
// for every live row; mint/resolve skip both table loads, the
// first take materialises and flips it, drain and clear
// re-arm it by resetting the slot space. `__koru_gen0` — no gen
// bump has ever run; it implies slot == row for every minted
// slot, so resolve sheds the gen load entirely.
__koru_ident: bool = true, __koru_gen0: bool = true,
const __koru_brand: u32 = 1;
fn __koru_materialize(self: *@This()) void {
if (!self.__koru_ident) return;
for (0..self.len) |i| { self.__koru_hslot_row[i] = i; self.__koru_row_hslot[i] = i; }
self.__koru_ident = false;
}
fn __koru_row_of(self: *const @This(), h: i64) ?usize {
if (h < 0) return null;
const u = @as(u64, @bitCast(h));
const slot32 = @as(u32, @truncate(u));
if ((slot32 >> 24) != __koru_brand) return null;
const slot = @as(usize, @intCast(slot32 & 0xFFFFFF));
if (slot >= self.__koru_hslot_next) return null;
if (self.__koru_gen0) { if (u >> 32 != 0) return null; return slot; }
if (@as(u32, @truncate(u >> 32)) != self.__koru_hslot_gen[slot]) return null;
if (self.__koru_ident) return slot;
const __koru_r = self.__koru_hslot_row[slot];
if (__koru_r >= self.len) return null;
return __koru_r;
}
// DO NOT "simplify" into one pass — pre-check + row_of tail
... [truncated - 77KB total]Flows
flow ~new click a branch to expand · @labels scroll to their anchor
new (tick, capacity: 2, source: *lib/srcchan:Tick<live!>)
flow ~new click a branch to expand · @labels scroll to their anchor
new (tty, capacity: 2, source: *lib/srcchan:Src<live!>)
flow ~new click a branch to expand · @labels scroll to their anchor
new (sock, capacity: 2, source: *lib/srcchan:Src<live!>)
flow ~open-src click a branch to expand · @labels scroll to their anchor
open-src (id: 1, want: 2)
flow ~create click a branch to expand · @labels scroll to their anchor
create (expr: main)
flow ~std/pump click a branch to expand · @labels scroll to their anchor
std/pump (main)
flow ~std/pump click a branch to expand · @labels scroll to their anchor
std/pump (main)
flow ~std/pump click a branch to expand · @labels scroll to their anchor
std/pump (main)
flow ~run click a branch to expand · @labels scroll to their anchor
run (main)
Test Configuration
MUST_RUN
koru.json:
{
"name": "probe",
"version": "0.1.0"
}