Concurrency Coordination Reports
Coroutine Resume Coordination Report
Resume a Lua coroutine a fixed number of times and label the coordination state from the resume count and final coroutine status.
coroutine resume
A coroutine yields control on each step and resumes deterministically, so the resumed-step count and the final status stay scalar.
Coroutine Resume Coordination Report
coroutine_resume.lua
Replay: real traced execution (multi-file project)
local resumes = 2
local yields = 2
local steps = 0
local co_status = "suspended"
for attempt = 1, resumes do
if attempt <= yields then
steps = steps + 1
else
co_status = "dead"
end
end
local report_status = "primed"
if co_status == "dead" then
report_status = "drained"
elseif steps >= 2 then
report_status = "flowing"
end
print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. report_status)
local resumes = 1
local yields = 2
local steps = 0
local co_status = "suspended"
for attempt = 1, resumes do
if attempt <= yields then
steps = steps + 1
else
co_status = "dead"
end
end
local report_status = "primed"
if co_status == "dead" then
report_status = "drained"
elseif steps >= 2 then
report_status = "flowing"
end
print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. report_status)
local resumes = 3
local yields = 2
local steps = 0
local co_status = "suspended"
for attempt = 1, resumes do
if attempt <= yields then
steps = steps + 1
else
co_status = "dead"
end
end
local report_status = "primed"
if co_status == "dead" then
report_status = "drained"
elseif steps >= 2 then
report_status = "flowing"
end
print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. report_status)
resumes ← 2, yields ← 2, steps ← 0, co_status ← suspended
1local resumes→ 2 = 2 --@resumes=1, 32local yields→ 2 = 23local steps→ 0 = 04local co_status→ suspended = "suspended"attempt = 1, resumes do
pass 1 of 26for attempt1 = 1, resumes2 do7 if attempt <= yields then8 steps = steps + 1steps ← 1
pass 1 of 26for attempt = 1, resumes do7 if attempt1 <= yields2 then8 steps→ 1 = steps + 19 elseattempt = 1, resumes do
pass 2 of 26for attempt2 = 1, resumes2 do7 if attempt <= yields then8 steps = steps + 1steps ← 2
pass 2 of 26for attempt = 1, resumes do7 if attempt2 <= yields2 then8 steps→ 2 = steps + 19 elsereport_status ← primed
14local report_status→ primed = "primed"15if co_status == "dead" thenreport_status ← flowing
16 report_status = "drained"17elseif steps2 >= 2 then18 report_status→ flowing = "flowing"19endprint("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. rep…
21print("resumes=" .. resumes2 .. " steps=" .. steps2 .. " status=" .. report_statusflowing)outputresumes=2 steps=2 status=flowing
resumes ← 1, yields ← 2, steps ← 0, co_status ← suspended
1local resumes→ 1 = 12local yields→ 2 = 23local steps→ 0 = 04local co_status→ suspended = "suspended"attempt = 1, resumes do
6for attempt1 = 1, resumes1 do7 if attempt <= yields then8 steps = steps + 1steps ← 1
6for attempt = 1, resumes do7 if attempt1 <= yields2 then8 steps→ 1 = steps + 19 elsereport_status ← primed
14local report_status→ primed = "primed"15if co_status == "dead" then16 report_status = "drained"17elseif steps >= 2 then18 report_status = "flowing"19end2021print("resumes=" .. resumes1 .. " steps=" .. steps1 .. " status=" .. report_statusprimed)outputresumes=1 steps=1 status=primed
resumes ← 3, yields ← 2, steps ← 0, co_status ← suspended
1local resumes→ 3 = 32local yields→ 2 = 23local steps→ 0 = 04local co_status→ suspended = "suspended"attempt = 1, resumes do
pass 1 of 36for attempt1 = 1, resumes3 do7 if attempt <= yields then8 steps = steps + 1All 3 passes — pass 1 is the card above pass attemptyieldsstepsco_status1 1 2 0 → 1 — 2 2 2 1 → 2 — 3 3 — — dead steps ← 1
pass 1 of 26for attempt = 1, resumes do7 if attempt1 <= yields2 then8 steps→ 1 = steps + 19 elsesteps ← 2
pass 2 of 26for attempt = 1, resumes do7 if attempt2 <= yields2 then8 steps→ 2 = steps + 19 elseco_status ← dead
8 steps = steps + 19else10 co_status→ dead = "dead"11endreport_status ← primed
14local report_status→ primed = "primed"15if co_status == "dead" thenreport_status ← drained
14local report_status = "primed"15if co_statusdead == "dead" then16 report_status→ drained = "drained"17elseif steps >= 2 thenprint("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. rep…
21print("resumes=" .. resumes3 .. " steps=" .. steps2 .. " status=" .. report_statusdrained)outputresumes=3 steps=2 status=drained