fix(v4.0.0): what a node passes on waits with it, offered -- a relay is not held by a stuck node
Found after the last commit: a message being passed on toward a node that was stuck held the node passing it on in the wait, taking in what came but serving none of it; text typed for a stuck node left Hera deaf. And a node that had done text for a sender that then stuck waited on it to give its answer. A node with nothing to do now deals first with what is for itself; then offers at once the first message for each port and each refusal owed, and sleeps in the wait. What is taken is written and done with; the rest stays with the messages waiting, in order. How text ended is put with the messages waiting, not written from (FINISH). The stack is kept as shallow between lines as it was. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
482cc75faf
commit
1c720ab2c7
@@ -530,7 +530,16 @@ int main(void)
|
||||
CHECK(strcmp(tell(13, ": SPIN BEGIN 0 UNTIL ; SPIN"), "(still running)") == 0, "node 13 is stuck in a loop");
|
||||
CHECK(strcmp(tell(12, ": W13 13 AWAIT . ; W13"), "(still running)") == 0 && node_numbered(12)->mem[AWAIT_FROM] == 13 && waiting(12),
|
||||
"node 12, which is not wired to it, waits for its answer");
|
||||
/* while it is stuck it holds up no one (MESH.md 7c): text for it waits with Hera, who goes on */
|
||||
(void)tell(13, "1 DROP");
|
||||
CHECK(ended == 0 && v4_node_in_wait(node_numbered(10)) && !node_numbered(10)->asking && node_numbered(10)->mem[MQ_COUNT] > 0,
|
||||
"text typed for the stuck node waits with Hera, offered: she sleeps in the wait, not blocked writing");
|
||||
(void)tell(11, "11 100 * .");
|
||||
CHECK(strcmp(printed, "1100 ") == 0 && ended == 1, "text typed for another node is passed on and done meanwhile: \"%s\"", printed);
|
||||
(void)tell(10, "1 2 + .");
|
||||
CHECK(strcmp(printed, "3 ") == 0 && ended == 1, "and so is text for Hera herself: \"%s\"", printed);
|
||||
(void)tell(10, "13 KILL");
|
||||
CHECK(node_numbered(10)->mem[MQ_COUNT] == 0, "killing it, she lets go what she kept for it");
|
||||
CHECK(node_numbered(13) == NULL && strstr(printed, "Node gone") != NULL && node_numbered(12)->mem[AWAIT_FROM] == 0 && waiting(12),
|
||||
"Hera kills node 13: node 12's wait ends, with an error that says the node is gone: \"%s\"", printed);
|
||||
step_limit = 30000000ul;
|
||||
|
||||
Reference in New Issue
Block a user