TinyMUX 2.14.0.11 ALPHA

6 views
Skip to first unread message

Brazil

unread,
Aug 7, 2026, 11:07:15 PMAug 7
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.

Windows
- -------

Binary (zip):
mux-2.14.0.11.win32.bin.zip
SHA256: 35d0f4259aaed29bf8ceee834734ef739261032b7200fae2065dae888c450b33

Binary (7z):
mux-2.14.0.11.win32.bin.7z
SHA256: b3a8bef6cdfca0878869bfaf7eb1b6fbadb53bd9046b8794065cc171b0672f25

Full source (zip):
mux-2.14.0.11.win32.src.zip
SHA256: 9be25be9f563737067c4ca3b75763b173b9048a8bf57705b91807bcbb69872a9

Full source (7z):
mux-2.14.0.11.win32.src.7z
SHA256: dee8f061a95df5b19487dca0a6811f2e3e26d7cfc3dc6189af50886745925aeb

All files are GPG-signed (.asc).

Report bugs to brazi...@gmail.com.

- -- Brazil

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEE8GWFNwJrhRGk25uvF80K5PxQP7EFAmp2j9AACgkQF80K5PxQ
P7GTAxAAqo96f7Jb4u02HdopkcLvU96jPu1MjVrBxG/RB7c/AzLlyf6/Kq8MF+SI
DRMtwRyoeXIWfDrGotZd6Ob5oiGqaKQErImw2DoNFbA4/J/0QewrmTbWg7WXLx5M
xLiYDFKBW3/0GVXNef9xWMJydAZHvQ5MCiJgZTRBk11Vz2pJOE8UhcqKN/mrUxsS
XlT/EiEiubV7ulatg9ZiVVTOIFRyovpYIP08xcqtF6GyXIaqMOojFCIAFJ5G2cAA
qxcCj2hxOm+CvKtqou9Fy4qeV62VdiaGAarBhWEGphhW49CsmAQed7PSesMfpDcu
hUkuve0ZT0KD7lEEbZJTccLbhydIiu6bX+wrHAHfPzEoUQnc/RY8V0ehx05lgXyn
FhpvTV+dGfPUdlYJ+0iZX1fTYY29owf8aK4sT+PluDkeFKNvobppxJFDxEjMKUF7
tqDd4GZdBxopD3AwKdHWbheUmUYazmMeJ83H+29jXsNXwhTffoJIrxn9iATLX5jC
uEGD46EbttZ2vh2YxMV2V5NVgcIvT7MLBeoVPBcDf/6wJwC9mzPptkb7Z7695ibC
hxRYROx9jXCRF0IxN8bhrPGObpxBM+1Mm/yzrN2D9wCWop/qxwOY6jg7P0O9QSU0
x4gphtRjeFieo45mA4VgUqjCszm+4gewM/wxfh294vki12yvvxA=
=I+Jq
-----END PGP SIGNATURE-----
Reply all
Reply to author
Forward
0 new messages