starkernel: item 4.2 -- Hermes native on the Stadium (complete)
Migrates Hermes's message/channel lifecycle onto the Stadium's unified heat/capacity economy: MSG-ALLOC/FREE-NODE and CH-ALLOC/FREE-NODE now route entirely through stadium_admit()/stadium_evict(), replacing the old local free-list + independent heat-field mechanism. Eight kernel-only STADIUM-* FORTH primitives (ADMIT, EVICT, RES@, RES-PULL, RES-PUSH, HEAT@, HEAT!, WORD-HEAT), VM.stadium_vm_id threaded through all three vm_core.c dispatch sites (replacing item 4.1's hardcoded vm_uuid_hera()), and the stadium_owner[idx] fix so evict-credit lands in the VM that actually admitted a patron, not whoever owned cell 0. This session's own contribution, on top of that pre-existing implementation: found and fixed two bugs blocking the item's own K≡1.0 conservation self-check (HERMES-K was reading 0, not 65536): - Q.SLOT admission-heat fix (capsules/hermes/init.4th): MSG-SEND/ CH-ACCEPT admitted with Q.1 (the entire fleet-wide "1.0" unit) per item, a leftover from before the Stadium migration when each message/channel had its own unconstrained heat field. Instantly drained the shared, finite reservoir. - Reservoir floor for word-execution admission (stadium_words.c): stadium_word_dispatch() (item 4.1) pulls STADIUM_WORD_HEAT_QUANTUM on every word dispatch, not just first admission -- exhausts a VM's entire reservoir in ~32 dispatches, starving any application-level economy sharing that VM's reservoir before it gets a chance to pull anything. word_dispatch_pull() now clamps word-execution's own pulls to leave a Q48_ONE/3 floor (same fair-share figure COMMON-CH's own floor already uses); application-level pulls are unaffected. - STADIUM-WORD-HEAT primitive + stadium_words_resident_heat(): the floor deliberately leaves word-execution residents holding real heat, invisible to HERMES-K's original formula (MSG+CH+reservoir, no term for word patrons). Adding this term closes K to exactly 65536 on all three architectures. Also rules on two open scope questions in FABRIC.md: MBR-ALLOC/ MBR-FREE-NODE stay off the Stadium (membership records have no heat field, never did -- the acceptance bullet's inclusion of them was a completeness gesture predating a check of the actual layout), and records the effort number (12 implementation files, +759/-120 lines). Verified: all three architectures boot clean, full self-test passes, Stadium conservation closes exactly (resident_sum + reservoir = Q48_ONE) at both the C/Stadium level and the FORTH-level HERMES-K check. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
0a7f144367
commit
5a28458b21
+40
-32
@@ -1,5 +1,5 @@
|
||||
# Capsule Block Manifest — Auto-generated
|
||||
<!-- Generated by mkcapsule --manifest 2026-08-05T17:10:15Z -->
|
||||
<!-- Generated by mkcapsule --manifest 2026-08-07T05:36:57Z -->
|
||||
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
|
||||
<!-- Hand-written justifications and immutability notes live -->
|
||||
<!-- in MANIFEST.md alongside this auto-generated index. -->
|
||||
@@ -13,7 +13,7 @@
|
||||
| `common:msg.4th` | 4055 | `0xa99c5bcd3877f80e` |
|
||||
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x3d4549142d91ec20` |
|
||||
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xb6ecf5374e8ee77c` |
|
||||
| `hermes:init.4th` | 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153 | `0xbb77f3ac463f507f` |
|
||||
| `hermes:init.4th` | 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4175, 4176 | `0x85c7b311d1e5bf97` |
|
||||
| `init-0.4th` | 2200, 2201 | `0xd0a9550baf786bb3` |
|
||||
| `init-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` |
|
||||
| `init-2.4th` | 4506, 4515, 4525, 4535, 4545 | `0xf113b3d0bcccae47` |
|
||||
@@ -109,28 +109,28 @@
|
||||
| 4063 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4064 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4065 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4100 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4101 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4102 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4103 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4104 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4105 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4106 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4107 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4108 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4109 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4100 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4101 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4102 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4103 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4104 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4105 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4106 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4107 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4108 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4109 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4110 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4111 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4112 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4113 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4114 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4115 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4116 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4117 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4118 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4119 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4120 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4121 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4114 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4115 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4116 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4117 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4118 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4119 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4120 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4121 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4122 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4123 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4124 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
@@ -151,18 +151,24 @@
|
||||
| 4139 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4140 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4141 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4142 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4143 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4144 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4145 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4146 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4147 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4148 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4149 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4150 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4151 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4152 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4153 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
|
||||
| 4142 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4143 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4144 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4145 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4146 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4147 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4148 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4149 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4150 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4151 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4152 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4153 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4154 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4155 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4156 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4157 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4158 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4159 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4160 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4161 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4162 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
@@ -178,6 +184,8 @@
|
||||
| 4172 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4173 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4174 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
|
||||
| 4175 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4176 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
|
||||
| 4300 | `process.4th` | `0x781afc1dbd0294f7` | ok |
|
||||
| 4301 | `process.4th` | `0x781afc1dbd0294f7` | ok |
|
||||
| 4406 | `init-1.4th` | `0x63e251adb0a03613` | ok |
|
||||
|
||||
+116
-45
@@ -15,16 +15,29 @@ Block 4100
|
||||
64 CONSTANT MBR-MAX
|
||||
65208 CONSTANT Q-DECAY
|
||||
255 CONSTANT MSG-DELIVERED
|
||||
Block 4155
|
||||
( item 4.2 -- StadiumBehaviour tags, match stadium.h's enum )
|
||||
0 CONSTANT SB-MIGRATE
|
||||
1 CONSTANT SB-DELIVER
|
||||
2 CONSTANT SB-EXPIRE
|
||||
3 CONSTANT SB-COOL
|
||||
-1 CONSTANT STADIUM-NONE
|
||||
( item 4.2 -- per-item admission heat for MSG-SEND/CH-ACCEPT. )
|
||||
( Remaining reservoir after COMMON-CH's Q.1/3 floor, split )
|
||||
( evenly across MSG-MAX messages + non-COMMON CH-MAX-1 slots. )
|
||||
Q.1 Q.1 3 / - MSG-MAX CH-MAX 1- + / CONSTANT Q.SLOT
|
||||
Block 4101
|
||||
( Hermes v1 — arenas and free-list roots )
|
||||
( Hermes v1 -- arenas. item 4.2: heat/capacity via Stadium; )
|
||||
( MBR keeps its own free list (not part of heat economy). )
|
||||
CREATE MSG-ARENA MSG-MAX MSG-CELLS * CELLS ALLOT
|
||||
CREATE CH-ARENA CH-MAX CH-CELLS * CELLS ALLOT
|
||||
CREATE MBR-ARENA MBR-MAX MBR-CELLS * CELLS ALLOT
|
||||
VARIABLE MSG-FREE-HEAD
|
||||
VARIABLE CH-FREE-HEAD
|
||||
VARIABLE MSG-ALLOC-SLOT
|
||||
VARIABLE CH-ALLOC-SLOT
|
||||
VARIABLE MBR-FREE-HEAD
|
||||
VARIABLE MSG-SEQ
|
||||
VARIABLE CH-ACTIVE
|
||||
VARIABLE COMMON-CH
|
||||
Block 4142
|
||||
( Hermes v1 — VM name routing table )
|
||||
8 CONSTANT VM-MAX
|
||||
@@ -39,23 +52,19 @@ CREATE VM-NAME-LENS VM-MAX CELLS ALLOT
|
||||
S" Hermes" 1 VM-NAME-REG
|
||||
S" Artemis" 2 VM-NAME-REG ;
|
||||
Block 4102
|
||||
( Hermes v1 — MSG-INIT-FREE CH-INIT-FREE )
|
||||
( Hermes v1 -- INIT-FREE. item 4.2: stamps STADIUM-NONE into )
|
||||
( each slot's stadium-cell field (msg off 5, ch off 3). )
|
||||
( Raw offsets: accessors aren't defined yet in file order. )
|
||||
: MSG-INIT-FREE ( -- )
|
||||
MSG-MAX 1- 0 DO
|
||||
I MSG-CELLS * CELLS MSG-ARENA +
|
||||
I 1+ MSG-CELLS * CELLS MSG-ARENA + SWAP !
|
||||
LOOP
|
||||
0 MSG-MAX 1- MSG-CELLS * CELLS MSG-ARENA + !
|
||||
MSG-ARENA MSG-FREE-HEAD ! ;
|
||||
MSG-MAX 0 DO
|
||||
STADIUM-NONE I MSG-CELLS * CELLS MSG-ARENA + 5 CELLS + !
|
||||
LOOP ;
|
||||
: CH-INIT-FREE ( -- )
|
||||
CH-MAX 1- 0 DO
|
||||
I CH-CELLS * CELLS CH-ARENA +
|
||||
I 1+ CH-CELLS * CELLS CH-ARENA + SWAP !
|
||||
LOOP
|
||||
0 CH-MAX 1- CH-CELLS * CELLS CH-ARENA + !
|
||||
CH-ARENA CH-FREE-HEAD ! ;
|
||||
CH-MAX 0 DO
|
||||
STADIUM-NONE I CH-CELLS * CELLS CH-ARENA + 3 CELLS + !
|
||||
LOOP ;
|
||||
Block 4103
|
||||
( Hermes v1 — MBR-INIT-FREE MSG alloc/free )
|
||||
( Hermes v1 -- MBR-INIT-FREE (member free list, untouched) )
|
||||
: MBR-INIT-FREE ( -- )
|
||||
MBR-MAX 1- 0 DO
|
||||
I MBR-CELLS * CELLS MBR-ARENA +
|
||||
@@ -63,26 +72,76 @@ Block 4103
|
||||
LOOP
|
||||
0 MBR-MAX 1- MBR-CELLS * CELLS MBR-ARENA + !
|
||||
MBR-ARENA MBR-FREE-HEAD ! ;
|
||||
: MSG-ALLOC ( -- addr|0 )
|
||||
MSG-FREE-HEAD @ DUP 0= IF EXIT THEN
|
||||
DUP @ MSG-FREE-HEAD !
|
||||
DUP MSG-CELLS CELLS 0 FILL ;
|
||||
Block 4156
|
||||
( item 4.2 -- MSG-ALLOC: finds a free slot (TYPE=0) first, )
|
||||
( admits into Stadium only once confirmed free (no leak). )
|
||||
: MSG-FIND-FREE-SLOT ( -- addr|0 )
|
||||
MSG-ARENA MSG-MAX 0 DO
|
||||
DUP @ 0= IF UNLOOP EXIT THEN
|
||||
MSG-CELLS CELLS +
|
||||
LOOP DROP 0 ;
|
||||
Block 4175
|
||||
( item 4.2 -- MSG-ALLOC: pulls heat from reservoir first, )
|
||||
( admits (identity=idx, heat=pulled), rolls back on refusal. )
|
||||
: MSG-ALLOC ( heat -- addr|0 )
|
||||
MSG-FIND-FREE-SLOT DUP 0= IF SWAP DROP EXIT THEN
|
||||
MSG-ALLOC-SLOT !
|
||||
STADIUM-RES-PULL
|
||||
MSG-ALLOC-SLOT @ MSG-ARENA - MSG-CELLS CELLS /
|
||||
SWAP DUP >R
|
||||
SB-DELIVER STADIUM-ADMIT
|
||||
DUP STADIUM-NONE = IF
|
||||
DROP R> STADIUM-RES-PUSH 0 EXIT
|
||||
THEN
|
||||
R> DROP
|
||||
MSG-ALLOC-SLOT @ MSG-CELLS CELLS 0 FILL
|
||||
MSG-ALLOC-SLOT @ 5 CELLS + !
|
||||
MSG-ALLOC-SLOT @ ;
|
||||
Block 4157
|
||||
( item 4.2 -- MSG-FREE-NODE: evict from Stadium, clear field )
|
||||
: MSG-FREE-NODE ( addr -- )
|
||||
MSG-FREE-HEAD @ OVER ! MSG-FREE-HEAD ! ;
|
||||
DUP 5 CELLS + @ STADIUM-EVICT DROP
|
||||
DUP 5 CELLS + STADIUM-NONE SWAP !
|
||||
DROP ;
|
||||
Block 4104
|
||||
( Hermes v1 — CH MBR alloc/free )
|
||||
: CH-ALLOC ( -- addr|0 )
|
||||
CH-FREE-HEAD @ DUP 0= IF EXIT THEN
|
||||
DUP @ CH-FREE-HEAD !
|
||||
DUP CH-CELLS CELLS 0 FILL ;
|
||||
: CH-FREE-NODE ( addr -- )
|
||||
CH-FREE-HEAD @ OVER ! CH-FREE-HEAD ! ;
|
||||
( Hermes v1 -- MBR alloc/free (unchanged; not heat economy) )
|
||||
: MBR-ALLOC ( -- addr|0 )
|
||||
MBR-FREE-HEAD @ DUP 0= IF EXIT THEN
|
||||
DUP @ MBR-FREE-HEAD !
|
||||
DUP MBR-CELLS CELLS 0 FILL ;
|
||||
: MBR-FREE-NODE ( addr -- )
|
||||
MBR-FREE-HEAD @ OVER ! MBR-FREE-HEAD ! ;
|
||||
Block 4158
|
||||
( item 4.2 -- CH-FIND-FREE-SLOT. No TYPE field, so freeness )
|
||||
( is stadium-cell = STADIUM-NONE. CH-ALLOC -> block 4176. )
|
||||
: CH-FIND-FREE-SLOT ( -- addr|0 )
|
||||
CH-ARENA CH-MAX 0 DO
|
||||
DUP 3 CELLS + @ STADIUM-NONE = IF UNLOOP EXIT THEN
|
||||
CH-CELLS CELLS +
|
||||
LOOP DROP 0 ;
|
||||
Block 4176
|
||||
( item 4.2 -- CH-ALLOC: pulls heat from reservoir first, )
|
||||
( admits (identity=idx, heat=pulled), rolls back on refusal. )
|
||||
: CH-ALLOC ( heat -- addr|0 )
|
||||
CH-FIND-FREE-SLOT DUP 0= IF SWAP DROP EXIT THEN
|
||||
CH-ALLOC-SLOT !
|
||||
STADIUM-RES-PULL
|
||||
CH-ALLOC-SLOT @ CH-ARENA - CH-CELLS CELLS /
|
||||
SWAP DUP >R
|
||||
SB-COOL STADIUM-ADMIT
|
||||
DUP STADIUM-NONE = IF
|
||||
DROP R> STADIUM-RES-PUSH 0 EXIT
|
||||
THEN
|
||||
R> DROP
|
||||
CH-ALLOC-SLOT @ CH-CELLS CELLS 0 FILL
|
||||
CH-ALLOC-SLOT @ 3 CELLS + !
|
||||
CH-ALLOC-SLOT @ ;
|
||||
Block 4159
|
||||
( item 4.2 -- CH-FREE-NODE: evict from Stadium, clear field )
|
||||
: CH-FREE-NODE ( addr -- )
|
||||
DUP 3 CELLS + @ STADIUM-EVICT DROP
|
||||
DUP 3 CELLS + STADIUM-NONE SWAP !
|
||||
DROP ;
|
||||
Block 4105
|
||||
( Hermes v1 — message field accessors )
|
||||
: MSG-TYPE@ ( m -- n ) @ ;
|
||||
@@ -95,8 +154,9 @@ Block 4105
|
||||
: MSG-PADDR! ( a m -- ) 3 CELLS + ! ;
|
||||
: MSG-PLEN@ ( m -- u ) 4 CELLS + @ ;
|
||||
: MSG-PLEN! ( u m -- ) 4 CELLS + ! ;
|
||||
: MSG-HEAT@ ( m -- q ) 5 CELLS + @ ;
|
||||
: MSG-HEAT! ( q m -- ) 5 CELLS + ! ;
|
||||
( item 4.2: offset 5 = Stadium cell idx. MSG-HEAT@/! -> 4154. )
|
||||
: MSG-STADIUM-CELL@ ( m -- cell ) 5 CELLS + @ ;
|
||||
: MSG-STADIUM-CELL! ( cell m -- ) 5 CELLS + ! ;
|
||||
: MSG-SEQ@ ( m -- n ) 6 CELLS + @ ;
|
||||
: MSG-SEQ! ( n m -- ) 6 CELLS + ! ;
|
||||
Block 4143
|
||||
@@ -114,14 +174,22 @@ Block 4106
|
||||
: CH-OWNER! ( n c -- ) 1 CELLS + ! ;
|
||||
: CH-STATE@ ( c -- n ) 2 CELLS + @ ;
|
||||
: CH-STATE! ( n c -- ) 2 CELLS + ! ;
|
||||
: CH-HEAT@ ( c -- q ) 3 CELLS + @ ;
|
||||
: CH-HEAT! ( q c -- ) 3 CELLS + ! ;
|
||||
( item 4.2: offset 3 = Stadium cell index. CH-HEAT@/! -> 4154. )
|
||||
: CH-STADIUM-CELL@ ( c -- cell ) 3 CELLS + @ ;
|
||||
: CH-STADIUM-CELL! ( cell c -- ) 3 CELLS + ! ;
|
||||
: CH-MBRS@ ( c -- a ) 4 CELLS + @ ;
|
||||
: CH-MBRS! ( a c -- ) 4 CELLS + ! ;
|
||||
: CH-NEXT@ ( c -- a ) 5 CELLS + @ ;
|
||||
: CH-NEXT! ( a c -- ) 5 CELLS + ! ;
|
||||
: MBR-NEXT@ ( m -- a ) @ ;
|
||||
: MBR-VM@ ( m -- n ) 1 CELLS + @ ;
|
||||
Block 4154
|
||||
( item 4.2 -- composed MSG/CH-HEAT@/!, same names/stacks, )
|
||||
( new bodies routed via Stadium. Callers need no changes. )
|
||||
: MSG-HEAT@ ( m -- q ) MSG-STADIUM-CELL@ STADIUM-HEAT@ ;
|
||||
: MSG-HEAT! ( q m -- ) MSG-STADIUM-CELL@ STADIUM-HEAT! ;
|
||||
: CH-HEAT@ ( c -- q ) CH-STADIUM-CELL@ STADIUM-HEAT@ ;
|
||||
: CH-HEAT! ( q c -- ) CH-STADIUM-CELL@ STADIUM-HEAT! ;
|
||||
Block 4107
|
||||
( Hermes v1 — deliver )
|
||||
VARIABLE MSG-LAST-MSG
|
||||
@@ -134,17 +202,19 @@ VARIABLE MSG-LAST-MSG
|
||||
DUP MSG-PADDR@ OVER MSG-PLEN@
|
||||
ROT MSG-TO@ IDX>NAME VM-EXEC ;
|
||||
Block 4144
|
||||
( Hermes v1 — MSG-SEND )
|
||||
( Hermes v1 -- MSG-SEND. item 4.2: heat -> MSG-ALLOC's )
|
||||
( admission directly (zero-heat would lose eviction-fallback )
|
||||
( density comparisons), not set afterward as before. )
|
||||
: MSG-SEND ( type from to paddr plen ch -- )
|
||||
MSG-ALLOC DUP 0= IF 2DROP 2DROP 2DROP DROP EXIT THEN
|
||||
Q.SLOT MSG-ALLOC DUP 0= IF 2DROP 2DROP 2DROP DROP EXIT THEN
|
||||
>R
|
||||
MSG-SEQ @ 1+ DUP MSG-SEQ ! R@ MSG-SEQ!
|
||||
R@ MSG-CH!
|
||||
R@ MSG-PLEN! R@ MSG-PADDR!
|
||||
R@ MSG-TO! R@ MSG-FROM! DUP R@ MSG-TYPE! R@ MSG-ORIG-TYPE!
|
||||
Q.1 R@ MSG-HEAT! R> DROP ;
|
||||
R> DROP ;
|
||||
Block 4108
|
||||
( Hermes v1 — message cooling )
|
||||
( Hermes v1 — MSG-COOL-ONE/ALL: linear decay per tick )
|
||||
VARIABLE MSG-SCAN
|
||||
: MSG-COOL-ONE ( m -- )
|
||||
DUP MSG-HEAT@ Q-DECAY Q.* SWAP MSG-HEAT! ;
|
||||
@@ -236,17 +306,17 @@ Block 4115
|
||||
CH-SCAN !
|
||||
REPEAT ;
|
||||
Block 4116
|
||||
( Hermes v1 — COMMON channel + HERMES-TICK )
|
||||
( COMMON floor = Q.1/3: Hermes's fair share, VM-COUNT=3 )
|
||||
VARIABLE COMMON-CH
|
||||
( Hermes v1 -- COMMON + HERMES-TICK. floor=Q.1/3, VM-COUNT=3 )
|
||||
( COMMON-CH VARIABLE now in block 4101; see CH-REAP-SAFE 4115 )
|
||||
: COMMON-INIT ( -- )
|
||||
CH-ALLOC DUP COMMON-CH !
|
||||
Q.1 3 / CH-ALLOC DUP COMMON-CH !
|
||||
0 OVER CH-ID! 0 OVER CH-OWNER!
|
||||
CH-OPEN OVER CH-STATE!
|
||||
Q.1 3 / OVER CH-HEAT!
|
||||
0 OVER CH-MBRS!
|
||||
CH-ACTIVE @ OVER CH-NEXT!
|
||||
CH-ACTIVE ! ;
|
||||
( item 4.2: floor-refresh now reservoir-constrained, may no-op )
|
||||
( under pressure (was unconstrained write before). Watch log. )
|
||||
: HERMES-TICK ( -- )
|
||||
MSG-DELIVER-ALL MSG-REDELIVER-NACKED
|
||||
MSG-COOL-ALL MSG-REAP
|
||||
@@ -254,8 +324,10 @@ VARIABLE COMMON-CH
|
||||
Q.1 3 / COMMON-CH @ CH-HEAT! ;
|
||||
Block 4147
|
||||
( Hermes v1 — HERMES-K + WELCOME )
|
||||
( item 4.2: +STADIUM-WORD-HEAT so word patrons count -- 25.7 )
|
||||
: HERMES-K ( -- q48 )
|
||||
MSG-TOTAL-HEAT CH-TOTAL-HEAT + ;
|
||||
MSG-TOTAL-HEAT CH-TOTAL-HEAT + STADIUM-RES@ +
|
||||
STADIUM-WORD-HEAT + ;
|
||||
: WELCOME ( -- ) LOG-INFO" Hermes: loaded" ;
|
||||
WELCOME
|
||||
Block 4117
|
||||
@@ -294,11 +366,10 @@ Block 4119
|
||||
Block 4148
|
||||
( Hermes v1 — channel ops: accept confirm close )
|
||||
: CH-ACCEPT ( -- ch|0 )
|
||||
CH-ALLOC DUP 0= IF EXIT THEN
|
||||
Q.SLOT CH-ALLOC DUP 0= IF EXIT THEN
|
||||
1 CH-MINT-ID OVER CH-ID!
|
||||
1 OVER CH-OWNER!
|
||||
CH-NEGOTIATING OVER CH-STATE!
|
||||
Q.1 OVER CH-HEAT!
|
||||
0 OVER CH-MBRS!
|
||||
CH-ACTIVE @ OVER CH-NEXT!
|
||||
DUP CH-ACTIVE ! ;
|
||||
|
||||
Reference in New Issue
Block a user