ludic.net: a message's record, bytes and lists kept - queued ones back to a pool once sent or taken, the inbox's two drains on, a read text interned

np_queue made a NetMsg and a buffer per message, every flush a new keep list, and every message
that came in a NetMessage and a buffer; nr_text a new string per text read. A party plays at
dozens a second, so all of it is kept now: a pool of MTU-sized records for the queue (a peer's two
lists swapped by the flush), the inbox's records in two halves swapped when a message finds the
inbox empty, net_written's one record, a relay hello's and a STUN request's bytes in one scratch
buffer, and the texts read out interned. Tests: 6000 messages with the heap flat (Os.heap_bytes),
and an inbox record that holds still across a drain and comes back two drains on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-28 13:25:46 +03:00
parent e6729b3123
commit ca69a3f9ae
11 changed files with 134 additions and 20 deletions

View file

@ -27,6 +27,16 @@ The host is pid 1 and hands out 2 upwards (`net_accept`). Kind 1 is `NET_HELLO`,
stranger may send a host; kind 0 is the heartbeat, never delivered. Until the game accepts a
stranger, nothing else from it reaches the inbox.
## Nothing a message makes is new
A party sends and takes dozens of messages a second for as long as it plays, and Ludic frees
nothing, so the package keeps what a message needs. A queued message's record and its bytes go back
to a pool once it is sent (unreliable) or taken (reliable); a peer's queue is two lists swapped by a
flush. An inbox message's record comes back two drains after it was handed out: read a drained list
before the drain after next. `net_written()` hands out one kept record, good until the next call.
`nr_s` / `nr_text` intern what they read (a name comes every frame), so equal texts are one string.
The tests hold the heap flat over 6000 messages.
## Config and ports
```ludic