You do not have permission to delete messages in this group
Copy link
Report message
Show original message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to tinymux
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512
Subject: [ANNOUNCE] TinyMUX 2.14.0.11 (ALPHA) released
TinyMUX 2.14.0.11 is now available. After the very large 2.14.0.10, this is a deliberately narrow cycle: roughly ninety changes, almost all of them either measuring the server or making a measured thing faster. Very little new surface.
The shape of the cycle came from a decision to measure before optimising. A live-server profile harness was built first, and it kept contradicting what the work would otherwise have targeted. A `$`-command automaton was scoped and then dropped when the profile put dispatch at 0.48% of a real workload. Two of the JIT's headline improvements turned out to be recovering costs the JIT itself had introduced rather than beating the interpreter. Several entries below exist because a measurement disagreed with an assumption.
This is still ALPHA and is meant literally -- run it where you can tolerate that.
Changes since 2.14.0.10 - ------------------------------
- - Two quadratic softcode functions are now linear, and both were reachable by any player. A single CA_PUBLIC call to scramble() occupied the server for roughly 19 seconds at LBUF length; shuffle(), found by the same sweep, cost about 3.4 seconds. If you run 2.14.0.10 in public, this is the reason to upgrade. A complexity-class guard now covers both.
- - Evaluation and lookup. iter() accumulated its output quadratically, so the compiled route paid a fresh walk from the head of the list for every element -- at 2000 elements the JIT was 65x SLOWER than no JIT. It now beats the interpreter. Name resolution is indexed per container, the per-object attribute-number list is cached (removing a SQLite round trip from a hot path), and $-command dispatch no longer scans the whole attribute cache.
- - The softcode JIT. The translated-block cache holds several programs instead of one; integers cross the tier-2 boundary as integers rather than being marshalled through strings; map() and filter() gained lowerings. A long-standing inversion was corrected in the u() inline permission branch -- its two arms had been reversed since it was written, so permitted calls took the slow ECALL fallback and the inline path only ever ran for denied ones. A traced attribute no longer inlines, so AF_TRACE cannot silently vanish on the compiled route.
- - Networking. TCP_NODELAY is now set on accepted client sockets in every engine. It was set on Windows/IOCP and on no POSIX engine, so the same server ran with Nagle enabled on Linux and BSD and disabled on Windows. Output is already coalesced per flush, so this does not meaningfully change packet counts; it stops the kernel holding a flush the server has already decided to send until the peer ACKs the previous one, which is what made trigger spam, @dolist output and channel bursts dribble in at ACK cadence on a remote link.
- - Connect latency. Every classic telnet connection used to wait a hardcoded 500ms in total silence before the server sent its first byte. The wait exists so telnet negotiation cannot corrupt a WebSocket handshake, and the incentives were inverted: WebSocket and TLS clients speak first and were served immediately, while the classic MUD client -- which waits for the server to speak -- was the only kind that always paid in full. It is now the `proto_detect_window` directive, in milliseconds, default 500, so nothing changes unless you set it. Setting it to 0 disables detection and the banner goes out at accept, as it does in 2.13; that is the right setting for a port that never serves WebSocket.
- - Restart. Every @restart on a --enable-stubslave build leaked a whole helper generation: the old stubslave survived alive forever, the old slave became a permanent zombie, and a dead socket fd was carried into the new process image. It accumulated -- a server restarted three times ran three orphan stubslaves and three zombies, indefinitely. @restart also silently discarded the -p (pidfile) and -e (log directory) command-line values, so a site using a custom pidfile path stopped maintaining it after its first restart. Both are fixed and both now have live regression coverage. 2.13 is unaffected by either.
- - Clients. TitanFugue ignored IAC GA entirely, so every GA-terminated prompt -- including the @program prompt -- displayed a quarter second late, by timer instead of by protocol. Measured before and after: 251ms to 0ms. TitanFugue and the four other native clients (console, win32gui, Android, iOS) now set TCP_NODELAY; the Android and iOS platforms both default that option OFF, which made the clients on the worst networks the ones running with the least favourable setting.
Configuration and behaviour changes - ------------------------------
No existing behaviour changes and no softcode changes are needed. Two new directives are available, both defaulting to what the server already did:
proto_detect_window <ms> default 500; 0 disables telnet/WebSocket detection and sends the banner at accept jit_compile_cache_max <n> default 2048
Download - ------------------------------
Unix - ----
Full source (tar.gz): mux-2.14.0.11.unix.tar.gz SHA256: 0db2ff8b715d80a4b5cad9cfda559697173bf3e190857c9c82e3d3480a37bd76
Full source (tar.bz2): mux-2.14.0.11.unix.tar.bz2 SHA256: 21e44ddfa172ddd9a34955ed6810571c25c624019d0c3218d03da086b1575dbe
Patch from 2.14.0.10: mux-2.14.0.10-2.14.0.11.unix.patch.gz SHA256: 72a0c7921ac3eb389f7ccb48d929701c6011f9d671d533ceef8d7e0591dfa9f6
Companion binary blobs (required by the patch; see the .APPLY.txt): mux-2.14.0.10-2.14.0.11.unix.blobs.tar.gz SHA256: 1c4cca2b2f7f33b1549a0529088ae715eb15ba6456fd6879eb3ff723fb9bb173
Upgrading with the patch is two steps -- apply the text patch, then overlay the blob archive -- because one prebuilt file (rv64/softlib.rv64) cannot be carried in a text diff. The full tarballs need neither step.