fix(v4.0.0): step 6e review round 1 -- a take that does not take does nothing; output and answers wait at a middle node; no queue on the kernel's port; a printing wait is not interrupted
- The result of every take is looked at: a wire cut between the look and the take leaves nothing acted on (the text before run again, a refusal counted, a wait ended by an old answer, a way forgotten). - A node with no room to pass on what another printed, or its word of how text ended, leaves it on the wire it came by and moves it when there is room; what is behind it for the same port waits too. Sleep for room (9) is woken by room on any of the node's wires (engine; MESH.md 7d.3). - The lone node's host keeps no queue for the kernel's port: a message to it is error 18. The step limit is counted while the node waits for room. - A text waiting for room to print is not interrupted by console text; AWAIT is, as before. (BREAK?) is gone. - A GONE is believed only by the centre's port; unawaited answers let go are counted; nothing past a message's last character goes on a wire; AWAIT sets (AWAIT-FROM) only once the stack has been tried. - test_host_depth.c: ten paths, each run works or ends in one named stack error; it fails with (ROOM) or (ROOM-SERVE) taken out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
b1d09af043
commit
6a7d0aa27f
+65
-29
@@ -80,13 +80,17 @@ macro R-CLEAR RSTACK-DEPTH b! a !b endmacro
|
||||
OK: drop 1 jump (FINISH)
|
||||
GO: drop 0 jump (FINISH)
|
||||
|
||||
\ ( -- flag ) A GONE has been taken: its seven words are in (IN) and the
|
||||
\ node it is about in (ONE). It is believed only if this node's centre
|
||||
\ sent it (MESH.md 7b.4): the way to the node is then forgotten, and the
|
||||
\ flag is -1. Otherwise nothing is done, and 0.
|
||||
\ ( -- flag ) A GONE has been taken: its seven words are in (IN), the
|
||||
\ node it is about in (ONE), and (S-WIRE) is the wire it came by. It is
|
||||
\ believed only if it came by the port that leads to this node's centre
|
||||
\ and says it is from the centre (MESH.md 7b.4): the way to the node is
|
||||
\ then forgotten, and the flag is -1. Otherwise nothing is done, and 0.
|
||||
\ (As first built only what it said it was from was looked at, and one
|
||||
\ that came by another port was believed.)
|
||||
: (GONE?)
|
||||
(CENTRE) if NOT (IN)+1 a! @ xor if YES drop 0 ;
|
||||
(CENTRE) if NOT (IN)+1 a! @ xor if FROM drop 0 ;
|
||||
NOT: ;
|
||||
FROM: drop (ROUTE-DEFAULT) a! @ (PORT) - (S-WIRE) a! @ xor if YES drop 0 ;
|
||||
YES: drop (ONE) a! @ NO-ROUTE -1 ;
|
||||
|
||||
\ ( -- ) WAITING (MESH.md 7d.4). A node with nothing to do passes on
|
||||
@@ -94,17 +98,25 @@ macro R-CLEAR RSTACK-DEPTH b! a !b endmacro
|
||||
\ come for itself, the lowest port first and each wire from its front:
|
||||
\ text is taken, into TIB, and done: (LINE), and then (FINISH) says
|
||||
\ how it ended. But not unless the wire its answer goes by --
|
||||
\ the way to whoever sent it, or with none known the wire it
|
||||
\ came on -- has room for the answer, 8 cells. If it has not,
|
||||
\ the text stays on its wire and the node looks further; that
|
||||
\ room is kept from then until the answer has gone.
|
||||
\ the way to whoever sent it; with none known, or no one on
|
||||
\ that port, the wire it came on -- has room for the answer,
|
||||
\ 8 cells. If it has not, the text stays on its wire and the
|
||||
\ node looks further: there may be several such, on wires
|
||||
\ whose answers go different ways, and each is begun when
|
||||
\ its own has the room. That room is kept from then until
|
||||
\ the answer has gone.
|
||||
\ a NACK is taken and counted in (REFUSED)
|
||||
\ a GONE is taken, and believed if this node's centre sent it
|
||||
\ any other is dropped: an answer no one waits for, or what is not as
|
||||
\ any other is dropped, and counted in (LOST): an answer no one waits
|
||||
\ for, what a node printed that came here, or what is not as
|
||||
\ long as its type says.
|
||||
\ A TAKE THAT DOES NOT TAKE -- the wire was cut after the message was
|
||||
\ looked at -- leaves nothing to act on: no text is done and nothing is
|
||||
\ counted or believed for it.
|
||||
\ With nothing to begin it sleeps, executing nothing, until a message
|
||||
\ comes; or, if text is waiting for room for its answer, until that wire
|
||||
\ has the room or a message comes. Then it does all of this again.
|
||||
\ comes; or, if text is waiting for room for its answer, or (SERVE) left a
|
||||
\ message for want of room, until there is room on any wire that leads
|
||||
\ from it or a message comes. Then it does all of this again.
|
||||
\ It has fetched which wires have a message before it looks at any, and
|
||||
\ sleeps after: a message that comes while it looks wakes it at once, and
|
||||
\ one it left on a wire does not keep it awake (MESH.md 7d.3).
|
||||
@@ -117,23 +129,29 @@ macro R-CLEAR RSTACK-DEPTH b! a !b endmacro
|
||||
(SERVE) (MINE0)
|
||||
M: (MINE) if REST
|
||||
drop (IN)+2 a! @ -1 + if TEXT -3 + if NACK -1 + if GONE
|
||||
OTHER: drop 4 (DO) drop jump M \ let go
|
||||
OTHER: drop 4 (DO) drop (LOST) a! @ 1 + ! jump M \ let go, and counted
|
||||
NACK: drop (IN)+6 a! @ -4 + if N1 jump OTHER
|
||||
N1: drop (TAKE1) (REFUSED) a! @ 1 + ! jump M \ a message of this node's was refused: counted
|
||||
N1: drop (TAKE1) if N2 drop jump M \ not taken: nothing is done for it
|
||||
N2: drop (REFUSED) a! @ 1 + ! jump M \ a message of this node's was refused: counted
|
||||
GONE: drop (IN)+6 a! @ -4 + if G1 jump OTHER
|
||||
G1: drop (TAKE1) (GONE?) drop jump M
|
||||
G1: drop (TAKE1) if G2 drop jump M
|
||||
G2: drop (GONE?) drop jump M
|
||||
TEXT: drop
|
||||
(IN)+1 a! @ (WAY) -if T1 drop (S-WIRE) a! @ \ the way back; with none known, the wire it came on
|
||||
T1: (DONE-PORT) a! !
|
||||
8 (DONE-PORT) a! @ (ROOM?) -1 + if FULL drop jump START
|
||||
8 (DONE-PORT) a! @ (ROOM?) if START -1 + if FULL
|
||||
drop (S-WIRE) a! @ (DONE-PORT) a! ! \ no one is on that port: back by the wire it came on,
|
||||
8 (S-WIRE) a! @ (ROOM?) -1 + if FULL jump START \ if that has the room -- or has no one on it either
|
||||
FULL: drop (DEFER) a! @ -if LATER drop (DONE-PORT) a! @ (DEFER) a! ! (SKIP) jump M
|
||||
LATER: drop (SKIP) jump M
|
||||
REST: drop
|
||||
(DEFER) a! @ -if ROOM drop 8 (DO) drop jump L
|
||||
(DEFER) a! @ -if ROOM drop (SLEEP) jump L
|
||||
ROOM: (WIRE!) 8 (WIRE-A) b! !b 9 (DO) drop jump L
|
||||
START:
|
||||
START: drop
|
||||
(S-WIRE) a! @ dup (REPLY) a! ! (WIRE!)
|
||||
(MSG) (WIRE-A) b! !b TIB 2/ 2/ (WIRE-B) b! !b 2 (DO) drop \ its seven words, and its text
|
||||
(MSG) (WIRE-A) b! !b TIB 2/ 2/ (WIRE-B) b! !b 2 (DO) \ its seven words, and its text
|
||||
if TAKEN drop jump L \ not taken: the wire was cut since it was looked at
|
||||
TAKEN: drop
|
||||
0 (MSG)+6 a! @ TIB + C! \ a zero after the text
|
||||
(MSG)+6 a! @ SPAN a! !
|
||||
(DONE-PORT) a! @ (KEEP) a! ! \ the room for its answer is kept from here
|
||||
@@ -230,7 +248,9 @@ header NO-ROUTES
|
||||
\ (REFUSED), as a refusal that came back would be, and is error 19, Message
|
||||
\ refused; with no one on the port, error 18. Nothing is on a
|
||||
\ wire until the put, the last thing done. More characters than a message
|
||||
\ carries, or fewer than none, is error 12.
|
||||
\ carries, or fewer than none, is error 12. What lies after the text in
|
||||
\ this node's memory does not go with it: the last word is made zero past
|
||||
\ the last character.
|
||||
: (SEND-ON)
|
||||
push 1 (HDR)
|
||||
-if POS
|
||||
@@ -242,9 +262,16 @@ header NO-ROUTES
|
||||
3 + 2/ 2/ if NONE -1 +
|
||||
FOR dup C@ over 1 + C@ 8* + over 2 + C@ 8* 8* + over 3 + C@ 8* 8* 8* +
|
||||
(SEND^) b! @b a! !+ a !b 4 + NEXT
|
||||
drop jump PUT
|
||||
NONE: drop drop
|
||||
PUT: (SEND-TEXT) pop (PUT-ON)
|
||||
drop
|
||||
(OUT-HDR)+6 a! @ 3 and if PUT \ the last word: nothing in it past the last character
|
||||
(SEND^) b! @b -1 + a!
|
||||
-1 + if M1 -1 + if M2
|
||||
drop @ 16777215 and ! jump PUT0
|
||||
M2: drop @ 65535 and ! jump PUT0
|
||||
M1: drop @ 255 and ! jump PUT0
|
||||
NONE: drop
|
||||
PUT: drop
|
||||
PUT0: (SEND-TEXT) pop (PUT-ON)
|
||||
if SENT -1 + if FULL drop NODE-ERROR b! 18 !b ;
|
||||
FULL: drop (REFUSED) a! @ 1 + ! NODE-ERROR b! 19 !b ;
|
||||
SENT: drop ;
|
||||
@@ -273,6 +300,12 @@ header SEND-ON
|
||||
(ROUTE-DEFAULT) a! @ if NONE (PORT) - (NEAR) + a! @ ;
|
||||
NONE: ;
|
||||
|
||||
\ ( -- n ) the number of this node's console: the one it was told of, or
|
||||
\ with none told of, whoever sent the text it is doing
|
||||
: (A-CONSOLE)
|
||||
(CONSOLE) a! @ if C0 ;
|
||||
C0: drop (MSG)+1 a! @ ;
|
||||
|
||||
\ ( what -- how | ) the wait is over: 1 the answer has come, and its
|
||||
\ word, in (ONE), is left; 2 refused, error 19; 3 the node is gone, error
|
||||
\ 20; 4 a line from the console, error 21
|
||||
@@ -308,8 +341,8 @@ header SEND-ON
|
||||
\ has left too little ends "Stack overflow" with nothing taken off a wire.
|
||||
header AWAIT
|
||||
: AWAIT
|
||||
(AWAIT-FROM) a! ! 0 (A-SELF) a! !
|
||||
(ROOM)
|
||||
(ONE) a! ! (ROOM) \ if this faults, no one is waited for:
|
||||
(ONE) a! @ (AWAIT-FROM) a! ! 0 (A-SELF) a! ! \ (AWAIT-FROM) is set only when the stack has been tried
|
||||
L: (SERVE)
|
||||
(A-SELF) a! @ if SCAN drop 2 jump (A-END) \ this node's own message for that node came back to it
|
||||
SCAN: drop (MINE0)
|
||||
@@ -320,17 +353,20 @@ header AWAIT
|
||||
BREAK: drop 4 jump (A-END)
|
||||
ANSWER: drop (IN)+1 a! @ (AWAIT-FROM) a! @ xor if A1 jump KEEP
|
||||
A1: drop (IN)+6 a! @ -4 + if A2 jump KEEP
|
||||
A2: drop (TAKE1) 1 jump (A-END)
|
||||
A2: drop (TAKE1) if A3 drop jump M \ not taken: nothing is done for it
|
||||
A3: drop 1 jump (A-END)
|
||||
NACK: drop (IN)+6 a! @ -4 + if N1 jump KEEP
|
||||
N1: drop (TAKE1) (ONE) a! @ (AWAIT-FROM) a! @ xor if N2 \ about the node waited for?
|
||||
N1: drop (TAKE1) if N0 drop jump M
|
||||
N0: drop (ONE) a! @ (AWAIT-FROM) a! @ xor if N2 \ about the node waited for?
|
||||
drop (REFUSED) a! @ 1 + ! jump M \ another: counted
|
||||
N2: drop 2 jump (A-END)
|
||||
GONE: drop (IN)+6 a! @ -4 + if G1 jump KEEP
|
||||
G1: drop (TAKE1) (GONE?) if M0 \ only its centre is believed
|
||||
G1: drop (TAKE1) if G0 drop jump M
|
||||
G0: drop (GONE?) if M0 \ only its centre is believed
|
||||
drop (ONE) a! @ (AWAIT-FROM) a! @ xor if G2 drop jump M
|
||||
G2: drop 3 jump (A-END)
|
||||
M0: drop jump M
|
||||
SLEEP: drop 8 (DO) drop jump L
|
||||
SLEEP: drop (SLEEP) jump L
|
||||
|
||||
\ ( w port -- ) write a cell to the port, by its number. It waits until
|
||||
\ the neighbour has taken it. This is how a node is sent a capsule of F18
|
||||
|
||||
Reference in New Issue
Block a user