Bearnip ->Lars ->LDMud ->LDMud 3.3 (development) - History See also: LDMud 3.3

LDMud 3.3 (development) - History

Contents: Descriptions, Changelog,

This page lists the full detailed history of the development version of LDMud.

Descriptions

About 3.3.715 (changelog)
New efun tls_refresh_certs() to reload the certificates and certificate revocation information.
New commandline options to handle certification revocations: --tls-crlfile pathname and --tls-crldirectory pathname.
About 3.3.714
Implemented the array/mapping intersection.
Modified a case of undefined behaviour in the creation of the character classification tables during the build. This undefined behavior caused problems with newer GCC versions.
If the driver runs low on memory, it also prints the current object and program in the low-on-memory message.
New efuns hash() and hmac() offer flexible hash and HMAC calculation if the driver is compiled to use OpenSSL (provided by Philipp).
New macros __OPENSSL__ and __GNUTLS__ are set depending on which TLS package is being used.
Corrected a bug with extremely long object names (Bug #466).
Added support for GEN_EMAIL, GEN_URI and GEN_DNS certificates. tls_verify_callback() now prints diagnostics only if the '-d' option was given (thanks, Philipp).
lfun closures now keep track to which program they belong, to avoid ambiguities in case of complex inheritance relationships. This also affects the savefile format: lfun closures are saved with their inheritance path (Bug #443, #444).
If a non-virtual baseclass was inherited multiple times with a virtual class inside the inheritance tree, its members were merged even though they shouldn't (Bug #422).
About 3.3.713
Master function disconnect() receives the remaining input data is passed as the second argument (suggested by Philipp).
The TLS implementation is more robust.
A missing return is noted at runtime only once per function. This is achieved by runtime code modification, but we do that for switch() as well (Bug #430).
Added support for: International Domain Names, SQLite (Bug #431).
Virtual blueprint objects are guaranteed to have their 'clone' flag unset.
Removed the stipulation that CATCH_RESERVED_COST must be twice as much as MASTER_RESERVED_COST, since the master reserve is used automatically anyway.
sscanf(): The new modifier '+' requires the matching of the characters after a field in order to consider the field as matched.
remove_interactive() now preserves the current object (Bug #431).
Corrected the tracedepth handling in efun closures and non-toplevel callbacks (Bug #441).
Private lfuns no longer hide simul-efuns.
Private lfuns can be hidden by public functions without warning, ie. the former are now really invisible to inheritors. This also corrects a crasher with multi-level virtual inherits.
Multiple virtual inheritance of the same program with changing visibility is now handled with a better calculation of the final visibilities (Bug #362).
Calling an unbound lambda cleaned the control stack twice, causing errors (Bug #374).
Only public simul-efuns can be called. This was always valid for sefuns outside the 256-range, but now also applies to normal sefuns as well (Bug #419).
For completeness sake: removed the compilation errors happening when disabling the new inline closures (Bug #423).
present(): Modified the 'n' search behaviour so that the numbering is applied over both inventory and environment together. Before, the numbering was individual in each space, leading to situations where low-numbered objects in the environment were hidden by those in the inventory (Bug #417).
(object.c) Efun function_exists(): The 'FEXISTS_ALL' result also contains information about the function's type, flags, and number of arguments (Bug #410).
Efuns md5()/sha1(): Accept the number of iterations as optional argument (Bug #418).
About 3.3.712
Efun md5() wasn't 64-bit clean (Bug #413).
foreach(): When looping over a mapping with no values, or with only the index being extracted, the loop actually loops over the mapping and not just the indices copied into an array (Bug #388).
Efun set_environment(): clear the RESET_STATE flag of of the moved object's original environment, if any (Bug #387).
Efun md5()/sha1() can now hash arrays of numbers as well (Bug #411).
The string_copy() function checks if the requested memory is actually allocated, throwing an error if not (Bug #397).
Errors during the processing of a fatal() will be recognized and treated as double-fatal (Bug #408).
free_svalue() now recognizes the free of nested structures and de-serializes them to avoid stack overflows (Bug #416).
When re-using a sentence structure for marker_sent, the shadow_ob member wasn't cleared out, causing crashes down the road (Bug #414).
Efun bind_lambda() doesn't ignore unbindable closures when the second argument is missing (Bug #407).
Fixed object reference leaks (Bug #412).
(pkg-tls.c) When accepting a SSL connection, request a client certificate. The driver itself won't check the correctness, but the result will be available in the connection status.
About 3.3.711
Implemented a low/high watermark logic for the backend call to cleanup all objects, in order to prevent the driver from hogging the CPU.
Updates to the OpenSSL interface.
The test for struct equivalence now recurses through member structs; otherwise changes in an contained struct wouldn't be reflected in the containing struct, leading to LPC compilation errors.
to_int() no longer accepts "x<num>" as valid sedecimal notation (Bug #0000402).
Errors during the backend cleanup will now find a consistent virtual machine (Bugs #0000405 and #0000406).
About 3.3.710
Moved the repository from PRCS to Subversion.
About 3.3.709
Oops, I accidentally broke compilation on systems which allow the replacement of the system malloc() function. It should now work again (Bug #0000393).
About 3.3.706-.708
Added new efun pg_conv_string(), courtesy of Philipp.
Added new flag setting '4' to get_type_info() for closures to return the function name of lfun closures (Bug #0000392).
Possibly corrected a refcounting bug in handling prepositions which caused crashers (Bug #0000391).
Since the operators #'&, #'|, #'^ and #'! are now considered efuns, the closure compiler skipped the special treatment of these. As an added bonus of the correction, #'| and #'^ can now take an arbitrary number of arguments, too. (Bug #0000389).
If the number of destructed pending objects exceeds the number of active objects, a cleanup of all objects is triggered. Also, the incremental cleanup in each cycle cleans at least the number of objects destructed in the cycle.
About 3.3.705
runtime_error(), runtime_warning() and heart_beat_error() now receive a flag telling if the error is caught or not (Bug #0000385).
About 3.3.704
Restoring a saved array with one-character operator closures like #'- works again (Bug #0000384).
About 3.3.703
sprintf("%c", 0) returned an empty string "" instead of a string with the 0 character "\0" because internally the system's sprintf() was used for the formatting (Bug #0000378).
About 3.3.702
When printing structs with sprintf("%O"), the output now also contains the names of the structure members (Bug #0000380).
About 3.3.701
The iconv delivered as part of glibc 2.2.5 can get stuck in an endless loop. The configuration script now disables iconv support for glibc 2.0-2.2 (Bug #0000374).
About 3.3.700
There was a problem in the LPC compiler which lead to memory corruption whenever two strings were added in a preprocessor condition. Often enough the corruption was harmless, but sometimes it bit.
About 3.3.699
I was hoping to include fixes for two crashers recently discovered, but no such luck: one is caused by an incompatibility between FreeBSD and ptmalloc which will take some time to nail down, the other one occured only once so far and didn't leave much clues.
When using TLS, the new configuration parameter '--with-tls-path' can be used to specify the installation location for the TLS package.
Corrected a crasher when the TLS certfile locations are printed.
The config macro LOG_NEW_CLEANUP in config.h can be used to enable the logging of the new cleanup calls. Use this if the cleanup seems to hog the CPU to get an idea of how often it is called.
About 3.3.696-.698
Ralph provided a couple of adjustments for FreeBSD 5.4 .
About 3.3.695
Just a little tweaking to the version number determination.
About 3.3.694
Aaaand I had to reintroduce the numeric limit on the number of objects to data-clean per backend cycle, as even with the random factor in the timing sometimes hundreds of objects could become eligible at once.
About 3.3.693
I found the probably reason for the lags experienced by some muds in flaws in the data-cleanup handling (whereas the tunables in the allocators made no difference in my testing):
The data cleanup didn't check whether it still had time to spend or not - as a result the driver could cleanup thousands of objects in a backend cycle even if it had time for only one.
I underestimated the amount of data some muds hold in the default wizlist entry and let the driver clean it up with every object. A mistake, and now the driver applies the cleanup-time timing to the fixed structures as well.
About 3.3.692
input_to() and call_out() no longer accept local references as extra function arguments.
About 3.3.691
Since some muds (but not all) report occasional high CPU loads and lag, I have added a few statistics in order to locate the problem:
If you suspect the ordering of free blocks to be the culprit, try undefining the macros MALLOC_ORDER_LARGE_FREELISTS and MALLOC_ORDER_SLAB_FREELISTS in config.h. If the lags get milder by this, but don't go away completely, the root cause is somewhere else.
In either case, if you encounter such situations, please gather information from status tables, status malloc, and status malloc extstats, and send it to me.
About 3.3.690
Made the last-data-cleaned statistics more useful.
About 3.3.689
The synch heartbeat patch wasn't quite correct: one condition was still reversed, and I had left some debug code in. ...it had been a long day.
About 3.3.688
The synchronous heartbeats didn't initialise properly, and thus never executed.
About 3.3.687
Gnomi provided a patch improving the configurability of the call_out() and heartbeat timing at driver compile time; I added some touches to provide commandline options as well:
The basic timing granularity and the heartbeat interval time can be configured at compile time and with the commandline options --alarm-time and --heart-interval. The values are available in LPC with the macros __ALARM_TIME__ and __HEART_BEAT_INTERVAL__.
Heartbeats can be executed synchronously (all at the same time as far as granularity allows, regardless of when inside one hb interval they have executed last). The commandline options are --sync-heart and --async-heart; if enabled, the macro __SYNCHRONOUS_HEART_BEAT__ is defined.
About 3.3.686
Efun tell_object() can now take a non-string as second argument, and will call lfun catch_msg() in the receiver. This functionality is not exactly essential (as it boils down to a call_other()), but brings tell_object() more in line with tell_room() and say() (Bug #0000354).
Efuns tell_room() and say() now accept mappings, structs, and objects as well as arrays for the catch_msg() mechanism.
About 3.3.685
The statistics for hybrid and hash mappings were off.
The data-cleanup is now controlled solely by the configure time interval. Previous drivers imposed an additional limitation on the number of objects data-cleaned in one backend cycle, which as FinalFrontier demonstrates is too restrictive.
About 3.3.684
Finetuned the slab allocator for better use of the slabs.
Corrected a crasher in the error handling for uncallable closures (Bug #0000374).
Corrected the snoop() manpage (Bug #0000372).
About 3.3.683
regreplace() put the stack into an inconsistent state, causing crashes further down the road.
About 3.3.682
The mapping indexing with strings was not correct: under certain circumstances existing entries would not be found.
Corrected various memory leaks and missing error checks when using unique_array() and regreplace() with faulty closures (Bug #0000370).
About 3.3.681
I reduced the overhead used by the string allocator; in particular strings no longer need two memory blocks and their hidden overhead.
About 3.3.678
Corrected a fatal bug in smalloc/slaballoc which appeared on machines where sbrk() could be used (Bug #0000368).
About 3.3.677
It is now possible to set the maximum number of mapping keys (entries) separately from the number of values held. The runtime limits parameter is LIMIT_MAPPING_KEYS (the former LIMIT_MAPPING is an alias hereto), and LIMIT_MAPPING_SIZE respectively. The configuration and commandline parameters changed accordingly (Bug #0000360).
About 3.3.676
Corrected a crasher in smalloc.
Newly allocated core memory is coagulated with existing free memory where possible (Bug #0000364).
About 3.3.675
Corrected a compilation error when GnuTLS was used.
Removing an interim pending input_to should no longer mess up the telnet state (I hope!) (Bug #0000363).
About 3.3.674
During a (re)compilation of the master object, simul-efuns are disabled to avoid accidental use.
About 3.3.673
The permanent block statistics for slaballoc/smalloc was wrong.
About 3.3.672
Philip added a new efun tls_check_certificate().
About 3.3.671
Oops, the TLS change was premature. Normal operation isn't affected, but I'll undo the change until a better solution is available.
About 3.3.670
Extended the extended string statistics to keep better track of how existance checks are resolved.
New macro __BOOT_TIME__ expands to the time() the driver was started.
Corrected a bug in slaballoc/smalloc when new system memory was allocated with brk().
TLS: When using OpenSSL, the session setup distinguishes between a received connection, and one opened with net_connect().
About 3.3.669
The driver checked the list of destructed objects for deallocatable objects after every execution, which after some time put noticeable load on the CPU when the list got long. Now the driver checks it only every backend cycle (about 2 seconds), and only if before candidates for deallocation presented themselves.
Added statistics for how often the shared string table simplifies the comparison of strings. The statistics are printed as part of the "status tables" and will be removed again at a later point.
About 3.3.668
The large block handler of smalloc/slaballoc can now handle blocks up to 232 words.
The extended memory statistics have been separated out as "status malloc extstats" (Bug #0000358).
About 3.3.667
start_mccp_compress() crashed because of an uninitialized variable (Bug #0000361).
The success code passed to the TLS-handshake callback was wrong: it passed '1' for success instead of '0'.
About 3.3.666
Some leftover debugging code caused the allocator to run on an fatal() on allocation retries (Bug #0000359).
I also removed some compiler warnings in slaballoc (Bug #0000358).
foreach(i : __INT_MIN__ .. __INT_MAX__) now works as well (Bug #0000355).
When a TLS handshake is in progress, the printing of prompts is suppressed.
Using tls_deinit_connection() inside the TLS-failed callback freed the callback memory while it was still executing. The callback is now protected.
It is possible to start an MCCP compression with the telnet machine enabled. This is useful for special applications where the driver knows without negotiation that the other side can receive compressed data.
About 3.3.665
foreach(i : x .. __INT_MAX__) didn't execute the body at all - this has been fixed (Bug #0000355).
About 3.3.664
I noticed in FinalFrontier that over time there are megabytes of free memory tied up in small blocks which isn't used. Avoiding the splitting of blocks does not help; so I tried a different approach: slab allocation.

The new 'slaballoc' allocator clusters small blocks of the same size into so-called slabs, so when allocating new small blocks the allocator tries to fill up one slab before digging into the next one. This applies to both allocation of fresh memory as well as reusing freed small blocks.

Additionally the allocator is capable of returning completely free slabs back into the large memory pool - to avoid thrashing, this is done with a 1 minute delay.

I tested the allocator in a local copy of Evermore, loading all objects, destructing them, and loading them again.

slaballoc is the new default allocator; and while there are a couple of tweakables, the current setup should provide a decent all-round behaviour.
foreach() used on references clobbered memory (Bug #0000353).
About 3.3.663
There is no point in keeping unused shadow and action sentences in freelists: the memory allocator is quite fast, and the memory could be used otherwise.
About 3.3.662
Deep-copying a mapping with shared arrays as keys (e.g. ([ arr, ([ arr ]) ]) )could cause memory corruption due to the premature deallocation of an array (Bug #0000351).
Disabling telnet-negotiations in linemode caused the driver to treat lineends as if in charmode, confusing the higher parsing routines.
About 3.3.661
Corrected two memory leaks:
If program was swapped out, the GC didn't properly clean the references to the program name during the temporary swap-in (Bug #0000348).
The error handling in the regular expressions didn't properly deallocate all intermediate structures (Bug #0000349).
About 3.3.660
Corrected two memory leaks:
If destructed blueprint was held by a self-reference, the GC didn't properly clear the program's name's references, thus leaking the program name until the next GC (Bug #0000099).
And to_string(closure) leaked the program name as well (Bug #0000347).
About 3.3.659
Peng provided an improvement to the mySQL library configuration check (Bug #0000343).
About 3.3.656-.658
The GC forgot to clear out the references of the names of destructed objects, leaving them dangling when the object was deallocated (Bug #0000343).
Exceptions during a restore_object() should no longer leak values or memory (Bug #0000344).
Exceptions during a unique_array() no longer leak the internal structures (Bug #0000345).
And in the extended smalloc statistics the large-free count was still off.
About 3.3.654 and .655
Two changes to improve the memory handling somewhat: when small free blocks are split, the remaining block will have a minimum size larger than the smallest possible small block. This should prevent the free memory from becoming tied up in free 8-byte-blocks which the driver doesn't need.

Second, the data cleanup is now independent from the time of the last reference, as that kept busy objects from being cleant up.

About 3.3.653
Gnomi provided a patch to resolve a hanger in xerq (Bug #0000342).
About 3.3.652
Indexing a 0-width mapping actually returned a garbage value (Bug #0000341).
About 3.3.651
Last change wasn't quite enough: SuSE needed a different searchpath.
About 3.3.649 and .650
A correction the mySQL detection: it should find mySQL on SuSE again.
About 3.3.648
Added the settings file for TimeWarp.
Quickie feature: get_dir() can return access time and mode masks.
About 3.3.647
I (hopefully) improved the ability of the mySQL configuration check to find the installed include files (Bug #0000338).
About 3.3.646
The array range warnings at runtime are now controlled by the pragma range_check, by default they are off.
About 3.3.645
Corrected the extended memory statistics ('status malloc').
The communications statistics now also count the outgoing traffic (debug_info() options DINFO_DATA:DID_ST_PACKETS_IN and DINFO_DATA:DID_ST_PACKET_SIZE_IN).
The 'status tables' command lists the total network traffic size as well.
About 3.3.644
Small corrections to the documentation (Bugs #0000333 and #0000335 ).
About 3.3.643
Mappings over efun closures in some places considered the bound object being part of the efun information - this is inconsistent with the way efun closures usually compare, and would make efun closure comparisons quite useless to boot.
About 3.3.642
An internal updated: refactored the code in the LPC lexer a bit.
About 3.3.641
Evermore had a nasty crash which was caused by lambda closures not being initialized properly. I now modified the driver to internally use just the few dedicated lambda creation functions introduced in 3.3.639 instead of manually creating and initializing the lambdas.
About 3.3.640
The SQL efuns now raise privilege violations ("mysql", "efun name") and ("pgsql", "efun name") (Bug #0000318).
About 3.3.639
The closure changes did not compile under all configuration - this should be corrected now.
Added a couple of internal functions to create closures, so that external creators of closures like FinalFrontier's stringcompiler no longer have to care about the exact closure structure.
About 3.3.638
Closures (ok, non-operator, non-simul efun, non-efun) closures are now annotated with the location of their creation - this should make especially error messages in lambdas a bit more helpful.
Some corrections to manpages.
About 3.3.637
Efun input_to(): New flag INPUT_APPEND allows to queue input_to()s.
About 3.3.636
Another small correction to to_int(): Too large negative numbers are now mapped to INT_MIN, not just -INT_MAX. The LPC compiler itself unfortunately can't be as clever, but at least now emits warnings when encountering such numbers.
More TLS bugfixes from Fippo and Peng (Bug #0000138 and #0000140).
About 3.3.635
Incorporated Gawain's and Peng's patched to GNU tls; including a new efun tls_available() which reflects whether the TLS system could be initialized or not (the originally suggested name was tls_is_available(), but I just don't like the 'is' in names) (Bug #0000082).
About 3.3.634
Added efun regexp_package() to determine the currently active default regexp package.
About 3.3.633
The number parsing was not quite correct yet - Evermore no longer booted with it (Bug #0000327).
About 3.3.632
Corrected a nasty bug in the string handling which could lead to memory being freed which was still used. The error was most likely to surface when a string was first used to create a mapping entry, and then extended in size.
Numbers exceeding the numeric range limit ('111111111111111') are now evaluated as MAX_INT (Bug #0000327).
The warnings about improper array range indices are now controlled by the warn_deprecated pragma (Bug #0000325).
About 3.3.631
Assignments to negative sized ranges now generate an error; indexing an array with an out-of-bounds range generates a warning (Bug #0000325).
About 3.3.630
The TLS package of course needs to use non-collectable memory (Bug #0000323).
About 3.3.629
The garbage collection now zeroes out closures found to be bound to destructed objects. The old behaviour was to change them into 'undef' closures (Bug #0000322).
About 3.3.628
Another correction to the internal memory allocation functions to conform to the C standard.
About 3.3.627
Modified the internal memory allocation functions to conform to the C standard, to make interfacing with external libraries easier (Bug #0000132).
GNU TLS's allocations now use the driver's allocator, to enable the tracing offered by smalloc.
About 3.3.626
Corrected the sending of UPD packets in the Amylaar erq.
About 3.3.625
If privilege_violation() for input_to() and rename_object() destructs the objects in question, the driver should no longer crash (Bug #0000316).
The Amylaar erq errorneously assumed fixed datalengths when handling UDP packets.
About 3.3.623
Corrected a memory leak when no-bang input_to()s are denied by the master (Bug #0000143).
About 3.3.622
When assigning characters to a string, the driver failed to duplicate the target string.
About 3.3.621
Bugfix: The inherited-lfun closures broke the handling of virtual superclasses.
About 3.3.620
An organisational release: I have moved all old bug reports and feature requests out of the driver archive into the bugtracker.

It might be faster for you to download the complete archive than trying to apply this diff.

A man page ldmud.1 is now generated from the driver's --longhelp output if the tool (help2man) is available.
About 3.3.619
Calls to explicitely inherited lfun closures (we need a better name for these :-) ) weren't compiled correctly in lambda()s (Bug #0000145).
About 3.3.617
When the driver was compiled for the old inline implementation, it created invalid bytecode for closures, and also didn't interpret it correctly.
About 3.3.616
Implemented closures explicitely referencing inherited functions (#'super::fun).
About 3.3.615
Efun net_connect(): On multi-homed machines, the created socket is bound to the hostname given at program start (Bug #0000137).
You will also have noticed that updates have been sparse over the last weeks. But after having lived through a stressful production release (it took three weekend-long attempts to get everything in line), my geek enthusiasm at home was a bit subdued.
About 3.3.614
I don't know that this was even supported, but to_int() now recognizes the plus sign again (as in to_int("+34")).
About 3.3.613
to_int() didn't recognize non-number strings and returned garbage values (Bug #0000141).
About 3.3.612
Efun insert_alist() was no longer able to lookup the insertion position for new keys into a key array.
About 3.3.611
Efun to_int() now supports the '0x', '0b', and '0o' bases.
About 3.3.610
Efun present() now accepts the argument form (str, n) to allow for ids with embedded numbers.
About 3.3.609
Ok, ordering the small block freelists was a bad idea - I removed that now. Ordering the large block freelists doesn't seem to make a performance difference, so I keep it in for now to see if it helps with the fragmentation over the long term.
About 3.3.608
Reduced the aggressiveness of the new cleanup scheme - this should reduce the processor load somewhat.
About 3.3.607
The NOECHO hook was called with the wrong number of arguments.
About 3.3.606
Added a number of NULL pointer checks to the regexp code, which should fix the latest crop of crashers (#0000130, #0000135).
About 3.3.605
A bug in the SMALLOC_ORDER_FREELISTS code caused interesting crashes, which in part could be mistaken for problemsin the regexp handling.
About 3.3.604
Corrected callback problems in tls_init_connection() (Bug #0000131).
About 3.3.603
Since Finalfrontier manages to hold a steady 4:1 ratio of used to free small blocks, I added some extended statistics to smalloc to see what kind all these free small blocks are. No guarantee that that will help battle the fragmentation, but it'll be interesting nonetheless. The statistics are as usual available through the debug_info() efun, and as part of the "status malloc" output.
About 3.3.602
The config.h macro SMALLOC_ORDER_FREELISTS instructs smalloc to keep its freelists ordered by block address. This is an experiment to see if the high heap fragmentation can be reduced this way.

If you experience memory problems, deactivate this macro in config.h and recompile (sorry, no configure option).

About 3.3.601
To simplify the adaption of legacy mudlib code with its sloppy handling of types, the pragma no_warn_function_inconsistent can be used to turn off warnings about inconsistent function redefinitions.

In general, however, turning off these warnings is a bad idea, as they usually point to a violation of the function's calling contract.

About 3.3.600
When redefining variables from an inherited program, it is now possible to redefine an inherited nosave variable with another nosave variable (it will still generate a warning, though).
Corrected the handling of pragma warn_deprecated when it comes to affecting the code as it's executed at runtime (Bug #000059, #0000093).
Efun shutdown() now can take an argument which is used as the return code for the driver process.
About 3.3.599
Corrected a crasher in the regular expressions (Bug #0000128).
About 3.3.598
Updating the master object deleted the default regexp selection done by configuration/commandline argument. I changed it so that the 'builtin' default is stored separate from the driver hook setting.
About 3.3.597
Corrected a compilation error when USE_PCRE was not the default.
About 3.3.596
I have added the possibility to use both traditional regexps and PCRE in parallel. The configuration of the driver determines the default package; but by using the new option form of the regexp efuns together with the flags RE_PCRE and RE_TRADITIONAL, the package for a particular efun call can be chosen at will.

Of course the driver also supports a default selection: by default the package chosen at configuration time with --enable-use-pcre (as before) will be used for any given regexp fun call. This default can be further selected at start time with the commandline argument --regexp, or at runtime via the new driver hook H_REGEXP_PACKAGE.

...at least that's the idea.
About 3.3.593
The new input_to() flag INPUT_NO_TELNET modifies the INPUT_CHARMODE behaviour such that only the driver's handling of incoming data is adjusted.
About 3.3.592
Bugfixes galore:
Removed a couple of memory leaks (Bug #0000120).
Using a too large fieldsize or precision in sprintf() could abort the driver due to a numeric overflow (Bug #0000119).
Some operator closures didn't restore properly, and could even confuse the restore-parser completely (Bug #0000118).
When switching out of CHARMODE, the driver accidentally discarded any pending input lines after the current one (Bug #0000123).
About 3.3.591
Corrected the actual struct related error: a reference count error happened whenever an inline closure was compiled with a struct return type. However, to make the error really reproducable, you needed a program with a private struct, an inline closure returning that struct, and syntax errors in that program.
About 3.3.590
Corrected the last patch, which caused the LPC compiler to generate faulty bytecode.
When struct types were used as function returntypes, the LPC compiler was likely to clobber memory due to faulty reference counting. Unfortunately the correction now introduced a memory leak... C++ sounds more appealing with every day.
About 3.3.589
Removed a C99 construct which broke compilation under C90 compilers ... I hope (Bug #0000116).
About 3.3.588
Corrected a few compiler warnings.
About 3.3.587
Calls from destructed objects to other objects now elicit a warning (Bug #0000113).
When using PCRE, the driver now automatically uses the system's PCRE library, using the builtin package only if (at configuration phase) no PCRE is found of if the builtin is requested explicitely.
About 3.3.586
Corrected a number of memory leaks (Bug #0000114).
About 3.3.585
Float variables without an initializer are now properly initialized to float-0 instead of number-0.
Corrected a nasty memory leak in MCCP - patch supplied by Alwin (Bug #0000111).
About 3.3.584
An error while loading an object with a too-long filename could cause a crash.
About 3.3.583
Corrected a memory leak when efun garbage_collection() can't open its logfile.
Corrected the strings and small blocks statistics.
About 3.3.582
The range given by the macros __FLOAT_MIN__ and __FLOAT_MAX__ was too small (Bug #0000101).
About 3.3.581
Corrected a crasher in the call_out code.
About 3.3.580
funcall(#'->, ({}), "") crashed the driver (Bug #0000097).
The traceback collection now uses unlimited arrays (Bug #0000097).
to_array('symbol) caused a crash (Bug #0000097).
An error in save_{object, value}() followed by a GC left behind an invalid pointer (Bug #0000097).
About 3.3.579
Corrections in the XERQ to make it more robust when used to start subprograms.
If an ERQ callback accepts an array, the numbers in that array are now all positive in the range 0..255.
About 3.3.578
Improved the verbose debugging of XErq.
Efun input_to() didn't properly test its arguments (Bug #0000098).
If a call-out function causes an error, all further call-outs for the same user in this cycle are re-schedule to the next cycle. This avoids a loop due to eval-cost resets then the function causes a too-long-evaluation (Bug #0000095).
About 3.3.577
Corrected a number of memory leaks caused by runtime errors (Bug #0000096).
About 3.3.576
Warnings printed during the generation of a closure crashed the driver (part of Bug #0000091).
About 3.3.575
The 'missing return' warning is no longer triggered if a function ends with raise_error() or throw().
Efun input_to(): the check for a change in the CHARMODE mode did not properly check if the command_giver was valid - this could cause a segfault if input_to() was used without an interactive (Bug #0000090).
A too-large allocation (like in " "*MAX_INT) no longer crashes the mud unless done in SYSTEM allocation mode (Bug #0000086).
Allocating an array enough elements to exceed the internal numeric limits (part of Bug #0000091).
About 3.3.574
The 'public foo() shadows private bar()' warning no longer warns about the __INIT() function (Bug #0000085).
Removed a memory leak in ctime(vector) (Bug #0000087).
In catch(), the check if there are enough evals left was done before the reserve had been added to the eval cost. Since the handling for this case was changed to a runtime error, this caused the error handler to subtract a reserve which wasn't there, in the process messing up eval cost handling (Bug #0000088).
The restoration of eval limits didn't handle the case of a fixed eval cost (USE_EVAL_COST > 0) correctly if the process had used more than the given amount: the total eval cost was set to the given amount, instead of adding the amount to the previous eval cost value (Bug #0000077).
About 3.3.573
A shadow executing remove_action(1, shadowee) crashed the driver.
About 3.3.572
If a message or command is too long, the error messages prints the begin of it as a debugging aid.
About 3.3.571
The tracedepth wasn't calculated correctly.
About 3.3.569-570
Updated PCRE to version 4.5.
About 3.3.568
The LPC symbol __MAX_MALLOC__ now reflects the actual maximum allocation limit in effect, not the default value selected during configuration.
About 3.3.567
Improved the check in input_to() for a change of the NOECHO/CHARMODE mode while the telnet machine is disabled.
About 3.3.566
Corrected a fatal error in the handling of the memory reserve: freeing the reserve used the wrong function and thus crashed the driver.
About 3.3.565
Efun save_object() now really removes a trailing ".c" from a filename.
Efun net_connect() should now compile with IPv6 enabled.
About 3.3.564
Corrected bugs in the implementation of set_limits() and limited() which messed up the LPC stack.
About 3.3.563
The new limit LIMIT_COST can be used to control the evaluation cost of a limited() execution.
When using set_limits() and limited(), the resulting limits are passed as argument to the master::privilege_violation() call.
About 3.3.562
Small changes: removed some gcc 3.4 incompatibilities, and some warnings from the lp-245 mudlib.
About 3.3.561
The 'public shadows private' warning should be triggered now only when genuinely private functions are involved.
About 3.3.560
The modifier reserve expr can be used to modify the eval tick reserve in catch().
About 3.3.559
The compiler now warns if a privately inherited function is shadowed by a publicly inherited one. If this produces too much output, I'll probably introduce a pragma to control the warning.
If a catch() doesn't have enough eval ticks left to even execute, this error is now thrown from 'inside' the catch(), streamlining the handling for the caller.
About 3.3.558
When restoring a struct, the gamedriver no longer insists that the sizes match, but instead restores as many members by position as possible.
Corrected a typo in the configure script.
About 3.3.556
The efun member() and rmember() can take a 'start' parameter for their search.
About 3.3.555
When USE_AVL_FREELIST was active (the default), the AVL tree could get clobbered, causing the driver to crash.
About 3.3.554
The efun deep_inventory() now takes a 'depth' parameter to somewhat filter the results.
About 3.3.553
Oops, the combination of AVL nodes and freelists for large free blocks in smalloc was never activated.
Small blocks recycled from the their freelist never had their 'collectable' flag set. No direct harm, except that the GC couldn't find these blocks if they ever got lost.
When writing savefiles, only the names of structs use the shared string notation; normal strings are always printed out for readability.
About 3.3.552
The H_NOECHO hook is no longer called if the target object is destructed.
Fini donated a Perl snippet to parse LPmud savefiles.
About 3.3.551
Runtime warnings now also call the master lfun runtime_warning().
About 3.3.550
Corrected a compilation problem with MALLOC_TRACE defined.
About 3.3.549
Efun get_type_info() can now return the name of the defining program for a lfun/context closure.
Made sure that during a GC all string references are cleared - so far this didn't happen, possibly causing string leaks going unnoticed.
About 3.3.548
If you use Linux or FreeBSD, you need this patch to get the stdint.h to work. ...or buy a Mac :-)
About 3.3.547
The configuration now tests for the existance of C99 include stdint.h (required by the SHA1 code), and provides a replacement if it's not available.
About 3.3.546
Corrected two late-night-induced compilation problems.
About 3.3.545
Let's see if this works: when pthreads are enabled, smalloc will no longer replace system malloc(), even if it could. Also, the thread-related memory allocations are always done by system malloc() and not the driver's allocator. I hope that this way we can finally use TLS in the threaded version of the driver.
It is again possible to work without an simul-efun object altogether by returning 0 from the master::get_simul_efun() lfun.
When an interactive is forcefully disconnected, the MCCP connection is also forced to shutdown.
About 3.3.544
I managed to break unique_array() in 3.3.539 - sorry!
About 3.3.543
Corrected a memory leak when using PCRE.
If the simul-efun object can't be reloaded at runtime, a normal runtime error occurs - not a driver shutdown.
About 3.3.542
Corrected a bug in the string handling which caused the driver to not find mapping entries.
Menaures provided updates for the German manpages.
About 3.3.541
Efun tls_init_connection() is now able to complete the TLS handshake in the background, thus avoiding blocking the whole driver. Optionally it can be provided with a callback function which is called once the handshake is complete (successfully or not).
About 3.3.540
Corrected a problem in the mapping key lookup connected to the more aggressive string tabling.
Strings can now store their hash value (internally) so that the hash doesn't need to be computed more than once.
About 3.3.539
Efun unique_array() crashed on using a name-based callback.
Strings can now be made tabled ("shared") in place, removing the the need for memory allocations in the process.
Assigning or transferring strings no longer make the strings tabled - since strings have refcounts and are made tabled on a regular basis, this former memory saving step is no longer required.
Lynx provided an updated version of the manpage for inheritance.
About 3.3.538
tls_query_connection() now returns FALSE when used on non-interactive objects, instead of raising an error.
About 3.3.537
The warning about missing return statements is now controlled by the pragma '(no_)warn_missing_return' (by default it is active). Also, the driver tries to perform the check at compile time, using the runtime warnings as fallback.
While I don't know why anybody wouldn't want the new inlines :-), I corrected the compilation errors for the old-style inlines.
About 3.3.536
When not using pthreads, the TLS implementation retries the opening handshake should it fail with the equivalent of an EAGAIN.
About 3.3.535
Corrections to convert_charset(): the efun crashed when an empty string was passed in; and the libiconv detection in configure was not perfect.
About 3.3.534
I had some time at work, so I implemented the idea from Bug #0000053: large free blocks of equal size are kept in a linked list hanging of the AVL node for this size of blocks. The idea is to improve the locality of the free large block handling - but only practical use will show if it's any use.
About 3.3.533
Efun convert_charset() got the conversion direction wrong.
About 3.3.532
Added corrections for AIX/Visual Age 6.
Efun reverse() can now reverse the bits in an integer.
Menaures provided a new version of lpc.xml.
int-=float subtracted a random value instead of the given float.
About 3.3.531
New efun convert_charset() converts a string between character sets.
Efun make_share_string() is deprecated, as the driver is using shared strings (even if not tabled) all the time now.
About 3.3.530
Changed the memory dump format so that all the information for a memory block is printed on one line.
About 3.3.528 and .529
net_connect() can now open IPv6 connections.
Added a few more german Efun manpage translations. If the patch chokes on this bit, I advise to get the full archive.
New efun reverse() to reverse the content of a string or array - supplied by Ralph, thanks!
About 3.3.527
Corrected a compilation problem under Linux.
About 3.3.526
debug_info(DINFO_DUMP, "memory") writes a list of all allocated memory blocks into a file, by default mudlib/MEMORY_DUMP. Intention is to aid the investigation of high memory usages - however, you may want to add sanity checks (for example in valid_write()) to make sure that Joe Everywizard cannot call this function at whim. Currently this dump is supported just by the smalloc allocator.
About 3.3.525
Corrected a compilation problem with the SHA1 implementation.
Active objects were never cleant up at all.
About 3.3.524
Improved the detection of MySQL on Mac OS-X (I hope), and corrected a typo in mudlib/sys/lpctypes.h.
About 3.3.521-3.3.523
In a lambda closure, executing a return while computing arguments for a varargs efun caused the driver to raise a fatal error in DEBUG mode. As such code is legal, though senseless, I changed the fatal error into a runtime warning (Bug #0000051).
New efun sha1() to compute a SHA1 message digest (thanks, Fippo!)
Efun write_file() can now delete a file before writing to it.
About 3.3.520
A suggestion from BatMUD: unique_array() The separator function can now be a closure, and can also be given extra arguments.
About 3.3.519
I had to restrict '&(struct->member)' type constructs to a single level of member lookups because I couldn't really figure out how to get the lvalue generation right over multiple levels.
About 3.3.518
sprintf(), printf(): Format specifier '%b' prints a number in binary notation (thanks, Ralph!).
About 3.3.516
I had to undo the numeric range change as it interfered with the bitflags we use. LPC needs a proper unsigned type for this kind of thing.
About 3.3.515
Heaven7 is using LDMud as native driver - updated the settings/heaven7 accordingly.
Constant numbers exceeding the numeric range (like 2147483648 on a 32-bit machine) cause a runtime error.
About 3.3.514
The closure typecode returned by get_type_info() is now identical to that returned by the 3.2 driver.
However, you are strongly advised to use the newly added symbolic constants in mudlib/sys/lpctypes.h instead of the numeric values.
About 3.3.513
Using input_to() without a command giver crashed the driver.
Corrected a compilation problem when TELNET_DEBUG was enabled.
The erq/xerq checked the wrong error variable when deciding whether to retry a DNS lookup or not.
Under *BSD, using ptmalloc as malloc() replacement caused a deadlock when threads were enabled - now, ptmalloc won't be used as malloc() replacement on *BSD.
About 3.3.512
The configuration should now detect platforms without a trunc() library function.
Corrected the ERQ_LOOKUP in standard erq.
Added lots of german efun manpages.
Added an example for non-blocking DNS lookups from LPC.
About 3.3.511
input_to() should now be able to put the driver into charmode even with telnet disabled.
About 3.3.510
Added the experimental efun enable_telnet().
About 3.3.509
function_exists() and variable_exists() now check if the object is destructed, instead of crashing (Bug #0000038).
If the H_RESET/H_CREATE_* hooks are defined by name, static functions are found as well.
Made the driver more palatable for SunOS 4.1.
About 3.3.508
restore_value() now checks for and rejects extraneous characters after the '\n' delimiting the value string (Bug #0000039).
Casts to type 'mixed' are exempted from generating an "empty cast" warning (Bug #0000041).
The configuration now checks for libnsl as standard system library - it is needed for ERQ on Solaris (Bug #0000012).
About 3.3.507
Implemented mapping &= mapping and mapping &= vector.
Allowed longer program names in tracebacks.
About 3.3.506
Corrected a sanity range-check in the LPC compiler.
About 3.3.505
The internal declaration of m_entry() specified an incorrect result type.
Updated the random generator to the latest version of the Mersenne Twister.
About 3.3.504
More string handling improvements.
Corrected an editor bug: the faulty commands 'quit'/'Quit' are caught before the text buffer is cleared (#0000046).
Corrected an editor bug: giving 'Z' at the end of the text buffer followed by two 'd' corrupted the internal text storage, which could cause crashers (#0000045).
About 3.3.503
Tweaked the string handling, hopefully improving the memory usage.
About 3.3.502
If H_COMMAND named an non-existing lfun, the driver now raises a proper error instead of crashing..
About 3.3.501
Added fix for a crasher by Alwin - thanks!
About 3.3.500
When sending data over a congested socket, the Xerq a lost and dropped data as result of a bug in the data queuing (thanks, Fantom!).
About 3.3.499
net_connect() wasn't prepared for errors during the LPC logon handling, and tried it over and over again.
About 3.3.498
net_connect() prematurely closed sockets for which it was still waiting on for a connection to succeed.
About 3.3.497
net_connect() crashed the driver.
About 3.3.496
Corrected efun variable_list(): Filtering for static variables didn't work.
Added efun net_connect() courtesy of Muve - have fun testing!
About 3.3.495
It's been a while... what can I say, days have been busy.
Fiona provided updates to the XErq socket daemon code and the telnet negotiation.
sprintf() with the formats %O and %Q now prints floats always with a decimal point.
About 3.3.494
When doing a foreach() over a varargs parameter, the LPC compiler got confused and generated code for a reference-foreach().
About 3.3.493
More improvements to the library detection in configure - I hope.
Retrieving the full socket address from query_ip_number() didn't work.
About 3.3.492
Corrected (hopefully) a configuration problem for Avalon.
About 3.3.491
The max_commands setting was defaulted to 0 instead of -1 for new connections.
Officially documented that a new interactive connection is bound to the master at the time of master::connect().
The macros __RESET_TIME__ and __CLEANUP_TIME__ always used the configured values, ignoring commandline overrides.
New efun master() to return the master object.
About 3.3.490
Corrected a crasher in set_max_commands().
About 3.3.488 and .489
Added a third argument to debug_info(DINFO_OBJLIST) to return multiple objects; this can be used to simulate MudOS' objects() efun (yes, this was originally listed for 3.3.486, but that was not true).
New efuns set_max_commands() and get_max_commands() to control the command rate of an interactive connection.
Pragma (no_)warn_empty_casts to control the warnings for casts of an value to its own type.
to_array(string) now treats the string characters as unsigned.
The call_other() on arrays of objects is now configurable; if enabled, __LPC_ARRAY_CALLS__ is defined.
About 3.3.487
The correction to the function handling missed a couple of subtleties, which are corrected in this patch.
__INIT() is no longer visible as simul-efun.
About 3.3.486
Removed a crasher when a private lfun shadowing a public sefun was virtually inherited twice in parallel.
Removed a crasher when a walk_mapping() over a mapping deleted elements from the very same mapping.
Passing 0 as argument to set_{combine,connection}_charset() re-establishes the default charset.
New efuns get_combine_charset() and get_connection_charset().
Experimental: the number of commands (line or char) of a connection is now limited to 10 per second. This is meant as a safety measure for muds using lots or charmode connections - if it works out, I'll make the feature permanent and more configurable.
About 3.3.485
Removed a crasher when printing anonymous structs with no members.
About 3.3.484
Removed a problem in creating local context lvalues, which caused map( arr, (: mm[$1]; :) ) to fail.
About 3.3.483
Removed a crasher in the lexer.
About 3.3.482
Postgres on SuSE 8 systems is now detected.
Also removed a number of signed/unsigned compiler warnings.
About 3.3.481
When mySQL/PostgreSQL support is requested, but not implemented on the machine, the configure script still enabled the respective packages, causing the driver build to fail. This should no longer happen.
About 3.3.480
Redefinitions of LPC preprocessor macros now list the file and line of the original definition.
About 3.3.479
Added statistics for the small block defragmentation.
About 3.3.476-.478
Added support for OpenSSL as alternative to GnuTLS. As there are hardly any usable docs for OpenSSL (at least none that I could find), I had to copy&paste from demo programs - so expect a lot of bugs.
About 3.3.475
New commandline options --tls-key and --tls-cert to define the x509 key- and certfile for the TLS package.
About 3.3.473 and .474
Gawain provided a TLS implementation using GnuTLS.
.474 corrects a couple of compilation errors (it took me the good part of a day to install GnuTLS after I checked in .473, so I didn't notice before).
About 3.3.472
Casey provided a change to variable_list() to return the value of the variables as well.
About 3.3.471
The mySQL package now checks if it has been compiled against the client the driver was actually linked with.
About 3.3.470
Reduced the computational expense of the small block defragmentation (I hope!).
Saving object values in the old format still used the new syntax for shared strings.
About 3.3.469
A single missing '|' in the smalloc allocator caused a flag to be clobbered and occasionally the driver to crash.
About 3.3.468
Corrected a crasher in the small block defragmentation, and reduced its overhead.
About 3.3.467
If a #pragma requires the return type of a function, the error message now prints the correct name of the pragma.
In charmode, CR and LF are considered normal data characters.
About 3.3.466
Reduced the number of times check_map_for_destr() is called during mapping compaction.
About 3.3.465
I implemented a lazy defragmentation scheme for the small blocks in the smalloc allocator.
Oh, and the dhrystone modules reported a result which was by the factor 10 too low.
About 3.3.464
Improved the recognition of the crypto libraries.
Added some experimental code for machines with 64-bit longs. This however will be a long-term development.
About 3.3.463
Corrected compilation errors in sysmalloc and ptmalloc.
About 3.3.462
Embarassing: -= errorneously raised an argument error when subtracting an int from an int.
About 3.3.461
Made the cast checks more informative.
About 3.3.460
Casts with no effect (like casting an int value to int) now generate a warning.
The operators -=, *= and /= can now operate on int x float values, yielding a float result.
About 3.3.459
Bugfix: Subtracting arrays of closures from each other now actually identifies identical closures.
About 3.3.458
Overflowing the value stack during a secure apply (e.g. during an implicit master call) could crash the driver in the error recovery.
About 3.3.457
Corrected a compilation problem when using ptmalloc, and also implemented Gawain's patches for the lock logic in that allocator.
About 3.3.456
Improved the stack/heap check to better cope with machines with non-traditional memory layout.
Character constants with the 8th bit set now appear as positive numbers.
New macro __MAX_MALLOC__ returns the internal upper limit for the total memory usage.
About 3.3.455
Removed a memory leak in efun printf().
About 3.3.454
Made the error handlng more robust against recursive out-of-memory conditions.
About 3.3.453
Improved the handling of CRLFs when restoring values.
Oops, I accidentally disabled the strong type pragmas some time ago.
About 3.3.452
Added the modifier publish zu catch(). It causes catch() to call master::runtime_error() for a caught error, which is useful if you have an error database running from the method.
About 3.3.451
When using pthreads, the flushing of the remaining data on closing of a connection was not quite correct.
Restoring values now accepts CRLFs as line end convention.
About 3.3.450
In the editor, only consecutive 'z'/'Z' commands do not reprint the current line; a 'z'/'Z' after any other command does.
When removing an interactive connection while using pthreads, the remaining unset data is flushed out before the connection is closed.
About 3.3.449
Corrected a crasher in PCRE routines: repeated replacements within one string used illegal arguments.
About 3.3.448
If during a funcall(lfun-closure) the object holding the lfun is destructed, the driver could crash under adverse circumstances.
About 3.3.447
Added support for the MCCP protocol, kindly donated by Finalfrontier.
About 3.3.446
The PostgreSQL code could crash in a GC.
The small-free-blocks statistics was wrong.
About 3.3.445
Added support for PostgreSQL. Please test it and let me know what is missing.
About 3.3.443+.444
The save_object() and save_value() efuns now allow to specify the format of the saved data.
About 3.3.441+.442
The smalloc allocator is now able to merge adjacent free small blocks right when they are freed, eliminating the need for the expensive memory consolidation.
If the GC finds lost memory blocks of unknown type, their data is printed as proper hexdump to the gc log.
About 3.3.440
A preparationary patch on the way towards a more efficient defragmentation of small blocks in smalloc. This patch cleans up some code and introduces an (internal) minimum allocation size.
About 3.3.439
The efuns filter() and map() can now be applied on strings.
About 3.3.438
A runtime error in a heartbeat no longer aborts the heartbeat cycle.
debug_info(): Added DID_ST_BOOT_TIME to the DINFO_DATA: DID_STATUS result.
wizlist_info(): The evalcost statistic is now split into 'ticks' and 'gigaticks', and a second non-decaying evalcost statistic has been added.
About 3.3.437
Made the use of set_this_object() clearer in the manpage.
Efun remove_action() can now also remove all actions defined by an object.
About 3.3.436
Self-referential struct types could crash the GC when the defining program was destructed.
About 3.3.435
The driver now logs which erq executable it tries to start.
About 3.3.434
The automatic cleanup didn't properly handle swapped out programs, causing the swapped data to hold invalid pointers.
About 3.3.433
The efuns mkmapping() and to_struct() can now convert between mappings and structs.
About 3.3.432
The switch() now demands a syntactic block (statements enclosed in {}) as body, not just a statements. This deviates from the C syntax, but as the LPC compiler doesn't compile switch bodies of a single statement well, this will help to prevent malfunctioning code (at least until the compiler has been improved).
remove_input_to() now restores the proper noecho state after removing a pending input_handler.
About 3.3.431
While a set_this_object() is in effect, the driver now actively prevents function calls by address and accesses to global variables. Both were already illegal, but still possible and could cause strange malfunctions or even crash the driver.
About 3.3.430
Removed a crasher when assignments were made to non-existing struct members.
About 3.3.429
When saving values, shared strings now use the <n> notation - this is mostly useful to reduce the size of struct value sets.
About 3.3.428
New efun m_entry() to return all values for mapping entry at once (the counterpart to this efun is m_add()).
New efun strrstr() can search strings within strings backwards.
Operator & can intersect mappings with other mappings and arrays.
Corrected the restoring of saved operator closure #e:,.
About 3.3.427
New efun rmember() to search arrays and strings from the end.
Modifier # for sprintf() types %O and %Q to print the values in a compact format.
About 3.3.426
Saving struct values now includes the defining program's name in the data, so that the restoring can be done across objects.
About 3.3.425
Made a couple of corrections to the data cleanup code; this also should fix the 'memory freed twice' crasher during the GC.
Removed a memory leak in find_call_out()/remove_call_out().
About 3.3.424
Corrected a bug in saving shared variable closure values.
New commandline option --filename-spaces to allow space characters in filenames.
About 3.3.423
Removed a memory leak in the mapping code.
About 3.3.422
The cleanup algorithm accidentally freed closure driver hooks if they were still bound to destructed objects.
About 3.3.421
Corrected a build problem concerning an interaction between MALLOC_CHECK and MALLOC_TRACE: the latter requires the former.
About 3.3.420
New configuration option --enable-malloc-sbrk to selectively allow the memory allocator to use sbrk() instead of malloc() where available (default is to allow sbrk()).
About 3.3.419
Corrected a problem in the GC: the hash part of mappings wasn't properly marked as 'referenced'.
About 3.3.418
Removed a crasher in the struct code.
The garbage collector can now collect mappings with a hash part (I hope).
Gawain added more locking code to the ptmalloc allocator.
About 3.3.417
I gave the LPC compiler the ability to reactivate old struct definitions, if they match the new ones in name, defining program and internal structure. This way accidental updates of for example an /std/types object won't break the whole mud.
About 3.3.416
The variable swapper got out of sync when encountering mappings with destructed objects as keys. This wasn't a problem before because mappings were compacted faster than they were swapped.
About 3.3.415
Configuration option --with-optimize to set the optimization level in the generated Makefiles. Settings are: no, low, med or high.
There is a problem in the driver which manifests itself in corrupt data in variable swap blocks. As this is my only clue at the moment, I have added some sanity checks to the swapper.
About 3.3.414
I modified the mapping compaction conditions: a mapping is compacted (outside of a GC) when entries haven't been added or deleted for at least 10 minutes, and if either more than half of the condensed entries have been deleted, or if the number of hashed entries exceeds the number of condensed entries.
About 3.3.413
Since the driver already cleans up the objects in the backend, the mapping compaction might as well be done then, too. So: no extra 'dirty mapping list' anymore.
About 3.3.412
An experimental change to the internal memory pools: by restricting the maximum size of one of their blocks, I hope to reduce fragmentation in the large block heap.
About 3.3.411
The GC with enabled MALLOC_LPC_TRACE crashed if a mapping or vector was owned by the 'default wizlist entry'.
About 3.3.410
I modified the mapping compaction such that a dirty mapping is compacted if either more than 10 minutes have passed since the last change, if more than half of the condensed entries have been deleted, or during a GC. The idea is to avoid frequent reallocations for busy mappings, especially big busy mappings where the compaction can cause severe memory fragmentation issues.
About 3.3.409
The OBJ_DUMP now also contains the object's creation times.
When printing an alien-lfun closure, the object the closure is bound to is printed in [].
Consecutive 'z' or 'Z' commands in the editor no longer repeat the previous current line.
About 3.3.407 + 3.3.408
New configuration option --enable-malloc-sbrk-trace to enable a log of all system memory requests, including the stats for the memory allocation requests causing them. The intention is to help debugging muds with high system memory usage.
About 3.3.406
Corrected a bug in the garbage collection of structs, which could lead to memory corruption.
Corrected a memory leak in efun m_add(), which happened when existing entries with no-scalar values were overwritten.
About 3.3.405
Two new efuns: variable_list() and variable_exists().
About 3.3.404
Improved the error messages for when mapping[a, b] is used with wrong types at runtime.
About 3.3.403
Corrected a problem in the interaction of the GC and the swap memory buffers, which could lead to memory corruption.
About 3.3.402
Made the internal strbuf routines more resilient against out-of-memory conditions.
Improved the DEBUG: MEM diagnostics when memory blocks are just re-allocated.
About 3.3.401
Corrected a bug in the struct code which could cause structs to be dereferenced prematurely.
About 3.3.399 + 3.3.400
Some muds are still using enourmous amounts of system memory for no apparent reason. I have now added a diagnostic to every esbrk() memory request, logging the location and originally requested size to stdout. The diagnostics start with the text "DEBUG: MEM ", and you should at least define MALLOC_TRACE to make them useful.
About 3.3.398
Corrected a compilation problem.
About 3.3.397
Macro __MSDOS_FS__ is defined on systems using the MS-DOS filesystem conventions.
About 3.3.395 + 3.3.396
I have the suspicion that the swapper and the file-reading efuns (read_file(), read_bytes() and restore_xxx()) cause an increase in the total memory allocation when confronted with large data: the necessary buffers can't be allocated from the existing memory pool due to fragmentation.

I have therefore added persistent buffers for these efuns, which only increase in size, but aren't deallocated except by a GC.

About 3.3.394
Simplified the small block allocator somewhat: since the allocator has been enable to handle 'oversized' small blocks, the special case of 'unused space' in the current small chunk is no longer necessary.
About 3.3.393
I reduced the upper limit for small block sizes, and also defragment the small freelists automatically, hoping to achieve a better reuse of freed memory.
sprintf() now works with a static format buffer, instead of continuously allocating and deallocating one from the dynamic memory.
About 3.3.392
When parameter min-small-malloc is used, the allocator now makes sure that this block is allocated directly from the system as well.
About 3.3.391
Gawain provided first code to make the ptmalloc-GC threadsafe. Have fun testing!
About 3.3.390
Inverted case ranges like 100..50 have always been illegal, but so far the LPC compiler just ignored them instead of generating an error message.
About 3.3.389
Corrected a compilation problem of ptmalloc with x86-gcc.
About 3.3.388
The last patch introduced a fatal error into the break and continue handling - this is corrected now.
About 3.3.387
The LPC compiler choked on break and continue when used in large programs, and silently corrupted the generated bytecode.
Gawain has brought the GC in ptmalloc into alpha-status: it can be tested, will likely crash, and it isn't threadsafe yet.
About 3.3.386
I finally found (with help) that insidious bug in the memory allocator, which requested more and more memory from the system even though there were megabytes available in the freelists.
About 3.3.385
Assignments to multi-level struct references didn't work.
About 3.3.384
Runtime warnings leaked the filename of the affected object.
About 3.3.383
The reference count of struct typeobjects is no longer changed by the swapper. This avoids premature freeing of typeobjects with swapped-out values, and also avoids a nasty interaction between swapper and garbage collector.
About 3.3.382
Corrected a small, but fatal error in the memory allocator.
About 3.3.381
Improved the error messages when an expected structure is not found at runtime.
It is no longer possible to drive a struct from a struct prototype (this also catches struct Foo (Foo) { ... }).
About 3.3.380
Restoring plain lfun closures no longer worked.
About 3.3.379
Small correction to the operators &&= and ||=.
About 3.3.378
I removed the configuration option INITIALIZATION_BY___INIT. In it's stead, it is now possible to select on a per-program basis if a clone's variables are initialized by __INIT(), or by copying the current values from the blueprint. The default behaviour can be selected during configuration, or with a commandline argument.
See initialisation(LPC) for more information.
About 3.3.377
The LPC parser didn't compile on all systems.
About 3.3.376
The configuration check for pthread_atfork() always failed.
Removed a compilation problem.
About 3.3.374+.375
Implemented proper short-circuit evaluation for operators &&= and ||=.
About 3.3.373
Corrected a string reference count bug in andor//xor_bits(), which over time could cause memory corruption.
About 3.3.372
Gnomi pointed out historic misfeature: a #pragma strict,strong_types in an included file was valid only until the end of the include; the including file saw no change. I can't seen any sense in this, so I removed this behaviour.
About 3.3.371
Saving/restoring objects didn't handle shared closures, which could lead to endless recursions.
The context for inline closures wasn't compiled correctly when local variables were used in the initialisation expressions.
About 3.3.370
Improved pthreads support for platforms without pthread_atfork(), like FreeBSD.
About 3.3.369
Swapping structs during a GC needlessly triggered a sanity check.
About 3.3.368
Removed a fatal bug in the rexalloc() implementation.
About 3.3.367
The typetracking for assignments to struct members was faulty.
About 3.3.366
Corrected the allocation statistics, which could lead to false 'MAX_MALLOCED limit reached' aborts.
About 3.3.365
Efun member() crashed when passed a struct as second argument.
Implemented struct-lookups on mixed-typed expressions.
About 3.3.364
The configuration option --with-malloc didn't quite work.
About 3.3.363
Self-referential structs caused the GC to crash.
About 3.3.361+.362
Found an implementation restriction in replace_program(): If the replacement program contains virtually inherited variables, it must be the first inherited program for the replacement to work. The efun now checks for this condition.
About 3.3.360
Well, *blush*, seems that I was a bit too enthusiastic in the last announcement - Gawain is working on bringing the GC to ptmalloc, and he's making great progress; but it's not finished yet. Still... Yay!
Gawain fixed a fatal bug in the GC part of ptmalloc.
About 3.3.358+.359
Gawain has added GC support to the ptmalloc allocator - this brings the pthreads-using drivers to the same level as their single-threaded incarnations.
If no specific allocator is selected during the configuration, the script will automatically select the proper allocator to suit the pthreads setting.
About 3.3.357
Bug corrections: indexing one-past the end of an empty string didn't work; the lexer got confused with line contiuations in preprocessor conditionals under Windows.
It is now possible to redefine a function using more arguments.
About 3.3.356
Corrected two more fatal struct errors.
About 3.3.355
Just a small internal improvement.
About 3.3.354
Removed the configuration option 'no-blueprint', as the code has been proven stable.
About 3.3.353
Corrected two more errors in the compilation of struct code.
About 3.3.352
The result array for wizlist_info() was allocated too small, eventually crashing the driver.
Removed compilation errors when __INIT was not used.
About 3.3.351
The ptmalloc module didn't compile on all systems.
New configuration option malloc-check (enabled by default) allows the allocator to implement simple checks. Currently smalloc uses this to tag allocations with magic words, catching basic memory misuses.
About 3.3.350
Removed a couple of refcount errors in the struct handling.
About 3.3.349
Many mudlibs like to index one past the end of a string, which in the older drivers was legal. But it's not exactly clean coding because it relies on how strings are stored internally (ie. with a trailing null character), so while it's (again) possible with 3.3 to read a character this way, with #pragma warn_deprecated you will get a warning.
About 3.3.348
Removed a crasher when inheriting functions with struct arguments.
About 3.3.347
Removed a crasher from the memory consolidation phase of the GC.
About 3.3.346
Corrected a compilation problem (gcollect.c still used SMALLOC_OVERHEAD).
About 3.3.345
A garbage collection did not adjust the xalloc statistics.
About 3.3.344
I re-implemented the struct support: structs are now datatypes by themselves (and not rebadged arrays), and allow reflection, ie. looking up and using member names at runtime. See doc/LPC/structs for more information.
About 3.3.343
Gawain adapted the threadsafe ptmalloc2 allocator for LDMud - thanks! Only drawback is that it doesn't support GC (yet?).
About 3.3.342
Removed a crasher: when saving lfun closures, the function name could be looked up in the wrong program.
About 3.3.341
Just clarified a comment.
About 3.3.340
Efun regreplace() didn't test the existance of a particular subexpression match for the \int replacement pattern.
About 3.3.338+.339
Cygwin in highest optimization created buggy code in the LPC lexer.
About 3.3.337
A missing H_NOTIFY_FAIL hook could crash the driver if the H_SEND_NOTIFY hook was set.
About 3.3.336
The counter for memory used was never decremented, causing the driver to signal a 'MAX_MALLOCED reached' when in fact memory was available.
About 3.3.335
Saving lfun closures could crash the driver (I accidentally deleted an important piece of code).
About 3.3.334
Restoring efun closure values now checks if the efun has been overridden by a nomask simul-efun.
With pthreads: made removing an interactive thread safer.
About 3.3.333
Restoring mappings with closure values didn't work.
About 3.3.332
Corrected a preprocessor problem in the xalloc layer.
About 3.3.331
Corrected a small problem in the xalloc layer.
About 3.3.330
Removed a crasher which happened if a login-object destructed itself in the logon() function.
About 3.3.329
Corrected a compilation problem (which my gcc leniently ignored).
About 3.3.328
It is no longer possible to define a variable to be of type 'void'.
About 3.3.327
I straightened out the interface between the allocator and the rest of the system. In particular, the MALLOC-tracing is now done on the xalloc() level, and the GC no longer relies on the knowledge of smalloc's internal structures.
About 3.3.326
The restore_() and save_() efuns can now save and restore non-lambda closures, symbols, and quoted arrays - perfect for storing ready-to-be-compiled lambda closures. However, the savefiles can no longer be read by earlier drivers (the other way around works).
About 3.3.325
Removed a memory leak in the mappings - it mostly happened during swapping and (ironically) cleanup.
About 3.3.324
New operators &&= and ||= for logical assignments.
Added some documentation.
About 3.3.323
Dale Perkins provided a nifty web logo.
Efuns copy_file() and rename() no longer throw exceptions on errors, but just return a non-0 value. In some future, the result will be an error code or message.
Fiona provided more patches for the telnet code, and an updated telnetneg LPC module.
About 3.3.322
The input prompt was not always piped through an existing catch_tell().
About 3.3.321
When logging in a new player, the prompt wasn't printed, which played havoc with muds which are using the new input_to(INPUT_PROMPT) feature.
If the driver is able to reallocate the reserved areas after detecting an 'out of memory' condition, the condition flag is reset.
About 3.3.320
Updated the patch-o-matic to use the new executable name.
The filenames returned by include_list() now always start with a '/' to make their reuse in include statements simpler.
Fiona generously donated the telnet negotiations module from Wunderland, containing a complete implementation of the telnet protocol.
In efun sprintf.c the %O/%Q formatter stumbled over really large arrays and mappings; in fact this was a potential crasher.
About 3.3.319
Corrected a typo in the Makefile.
About 3.3.318
The executable has been renamed to 'ldmud'.
A couple of changes to the configuration and compilation process:
The configure script tries to find out the valid compiler warning options on its own.
send_erq() callback closures can now accept a string instead of an array.
Corrected the lp-245 mudlib to no longer use the function keyword as variable name.
About 3.3.317
Fiona provided a number of corrections for CHARMODE handling - thanks!
About 3.3.316
Brainfart: the problem to correct was that wildcarded supercalls ("*"::fun()) looked at all inherited programs, and not just the directly inherited ones.
About 3.3.315
For wildcarded supercalls ("*"::fun()) the compiler now makes sure that each function is called only once.
About 3.3.314
Small corrections: removed a defunct source-file; documented in doc/LPC/types the formats of ints, floats, chars and strings, and corrected doc/concepts/erq in a detail.
About 3.3.313
Small change to the BeOS development process, so that it is no longer necessary to store the version numbers in the BeOS Makefile.

...and this is patch #5 for today...

About 3.3.312
More corrections to transfer() - funny though that nobody has noticed these errors before :-)

Hmm, this is now the fourth patch in one day - a new best!

About 3.3.311
Correction of a deadlock when using pthreads.
About 3.3.310
Corrected a bug in the deprecated efun transfer(): the result of dest->can_put_and_get() was ignored.
About 3.3.309
Removed a potential racing problem when using pthreads.
restore_object("#0:0") caught the driver in an endless loop.
Guandalug contributed a patch-o-matic for automatic driver updates.
About 3.3.308
With the invention of the context closures the internal space advantage of lfun- over alien-lfun closures is mostly gone, so I merged the two.
About 3.3.307
Corrected a few refcount errors in the dangling-lfun handling.
An internal change to the lfun-closure layout in 3.3.306 caused strange crashes - I undid the change.
About 3.3.306
The conversion of dangling lfuns into dangling alien-lfuns (dev.482) had the small problem that these lfuns had to be created as alien-lfuns. That's what is done now.
About 3.3.305
When cleaning up objects, strings could get freed twice. Oops.
Some source cosmetics.
About 3.3.304
Inline closure spanning include files were created even though the parser recognized them as faulty.
About 3.3.303
Destructed objects sometimes weren't cleaned up.
About 3.3.302
The list of players to flush could get clobbered, stopping output for certain players altogether.
About 3.3.301
Corrected a linenumber counting bug caused by the new inline closures.
About 3.3.300
A typo in a preprocessor conditional had permanently disabled the data cleanup code.
About 3.3.299
Swapping strings during a GC could crash the driver.
About 3.3.298
Corrected an off-by-one error in sprintf() which crept in with the last patch, but wasn't noticeable in the simple tests.
Corrected a crasher in get_type_info(unbound-lambda,2).
Corrected a potential crasher in the handling of netdead objects with pending output.
About 3.3.297
The crashes were caused by a bug in the swapper, which was not prepared to swap strings with embedded \0 bytes; the new cleanup code just happen to trigger the bug sooner than later. I corrected the swapper and reactivated the cleanup code (if you want to deactivate it for testing purposes, you have to edit the define in config.h).
I reduced the frequence of the data cleanup so that it takes an hour to process all objects. Swapped and reset objects are not cleaned up unless more than the normal cleanup time has elapsed.
I made the efuns debug_message(), sprintf() and printf() work better with strings with \0 characters.
About 3.3.296
The new cleanup code seems to have a weird interaction with the swapper - I got several reports from crashes - so for now I deactivated it. If you want to play with it, add a define for NEW_CLEANUP to the compiler options in the Makefile.
About 3.3.295
Corrected an off-by-one error in the linecounting of the auto-include string.
Removed a warning under gcc 2.x (I hope!).
The backend of the driver now regularly scans the variables of every object for references to destructed objects and removes them/replaces them by 0s. This is in particular helpful for mappings which use objects as keys: if such a mapping is only changed by adding/removing entries one at a time, destructed object keys in the condensed part of the mapping would never be removed. Not only wasted this memory, it also could cause the GC to flag the values referenced by these entries as 'leaks', producing enormous log files.
About 3.3.294
Fixed a crasher when H_NOECHO was called for an destructed object.
About 3.3.293
The library tests in configure weren't quite functional.
The editor sometimes crashed on a missing filename - added checks to prevent that.
About 3.3.292
Dangling lfun-closures are now converted into dangling alien-lfun closures, so that the error handler can determine the originating object.
If the initialisation value to allocate() is a mapping or array, the created array elements will receive a shallow copy of the init value.
Indexing [<] created an out-of-bounds condition which wasn't caught.
About 3.3.291
On (Debian) Linux, the test whether libpthread is required didn't work.
The test in xfree() regarding multi-threaded use also triggered when the memory reserves were released.
About 3.3.290
Sorry, I accidentally removed support for TELOPT_EOR in the last patch, this one rectifies this.
About 3.3.289
TELOPT_BINARY is now one of the options negotiable by H_TELNET_NEG; it is needed for non-US charsets.
About 3.3.288
The auto-include correction uncovered another bug in the LPC compiler.
The configuration script now tries to add only those libraries to the compilation which are actually needed.
About 3.3.287
Improvement to find_input_to() and input_to_info(): functions can be specified by object+name.
Using auto-include strings no longer mess up the line counting.
When the xerq finishes a queued write, it sends a ERQ_OK message to the driver.
Removed a crasher in regmatch( , RE_MATCH_SUBS).
About 3.3.286
Bugfix to reset: the previous object was set incorrectly.
New efuns find_input_to() and input_to_info() to make handling input-tos simpler.
Added a (very) primitive safeguard to the mallocator - I suspect that pthreads are making re-entrant calls to it.
About 3.3.285
configure now checks for the libresolv, as it's needed on some systems.
The configure script now keeps track which features (like pthreads or mysql) can't be enabled because of missing support.
About 3.3.284
Recognition of pthread support was broken, and if pthreads weren't available, a 'use-pthread=yes' was not deactivated.
The bug b-020916 contained a few segments which played havoc with patches. I split the bug into several, which also means that this patch won't apply either - download the full archive if that happens.
About 3.3.282+.283
Restoring structs stored in mappings didn't work.
When DYNAMIC_COSTS are enabled, deep_copy() counts array/mapping size and nesting depth towards evaluation costs.
About 3.3.281
The OPCPROF functions still used old-style strings.
About 3.3.280
When using structs, inheriting programs clobbered memory, and sprintf("%O",quoted-array) crashed the driver.
In struct literals a trailing ',' is now allowed.
structs are not flattened by the '...' operator or by apply().
About 3.3.279
Gah, forgot to remove a debug output from the LPC compiler.
About 3.3.278
Lfun closures can now explicitely name inherited functions, for example #'base::create.
I also forgot the regenerate the configure script in the previous patch.
About 3.3.277
In struct literals, a trailing ',' is now allowed.
The indexing range [..expr] created faulty bytecode, maybe even clobbered memory, under certain circumstances.
About 3.3.276
structs now carry an id string which can be queried using get_type_info().
About 3.3.275
There goes to show: I just have to declare categorically that the form (: <statements> :) is impossible to parse with the new inlines and go run a race, and promptly I get an idea how to parse it after all. A plain obvious one, too. My apologies to all who started rewriting their mudlibs.
Removed a couple of crashers regarding structures and new inlines.
About 3.3.274
The error handling for the (: :) form of the new inline closures was lacking, causing the parser to get confused or crash after an error.
I probably haven't documented it clearly enough, but the new inline closures bring to important changes from the old:
About 3.3.273
Untyped inline closures didn't cooperate with #pragma strict_types
And guess what: there was no predicate structp() to detect structures.
About 3.3.271+.272
I have debugged the new inline closure code, and it seems to run quite well. Therefore this new feature is on by default. If you experience too many incompatibilities with your existing code, or if the driver misbehaves, you can deactivate the new inline closures in the configuration.
And 3.3.272 corrects a compilation error in 3.3.271 .
About 3.3.270
The new inline closures are alpha-complete: I can't think of anything else to add, the code compiles, but hasn't been tested yet. It is therefore still inactive, and the point of this release is to see if I broke anything else in the process.
About 3.3.269
Added some infrastructure for the new inline closures.
About 3.3.268
Small corrections; in particular the debug.log file was opened with an incomplete name.
About 3.3.267
New driver option --hostname <name> to specify the hostname, overriding the value returned by the system.
New driver option --hostaddr <addr> to specify the hosts address, overriding the value returned by the system. In particular this address will be used to open the driver ports under.
With pthreads: the diagnostic 'Thread x cancelled and cleant up' might again cause memory corruption. I replaced the fprintf() with something safer.
The driver now checks if an object to be loaded appeared out of nowhere while it was compiled. This can happen when the compilation caused warnings or errors, and the mudlib handled used rename_object() carelessly.
About 3.3.266
The PThread support can now be configured normally using the --enable-use-pthreads. The maximum amount of data pending is configured with --with-pthread-write-max-size and can be changed with the commandline option --max-thread-pending (yeah, inconsistent naming here).
If a connection is marked for removal (e.g. due to a remove_interactive()), telnet commands are still sent to the socket and not dumped to stdout.
Struct can now be compared with == and !=; they can be used as values in foreach() statements and with apply() resp. the ... operator.
About 3.3.265
With USE_PTHREAD: the thread cleanup sometimes dereference a NULL pointer.
About 3.3.264
Using LPC tracing with lambda closures or call_resolved() crashed the driver.
About 3.3.263
The USE_PTHREAD implemention unfortunately ignored that the smalloc memory allocator is not threadsafe: when printing large amounts of texts, eventually the writer thread would free a memory block while the main thread was in the mid of an allocation/deallocation of its own.
The GC miscounted the references on program names, introducing a small memory leak.
Guandalug provided a couple of bug fixes.
About 3.3.262
Bugfixes to efuns set_modify_command() and inherit_list(), and to the check for duplicate toplevel inherits in the LPC compiler.
Added the lpc-mode.el written by Vivek Dasmohapatra.
About 3.3.261
Added the interpreter infrastructure for the new inline closure. Now we just need to add the compiler support...
About 3.3.259/3.3.260
Efun transfer() is now officially deprecated (but still available); the old behaviour of parse_command() is no longer available.
Since the efuns set_light(), set_is_wizard(), and process_string() have been optional for a long time, they can now be enabled/disabled in the configuration process. Oh, and I renamed the config option supply-parse-command into use-parse-command.
The new doc directory doc/obsolete/ holds all the manpages for removed driver functionality - this information sometimes comes in handy, for example when reworking old code.
The driver hooks are now documented one-per-file in the directory doc/hook/.
And a new efun match_command(), which performs the normal driver command matching and returns an array with the results. It can be used for debugging, or to implement your own command handling (in the H_COMMAND hook).
About 3.3.258
Nasty crasher in the LPC compiler: assignments to a struct member caused the LPC compiler to use uninitialized memory if the member lookup had failed.
About 3.3.257
Two bugfixes to the LPC compiler for bugs which clobbered memory.
Then PThreads are used, the newly created threads are now properly detached.
The argument checking for sefun compiled in lambda closures didn't work properly.
The object statistics seem to be correct, so the CHECK_OBJECT_STAT debug macro is by default off now.
About 3.3.256
Some source changes to reduce the coupling on generated include files.
Config option COMPAT_MODE is now purely a default for the runtime option.
About 3.3.255
The new #pragma warn_deprecated instructs the LPC compiler to print a warning whenever a deprecated efun is used.
The string statistics were slightly wrong.
About 3.3.254
The "some source work" also broke mapping lookups *blush*.
Wildcarded supercalls (e.g. "*"::reset()) created invalid bytecode if there was not function found to call.
The type checking regarding assignment and addition of structs had minor flaws.
About 3.3.253
Just some source work.
About 3.3.252
The struct accidentally interfered with virtual inheritance, leaving behind all kinds of uninitialized memory.
Array-additions are now covered DYNAMIC_COSTS as well.
About 3.3.251
Just a small internal improvement of the commandline argument parser. Oh, and I also removed the compatibility arguments like "check_a_lot_of_refcounts".
About 3.3.250
The efuns to_string() and to_array() now support structs; the new efun to_struct() complements the set.
struct literals with both named and unnamed initializers are no longer legal - it was considered borderline featuritis and not really useful.
About 3.3.249
A struct bugfix: inheriting struct variables accidentally confused the visibility tracking of the LPC compiler.
Just for fun I added the rules for a new inline function syntax. But don't worry: it was really just an experiment to see how complicated it would be - by default the whole shebang is disabled.
About 3.3.248
Markus Peter provided a patch for debug_info() which corrected two crashers, one of them related to structs.
Assignments of mixed to struct are now possible without casts. If you assign something which is not a struct, you'll get a runtime error as soon as you try to access one of the members.
About 3.3.247
What did I say about bugs? Well, restore_object() restored arrays as struct values, and vice versa.
About 3.3.246
structs are fully implemented - Yay! Of course, there are still bugs to fix, and I probably didn't think of the one or other feature, but otherwise...
About 3.3.245
More struct work: Fixed a crasher, and implemented constant struct initializations when __INIT() is not used.
About 3.3.244
struct definitions are now implemented, and can even be inherited (though I didn't test the latter yet). You still can't use them, however.
About 3.3.243
Made some internal changes for struct support. Nothing accessible to the wizards yet, mind you, except that configuration option ALIGN_FUNCTIONS is now mandatory.
About 3.3.242
The string statistics were miscalculated when untabled strings were made tabled.
External callbacks to lambdas (ie. driver hooks) now clear the eval cost before an error is processed.
The object statistics get messed up because variables are counted as 'swapped in' more often than they had been swapped out. I am not exactly sure why - it could be an interaction with the GC - but I moved the computations at somewhat better places in the swap process. Let's see if that helps.
About 3.3.241
Whoa, the SSTAT diagnostics produced really a lot of output. But I have a first clue about what's happening, so I will debug that problem in OSB; for everybody else the diagnostics will be disabled.
About 3.3.240
Added missing %endif in the LPC compiler source - I am surprised that I didn't get any compilation errors before.
About 3.3.239
The string module statistics seem to go haywire after some time. I added a 'DEBUG: SSTAT' diagnostic when that happens.
About 3.3.238
Support for international characters was broken.
About 3.3.237
A first step towards structs: I added the necessary rules to the LPC compiler in order to see if the syntax could be done. Right now they don't generate code, but just throw errors reminding you that structs are not yet implemented.
About 3.3.236
Corrected bytecode generation bug.
About 3.3.235
Since the LP-245 mudlib is actually used by some, I changed it so that all functions are compiled with type-checking enabled.
About 3.3.234
The USE_PTHREAD code didn't compile.
Corrected a few messages.
About 3.3.233
Efun terminal_colour() again: not a crasher this time, but garbage data was printed.
About 3.3.232
Efun terminal_colour(): the bugfix to handle strings with single '%' was not quite complete - the driver still could crash.
About 3.3.231
External master calls (like for ERQ messages) get the same eval-cost benefits during error handling as normal call-others.
About 3.3.230
Corrected some build problems.
The ERQ debugging level is now configured with the option --with-erq-debug=number, where number can currently be 0 (disabled, the default), 1 (normal debug output) and 2 (lots of debug output).
About 3.3.229
Corrected a crasher in the error handling of defines given on the command line.
The ERQs now print their name and compilation date to stderr on startup.
If the driver uses the default debug.log file, its (mudlib) name is available in the predefined macro __DEBUG_LOG__.
Corrected a some minor build problems.
Efun symbol_function() freed a symbol as a string.
Corrected a crasher in the regexp() modifications.
About 3.3.228
New predefined macro __RESET_TIME__ and __CLEANUP_TIME__ to return the default reset and cleanup interval time.
About 3.3.227
Formatting a text with single '%' with terminal_colour() caused to code to search random memory for the '%^' marker - this would explain a number of crashes.
Argument errors in the vararg efuns printed the wrong efun name.
About 3.3.226
Corrected a bug in the array-array operations which forgot to clean out references to destructed objects in short arrays.
About 3.3.225
Corrected a bug in the array-array operations which produced incorrect results for arrays with multiple copies of the same value.
About 3.3.224
Corrected a fatal bug in the array-array operations.
About 3.3.223
Removed compiler option -funroll-all-loops from the configuration as it produced buggy code.
Plugged two memory leaks.
About 3.3.222
One error message printed memory garbage.
Corrected some build problems.
About 3.3.221
I forgot to allow |= on arrays even though | already worked.
And the operators ^ and ^= now also work with arrays and compute the symmetric difference.
About 3.3.220
Ok, adding the copy-on-write semantic was a bad idea: it broke more than it fixed. Therefore I took it out again.
Corrected two small bugs in the configuration code - my gcc took it in stride, other compilers were pickier.
About 3.3.219
The last PCRE patches - Yay!
PCRE is now the configured default for the driver (but I modified all existing mud setting files to use the old regexp package).
Both packages increase the eval-cost counter for every backtrack they have to make during a match. Intention is to catch a pathological match like regexp(({"=XX==================="}), "X(.+)+X") before it freezes the driver for hours.
About 3.3.218
New predefined macros __CATCH_EVAL_COST__ and __MASTER_EVAL_COST__ to carry the corresponding configuration options over to LPC.
The debugging compilation options are now part of the normal configuration mechanism.
Debug macro CHECK_OBJECT_STAT allows tracing of all changes to the tot_alloc_object(_size) statistics. Aim is to find the discrepancy in the 'status' command. To activate the tracing, the commandline option --check-object-stat must be given.
The operations map += map and map -= map now implement the copy-on-write semantic to mirror the behaviour of the related array operations.
get_type_info(closure,2) did not return the bound object for efun, simul-efun and operator closures .
Attempting to replace a program in an object which already has closures bound no longer raises an error, but issues a debug_message().
It is now possible to define non-vararg efuns with more than six arguments.
About 3.3.217
In symbol_function(), symbols were freed as if they were strings.
Signal USR2 forces the driver to reopen the host.debug.log file.
Experimental: Defining USE_PTHREAD (if your system has pthread support) activates code which uses threads to write the socket data to the network in the background. Intention is to avoid EWOULDBLOCK errors on slow connections.
About 3.3.216
How embarassing: the bugfix for filter() and map() broke the efuns for non-multi-value mappings.
About 3.3.215
It has been quite some time since the last update - reason being that I am switching my main development over to OS X, which means that my software environment is not quite working yet. In particular PRCS, which is not quite adjusted to the caseless-ness of the HFS filesystem.
When the efuns filter(), map() were used on multi-value mappings, the driver did not recognize when the called closure kept a reference to the array with the values, overwriting the values in the next iteration.
Fixed two crashers: Calling a self-destructing closure from limited(), and two uninitialized variables in the traceback collection for a catch() frame.
If a program is inherited twice at the toplevel, a warning is raised. If pragma 'pedantic' is in effect, an error instead of the warning is raised.
About 3.3.214
Two changes to regmatch(), suggested by Fiona: non-matches return 0 instead of the empty string, and the efun now takes and returns a start index for repeated matches.
About 3.3.213
During a GC, the list of destructed objects could get clobbered, le