From cbe1cd5e446b09cdab9ae0b42102971e4a96c50e Mon Sep 17 00:00:00 2001 From: rajames Date: Wed, 7 Oct 2026 20:16:58 -0400 Subject: [PATCH] feat(v4.0.0): a line from the console breaks a wait Text for a node from its console, arriving while the node waits for an answer (AWAIT), is kept as any message is; the wait ends in error 21, Interrupted; and the text is then done as usual. Console text for another node, passing through a node that is waiting, does not end its wait. On the hosted program 5 AWAIT ended the program with "the node stopped". The boot now reports that the line is waiting, the host reads the next line and hands it over, which breaks the wait, and then has the kept line done. The bare-metal host does the same; it is booted in the commit that follows. test_host_mesh.c: 76 checks, both widths and the sanitizers. hosted-check types 5 AWAIT and two more lines: Interrupted, then 3 and 56. Co-Authored-By: Claude Opus 5.5 --- capsules/BLOCK_MAP.md | 2 +- capsules/v4/nucleus-64.f18 | Bin 52408 -> 54272 bytes v4/Makefile | 2 ++ v4/capsule/quit.v4 | 11 ++++++++++- v4/include/v4/boot.h | 10 ++++++++++ v4/system/boot.c | 4 +++- v4/tests/test_host_mesh.c | 11 +++++++++++ v4/tools/hosted.c | 15 +++++++++++++++ 8 files changed, 52 insertions(+), 3 deletions(-) diff --git a/capsules/BLOCK_MAP.md b/capsules/BLOCK_MAP.md index b8a46f22..322cbb52 100644 --- a/capsules/BLOCK_MAP.md +++ b/capsules/BLOCK_MAP.md @@ -1,5 +1,5 @@ # Capsule Block Manifest — Auto-generated - + diff --git a/capsules/v4/nucleus-64.f18 b/capsules/v4/nucleus-64.f18 index 1f73d1a15b58698e784d2dba069f37cc8840e7c5..c156aa3c30d3b2f8bfd75c0ccf3d2d6ead6075db 100644 GIT binary patch literal 54272 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 UNKNOWN WORD: 'T{'$$" $(BINDIR)/after-post-amd64.txt || { echo "hosted-check: POST's harness is on the node"; exit 1; } @printf '5 7 PORT!\n1 2 + .\n' | $(BINDIR)/starforth4-amd64 > $(BINDIR)/noone-amd64.txt 2>&1; true @grep -q '^ok> No one on that port$$' $(BINDIR)/noone-amd64.txt && grep -q '^ok> 3 ok$$' $(BINDIR)/noone-amd64.txt || { echo "hosted-check: a write to a port with no one on it was not an error the node came back from"; cat $(BINDIR)/noone-amd64.txt | tail -4; exit 1; } + @printf '5 AWAIT\n1 2 + .\n7 8 * .\n' | $(BINDIR)/starforth4-amd64 > $(BINDIR)/await-amd64.txt 2>&1; true + @grep -q '^ok> Interrupted$$' $(BINDIR)/await-amd64.txt && grep -q '^ok> 3 ok$$' $(BINDIR)/await-amd64.txt && grep -q '^ok> 56 ok$$' $(BINDIR)/await-amd64.txt || { echo "hosted-check: a line typed while the node waited did not break the wait and then run"; tail -6 $(BINDIR)/await-amd64.txt; exit 1; } @$(BINDIR)/starforth4-postfail < /dev/null > $(BINDIR)/postfail.txt; test $$? -ne 0 || { echo "hosted-check: a boot with a failing case did not fail"; exit 1; } @grep -q '^POST FAIL: fail.wrong out<5 5 $$' $(BINDIR)/postfail.txt || { echo "hosted-check: the failing case was not named"; cat $(BINDIR)/postfail.txt; exit 1; } @grep -q '^POST FAIL: fail.many outes, b->h); @@ -150,6 +151,7 @@ static int run_line(const v4_boot *b, const char *text, unsigned len, char *keep continue; } if (n->read_port != CONSOLE_PORT && n->read_port != KERNEL_PORT && v4_node_port_gone(n, V4_ERROR_NO_ONE)) continue; /* reading one port, with no one on it */ + if (n->read_port == V4_PORT_ANY) return V4_BOOT_LINE_WAITING; /* waiting for an answer: only the console can end that */ return V4_BOOT_LINE_STOPPED; /* waiting for what will not come */ } if (v4_image_waiting(n, b->im)) { /* the text is reading the keyboard */ diff --git a/v4/tests/test_host_mesh.c b/v4/tests/test_host_mesh.c index 810d0aef..871e2b96 100644 --- a/v4/tests/test_host_mesh.c +++ b/v4/tests/test_host_mesh.c @@ -317,6 +317,17 @@ int main(void) CHECK(is_empty(tell(11, ": P12 S\" 1 DROP\" 12 SEND ; P12")) && pool[1].n.mem[REFUSED] == refused + 1, "having forgotten the way to 12, what node 11 sends there goes toward its centre, which has no way either, and is refused"); CHECK(is_empty(tell(10, "12 2 ROUTE")) && is_empty(tell(11, "12 3 ROUTE")) && strcmp(tell(12, "7 8 * ."), "56 ") == 0, "told the way again, they reach 12 as before"); } + /* a line from the console breaks a wait (MESH.md 7b.6) */ + CHECK(is_empty(tell(10, "12 AWAIT .")) && ended == 0 && pool[0].n.mem[AWAIT_FROM] == 12 && waiting(hera), "node 10 waits for an answer from 12, which is not going to send one"); + CHECK(is_empty(tell(11, "20 22 + .")) && ended == 0 && pool[0].n.mem[AWAIT_FROM] == 12, "text from the console for node 11 comes to node 10 on its way: node 10 keeps it, and goes on waiting"); + { + const char *r = tell(10, "65 EMIT"); + CHECK(strstr(r, "Interrupted\n") != NULL && pool[0].n.mem[AWAIT_FROM] == 0, "text from the console for node 10 itself ends its wait, with an error that says so: \"%s\"", r); + CHECK(strstr(r, "A") != NULL && strstr(r, "42 ") != NULL && ended == 3, "the line is then done as usual, and so is what was kept for node 11: \"%s\", %d ended", r, ended); + CHECK(strstr(r, "Interrupted\n") < strstr(r, "A"), "the wait ends before the line that ended it is done"); + } + CHECK(strcmp(tell(10, "1 2 + ."), "3 ") == 0 && waiting(hera) && waiting(mid) && waiting(far), "and all three go on as before"); + CHECK(strstr(tell(10, "5 NO-ROUTE"), "ERROR") == NULL && strcmp(tell(11, "20 22 + ."), "42 ") == 0, "forgetting the way to a node there was no way to changes nothing"); printf(" %d checks, %d failures\n", checks, failures); diff --git a/v4/tools/hosted.c b/v4/tools/hosted.c index 5f6acce5..5c809ed9 100644 --- a/v4/tools/hosted.c +++ b/v4/tools/hosted.c @@ -75,6 +75,21 @@ int main(void) len = strlen(line); if (len && line[len - 1] == '\n') len--; how = v4_boot_line(&boot, line, (unsigned)len); + /* The line is waiting for an answer no one here can send. The next + * line typed breaks the wait: the line that was waiting ends in an + * error, and then the line just typed is done (boot.h). */ + while (how == V4_BOOT_LINE_WAITING) { + fflush(stdout); + if (!fgets(line, sizeof line, stdin)) { putchar('\n'); return 0; } + len = strlen(line); + if (len && line[len - 1] == '\n') len--; + how = v4_boot_line(&boot, line, (unsigned)len); + if (how == V4_BOOT_LINE_TOO_LONG) { fputs("Line too long\n ERROR\n", stdout); how = V4_BOOT_LINE_WAITING; continue; } + if (how == V4_TEXT_ERROR) fputs(" ERROR\nok> ", stdout); + else if (how == V4_TEXT_COMPLETED) fputs(" ok\nok> ", stdout); + else break; + how = v4_boot_line(&boot, 0, 0); + } if (how == V4_TEXT_COMPLETED) fputs(" ok\n", stdout); if (leaving) { fflush(stdout); return 0; } else if (how == V4_TEXT_ERROR) fputs(" ERROR\n", stdout);