TinyMUX 2.4: CHANGES Last Update: October 2005 Major changes that may affect performance and require softcode tweaks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- The units on the timeslice configuration option have changed from milliseconds to seconds. But, seconds can be expressed as a fraction whereas milliseconds could only be expressed as an integer, so this change doesn't take any capability away. -- Control over WOD Realms, Memory-Based, and other build options have been pulled back into the ./configure script. The README files refer to the new methods, and ./configure --help gives a list. Also, gmake is no longer necessary for *BSD flavors. -- The behavior of case() is closer to switch(). The patterns are now evaluated. The #$ substitution is also made. Feature Additions: ~~~~~~~~~~~~~~~~~ -- Added support for multi-character delimiters across nearly all functions which accept input or output delimiters. For example, 'iter(1%r2%r3,itext(),%r,|)' produces '1|2|3'. -- Added 'reset_players' configuration option which resets the player connection record. -- Added 'user_attrib_per_hour' which limits the rate at which user-defined attribute names are created. -- Added 'mail_per_hour' which limits the rate at which @mail can be created. -- Add output delimiter to elements(), extract(), filter(), filterbool(), graball(), remove(), shuffle(), sortby(), and splice(). -- Connection, disconnection, partial, and suspect emits now show the player's @moniker. -- Added lag_limit configuration option to control how long the server will service commands. The execution of expensive commands is abbreviated, and the queue is drained, and the executor is @set HALTED. lag_maximum continues to be the reporting threshold. -- On Win32, use higher-quality time from QueryPerformanceCounter() instead of GetSystemTimeAsFileTime(). As soon as the error from using QueryPerformanceCounter() drops below 5ms, the server switches to using it as a time source. So, if you are doing any softcode profiling on Win32, you need to wait a few seconds after the server is started before beginning your tests. -- Updated PCRE from version 4.2 to version 4.5. -- Added BXOR() function. -- Added siteadmin @power to permit mortals to operate @shutdown and @restart. The idea is that the site administrator will have access to the shell account, but may also need access to site-related facilaties within the game. -- Add FCOUNT() and FDEPTH() for softcode access to function invocation and nesting counters. -- Added POWERS() function to return a space-delimited list of powers. PennMUSH implement this first. -- Added some plumbing for SQL. There is no way to make SQL queries, but @ps would show them if there were. @halt and @kick would also interact with them. -- Added CHOOSE(). CHOOSE() is like PICKRAND() except that the distribution is weighted. The idea was originally implemented by Catherine@Firan. The code included here is based on a re-implementation of that in TM3.1 by Lydia. -- Added TEXTFILE() to allow easier softcode access to helpfile topics. Re-implemented from TM3.1 help topic. Originally from PennMUSH. -- Added guests_channel_alias and public_channel_alias configuration options. -- Extended behavior of MID() to more easily cover the LEFT() and RIGHT() behaviors. -- Added optional second argument to RAND(). -- Added patch surface for BTMUX. -- @teleport/list accepts a space-delimited list of objects to teleport. -- Added cemit(). Also, changed the permission control so that any object that controls the channel owner can use cemit()/@cemit. -- vadd() now allows addition of a vector by a scalar similiar to vmul(). -- Remove the 20-argument limit from the vector functions. -- Added @mfail message. When @mail/lock rejects @mail, the @mfail is shown to the sender. Previously, the @reject message was shown to the sender. -- Added NO_PARSE attribute flag to control whether $-commands and ^-listens match the evaluated or unevaluated input. -- @program now traverses an object's parents for the requested attribute. -- Fixed @mail/fwd to evalute the postpended and prepended text without evaluating the forwarded text. -- Added the local.cpp patch surface. Details in LOCAL readme. -- Allowed more substring matches in regexp $-commands, regmatch(), regrab(), etc., though some matching substrings may not be observed. -- Ashen-Shugar contributed a muxdbpuller tool which can extract an object by dbref from a flatfile in @decomp format. This can use useful for restoring accidently @nuked objects from backups. It is located in mux2.4/src/tools. -- Draken Korin (with some help from Ian) submitted a 'Reality Levels' option. This is version one, and it still requires some attention, but to enabled it, use ./configure --enable-realitylvls. -- Ashen-Shugar added the restrict_home configuration option. -- Added support for MEMORY_BASED to the ./Backup script. -- Ian added a wildcard argument to comlist and @clist commands as well as displaying these lists in sorted order. -- Ian added support for multi-character delimiter to LAST() function. -- Ian added support for DIE() to return a list of rolls rather than just the sum. Bug Fixes: ~~~~~~~~~ -- Solaris build needed a missing HAVE_FCNTL_H. -- First argument argument of udefault(), edefault(), and default() supported <dbref>/<attrname>, but not just <attrname>. But introduced in MUX 2.2 timeframe. -- While the server hasn't allowed mail aliases (@malias) larger than 100 members for awhile, it did not protect itself properly against mail aliases saved in older mail.db files. -- @backup now works with MEMORY_BASED build. -- Added missing @fsay help topic. -- Added more messages to @destroy/instant path. -- Guest attributes weren't being wiped as intended. -- Fixed @hook IGSWITCH again. This time, the bug is related to the search_nametab() interface. -- Fix @notify/foo123 where foo123 is a never-before-used attributes. Legacy bug from MUX 1.6. -- Tightend up command piping to log expensive piped commands and also improve the interaction with @break and lag_limit. -- Fixed bug in MIX() where '&mixit me=(%0|%1);think mix(mixit,0 1,1)' gives '(0|1)' instead of '(0|1) (1|)'. It wasn't determining the length of the first list correctly. -- Allow code on rooms to use @oemit. -- Move initialization of time code further up so that the logging code creates the right timestamp. -- @dbck started fixing quotas in MUX 2.3, but this is too expensive to do routinely. -- Locks failed to evaluate properly after a dbref within the lock was @destroy. -- Add ',()^$' to the set of characters escaped by ESCAPE(). -- Fix unlikely but reproducible case of hanging @dump/@backup. -- Fixed suggestions/bugs from static analysis tool. -- Fixed some 64-bit warnings. -- Release comsys and @mail properly for guests. -- Document the see_hidden @power. -- Attribute permissions are documented more completely in the 'attribute permission' topic. -- Clarified help topics 'helpfile' and 'raw_helpfile'. -- The minimal set of guests were never being added back to the Guests channel. -- @hook/igswitch tweaked so that if any switch from the user doesn't match the built-in hardcoded switched, softcode has a chance to process the command. -- Defer closing a session until output is completely flushed (Win32-only issue). -- Don't destroy a channel just because a controlling object is @nuked. -- Fixed SIGSEGV in AFTER() with accent characters in the pattern. -- Fixed uninitialized variable problem with an empty ladd(). It returned the result of the last operation. -- Fix permission hole where a @lock can be used to obtain someone's location. -- Fix TRIM() so that it doesn't leave a separator on the right side. -- Remove the different 'Icons' appearance from a MATRIX room. There are other ways of accomplishing the same effect now. -- Document @queuemax and @cboot/quiet. -- Let band(), bor(), and bxor() take a variable number of arguments. -- Added strmem() to return the number of bytes required to represent a string in memory. strlen() returns the visual length of a string. -- Allow vadd() and vsub() to mix vector or scalar arguments. -- Allow conn_timeout of 0 indicate that connection timeouts should be disabled. -- Limit the number of pcreates permitted per hour to be controlled by pcreate_per_hour configuration option. -- When a user disconnect or connects, announce their presence on a channel once regardless of how many aliases they have for that channel. -- Add case-insensitive sort option to sort(). -- Use correct units in the @mail, attriute name, and new player throttles. -- Avoid several situations in which the forked process and main process would both attempt to update an attribute value. The forked process should never attempt to update any attributes values. -- Traverse pcache list properly (introduced in 2.4.0.15) to avoid orphaning cache records and failing to flush A_MONEY updates to the database. -- Fix crashing bug in @clist/full with a heavily ANSI-ied owner name. -- Documented @mail/bcc (blind carbon-copy). -- The $GAMENAME.pid file option in mux.config was not surviving @restart. -- Fixes for @mail and @program from 2.4.0.17 changes. -- Add FreeBSD-friendly checks for ieeefp.h to choose double-precision floating-point properly on FreeBSD. -- Add Solaris-friendly checks for fenv.h, fesetprec(), and fegetprec() to choose double-precision floating-point properly on Solaris without inadvertently trying to use fenv.h on MacOS or SuSE. -- local_data_create() in local.cpp was not being called for the create() side-effect function. Found and fixed by Alierak. -- lstack() left a trailing output separator (space). It also contains some unreachable code. Found and fixed by Alierak. -- VDIM() referenced uninitialized memory. Borrowed the correct implementaiton from WORDS() since the two are nearly identical. Found and fixed by Alierak. -- Fix @mail/quick evaluation from 2.4.0.18 so that spaces are not compressed. -- Fix unexploitable buffer overflow with too many substring matches in a regexp $-command. Found and fixed by Alierak. -- Fixed @dump/flat coruption bug. When the main process and the forked, @dumping process are both actively querying the text value database, the sequence of lseek/read and lseek/write options intermix. Since the file position state is shared between the child and parent process, it was possible for one process to read or write the wrote CHash page. Instead of using lseek/read and lseek/write, MUX now either uses pread() and pwrite() or does not fork a child to performs the @dump/flat. -- The comsys loading procedure not removes references to GARBAGE. Previously, it would not add the GARBAGE to any channel, but as new objects are creates they would appear on channel at the next @restart. -- Fix @mail/purge bug where only the first cleared @mail item would be purged. -- Avoid reference to freed memory when an outputsuffix is set and LOGOUT is sent at the login screen. Found and fixed by Alierak. -- The logout_cmd_access parameter disables a logged-out command when any access restriction, not just need_player, is specified. -- Strip ANSI so ^-command matching works with ANSI emits. -- Fixed pointer dereference bug in RxLevel() introduced by Brazil which caused REALITYLVLS to crash after ./Startmux. Performance Enhancements: ~~~~~~~~~~~~~~~~~~~~~~~~ -- Re-worked update_quotas() so that mudstate.now could be removed. -- Use nanosleep() or usleep() on Unix if available. -- Pulled alloc/free pairs outside an inner loop in switch() and fold(). -- Improve performance by avoiding write-through caching of A_MONEY in the player cache. This was probably the primary reason for needing one cached hash page per player. Paging is probably secondary to this one. -- Changed dbconvert-mode so that it creates 8 temporary files when loading a flatfile instead of 4. -- Changed attribute cache so that it retains knowledge that an attribute value does not exist in the database. -- Maintain hash page cache as a double-linked list ordered by recent use. Previously, finding the oldest entry required looking at a counter in every entry. This improved AllocateEmptyPage() performance. -- No longer call fsync() when in dbconvert mode. -- Mapping page offsets to cache entries has been re-done. There is now a corresponding 'directory' containing all the indices of the cache entries. This is maintained similarly to the directory of offsets (which is written to netmux.dir). To maintain this linkage properly, it is necessarily to update ranges of entries which correspond to the hash page in the cache. Previously, the lookup was accomplished by looking at recent queries, and if that failed to give the answer, it looked at all the cache entries to find a match. This improved ReadCache() performance as the corresponding cache entry is now always known. -- Avoid scanning an object's attributes in Hearer() or sweep_check() if it is already known to have @listen or is not set MONITOR. Cosmetic Changes: ~~~~~~~~~~~~~~~~ -- Increased the space available to WHO for @moniker names to provide more room for more ANSI transitions. -- Remove references to have_macros in wizhelp.txt -- Removed mention of SIDEFX flag from help topic as this is an Rhost-ism. Miscellaneous: ~~~~~~~~~~~~~ -- Added ATTACK notes. -- Added @folder as an alias for @mail/folder and @file as an alias for @mail/file. -- Remove configure checks for mktime() and timelocal(). -- Alierak removed the last two direct uses of delim_check in lnum() and lcmds(). -- Alierak removed stale code in add_player_name() since disallowed names are stored separately. -- Alierak moved the login mail check into announce_connect() to clarify the purpose of record_login(). -- Alierak refactored the logged-out commands code, removing some unreachable code in do_command() and clarifying how logged-out commands are handled. -- Alierak removed duplicated code relating to setting the MONITOR flag. -- Included REALITY and REALITY.SETUP readme files which were previously left out of the distribution. -- Removed BTMUX patch surfaces as their approach has changed. -- Fixed various minor GCC 4.0 build issues. -- Verify that pread() and pwrite() can actually be used. -- Ashen-Shugar provided muxdbpuller which allows individual objects (and attributes on those objects) to be extracted from an offline flatfile. The result is in an @decomp format suitable for quoting.