Changes from MudOS 0.8.14 to MudOS 0.9.14.
added a new data type named 'function'. Be sure to change the names of
any variables you may have named 'function'. This data type is a variant
on the idea of function pointers. It may be used to store an
(object, function) pair in a single variable. The constructor for function
variables is as follows:
function f;
f = (: obj, func :);
where obj and func may be anything allowed by call_other(obj, func).
To call the function func in object obj via function variable f, type:
(*f)(arg0, arg1, ...);
You may use the new functionp() efun to detect if a variable is of type
function.
the driver now compiles under the xlc compiler on the RS/6000 (xlc is IBM's
fastest of AIX 3.2 C compilers).
added Mappings and Interactives fields to the stats output by mud_status().
added a new efun set_eval_limit (#define SET_EVAL_LIMIT on options.h) that
allows an object to change the max eval cost limit. Be sure to add
appropriate mudlib level security before enabling this efun (read the
ChangeLog 0.9.13.4).
added Cynosure's livings() efun that returns an array of all objects that
have called enable_commands() (and haven't yet called disable_commands()).
changed the behavior of nullp() and undefinedp() slightly (see 0.9.13.2
ChangeLog).
The catch() efun may no longer be used to trap max eval_cost exceeded
errors (and thus hang the driver).
System V Release 4 support (added M.B. Bundy's patches)
added capability to configure the default 'What?' message via the runtime
config file.
dramatically improved global apply_low (call_other) cache hit rates. Many
muds that used to have hit rates near 40% are reporting 93% and above.
[This improvement results from fixing a bug we found in the LPmud 3.1.2
cache code. See ChangeLog for more details.]
0.9.14 mappings use about 50% less memory overhead per mapping (compared
to 0.9.0).
improved performance. MudOS 0.9.14 is much faster than MudOS 0.9.0
at executing many of the more commonly used eoperators.
created an efuns.h file that should be #include'd from any file that wants
to define new efunctions (see efunctions.c for example).
added strcmp() efun (just like C's strcmp) that is convenient for use in
the compare functions used by sort_array(). sort_array() has been recoded
to use a robust version of qsort so that ill-behaved compare functions won't
crash the driver.
added efuns clonedp() (detects if an object was created via clone_object),
functionp() (detects if a variable is of type 'function').
added a new eoperator F_CALL_EXTRA that allows for 512 efuns+eopers instead
of the previous limit of 256 (easily extended to allow more). This replaces
and enhances the F_CALL_EFUN that we had added to the previous release.
Literally hundreds of bug fixes (read the ChangeLog file in the source
directory for complete descriptions of these if you're interested)
MudOS now runs on more architectures. Here's what we know that it runs on:
- System V Release 4 systems (Dell SVR4 v2.2 [386/486] in particular)
- Ridge (RISC/os)
- Sequent (maybe other SYS VR3 systems or those using POSIX-style signals)
- HP 9000 (HP-UX 7.0 && 8.x)
- NeXT (NeXTStep 2.1 and 3.0)
- DECstations and VAXen (Ultrix 3.1, 4.1, 4.2)
- IBM RS/6000 (AIX 3.2)
- SUN sparcs (SunOS)
(internal change) totally rewrote and replaced communication code in the
driver (comm.c) to be more efficient.
added socket efunctions for inter-object and inter-mud communication
(see separate socket efun tutorial and man pages for more a detailed
explanation)
- int socket_create(int, string, string|void);
- int socket_bind(int, int);
- int socket_listen(int, string);
- int socket_accept(int, string, string);
- int socket_connect(int, string, string, string);
- int socket_write(int, mixed, string|void);
- int socket_close(int);
- int socket_release(int, object, string);
- int socket_acquire(int, string, string, string);
- string socket_error(int);
- string socket_address(int);
- void dump_socket_status(void);
- void dump_file_descriptors();
added MUD mode to the LPC socket efunctions. MUD mode allows LPC
data structures such as arrays, mappings, integers, and strings (all
except for objects) to be sent atomically via sockets.
added DATAGRAM (UDP) mode to the LPC socket efunctions.
(internal change) rearchitected interpret.c to use a function lookup table
rather than one large switch statement. New efunctions should be added
to efunctions.c instead of interpret.c. This enhancement makes it
easier to integrate your own efuns into the driver and it allows interpret.c
to compile on machines that previously had problems with it.
added call to master.c::valid_override(string filename, string function)
for each attempt to override a simulated efunction via the
efun::func_name() method. 'filename' is the path to the file which
is attempting to call efun::func_name(). 'function' is the name of
the efun that is to be overridden. If valid_override returns 0, then
the current compilation will fail (note: valid_override is only called
at compile time and _not_ runtime). valid_override allows
valid_destruct, valid_exec, etc. to be dispensed with since the same
functionality can be obtained by wrapping the efun in question with a
simul_efun of the same name (and including valid_* style checking in the
simul_efun). Gist of the idea taken from Amylaar's done file.
added the option of configuring the driver so that resets (the calling of
reset() in LPC objects) happen in a lazy fashion (by defining LAZY_RESETS
in options.h). This option allows resets to happen in an incrementally
(rather than all in one pass) and it prevents resets from occuring unless
the object to be reset is touched (via an apply_low or move_object) after
the usual required reset delay has occurred. The benefits of this option
are that performance is smoother (no reset lags) and memory is conserved
(since those object which are touched once and never again won't have reset
called in them and hence won't reload any objects in reset()).
changed various efunctions to honor the hidden object flags so that
the set_hide() efunction now offers true driver-supported invisibility
of objects.
new internal implementation of mappings (associative arrays) which is
faster and more robust.
new efuns for mappings:
- keys() - this used to be named indices()
- values() - the inverse of keys()
- each() - traverse a mapping
split config.h into options.h and port.h. This simplifies the task
of configuring the driver to run on a particular machine. In most
cases, it will be sufficient to configure options.h (options.h contains
configuration options pertaining to preference rather than portability).
fixed make_func.y so that it correctly processes func_spec.c on the
HP and Sequent.
added a NO_ANSI option to options.h that allows escape codes included
in user commands to be replaced with spaces.
added a MAX_SAVE_SVALUE_DEPTH macro to options.h which solves the problem
of calling save_object on an object containing a data structure with
a circular (recursive) reference. Admittedly, this isn't a true fix since
the object in question (having the circular reference) cannot be saved;
however, this is better than allowing the driver to hang. (Yes I know
that Amylaar solved this by saving the circular reference in a recoverable
fashion. I didn't consider it an important enough problem to spend the
time necessary to adopt his solution).
added a new efunction replace_string() (see the replace_string man page)
added a clonep() efunction that determines if an object was created
via the clone_object() efunction.
added a localtime() efunction (see the localtime(3) man page)
added an uptime() efunction that returns the number of seconds since
the driver has been running.
removed the mudwho code from the driver (including clilib.c). We have
implemented the mudwho protocol (same as that implemented in clilib.c)
in LPC using the new MudOS socket efunctions (DATAGRAM mode). See the
README in the included mini-mudlib for more details.
changed inherit_list() and deep_inherit_list() not to return the filename
which is passed to them.
added a configuration option that causes this_player() to return 0 inside
callbacks made by call_out().
heartbeat interval can be now be specified in units of microseconds on
those machines with the ualarm() system call.
size of the call_other cache table is configurable (via the
APPLY_CACHE_BITS define in options.h).* (internal change)
totally rewrote and replaced communication code in the driver (comm.c) to
be more efficient.
made the ed() efunction (internal editor) optional.
input_to can now take extra arguments so that you can pass one or more
extra arguments to the function input_to calls (notice
that this feature makes it possible to avoid using global variables which
makes it easier for a single object to be designed to
beshared by many players [e.g. daemon-style objects]). For example:
void get_name(string name, object new_player)
{
write("\nWhat is your email address: ");
input_to("get_email", 0, new_player, name);
}
void get_email(string email, object new_player, string name)
{
new_player->set_email(email);
new_player->set_name(name);
}
implemented variable arguments to call_out just like the additions made to
input_to described above.
You can now compare mappings for equality using the == operator.
the message() efun now works. For more info read the accompanying doc on
this important new efun!
several new required functions to be implemented in the mudlib master.c:
- valid_socket - security to monitor or limit usage of the new socket efuns
- valid_domain - a check for domain_stats to make sure that it only keeps
stats on domains that you care about
- valid_hide - for the set_hide() efun so that who can be "hidden" is
controlled by master.c
- slow_shutdown - when the driver is running out of memory and wants a
nice shutdown it calls this
several new additions to the runtime configuration file:
- inherit chain size : the maximum inheritance depth allowed. This is
mainly to prevent infinite inheritance loops
- maximum mapping size : similar to maximum array size
- address server ip : machine name where an addr_server is running
- address server port : port number that the addr_server is listening on
- max users : this used to be max players (doesn't matter anyway, since
this is still unused by the driver here)
- maximum efun sockets : control the number of efun sockets open at once
- maximum string length: controls the maximum allowed string size
wizlist() changed to domain_stats(), this is to make statistic taking more
consistant with the new domain model versus the wizard model previous
to LPmud 3.0. See also: author_stats()
valid clone - this isn't enabled by default, but with some changes to
options.h, clone_object will fail if an object doesn't have read permission
on the file being cloned. (note: this is pretty useless since inheritance
doesn't have a similar check)
old "parser magic functions" were changed into efuns:
- malloc_status() - was the 'malloc' command
- dumpallobj() - was the command of the same name
- mud_status() - was 'status' (use mud_status(1) to get 'status tables'
some new debugging efuns were added or changed:
- rusage() now returns a mapping of the values returned by the
getrusage() system call.
- debugmalloc() - if the driver is compiled with malloc debugging enabled
this prints out more detailed malloc information
- set_malloc_mask() - control the level of info being debugged with
debugmalloc
- set_debug_level() - more control on debugging levels (see debug.h in
the src directory)
- opcprof() - dump a file detailing efun usage (usage frequencies)
- cache_stats() - display call_other function table cache hit rate
information
removed the old hname process and replaced it with a new autonomous (not
forked from driver) addr_server program that can be shared by several
different drivers at once.
removed the cindent() efun
removed the describe() efun
removed two unused variables from the runtime config system
- global include file
- max commands per heartbeat
removed everything to do with the "priveleged object" concept
removed everything to do with "global verbs", "global preverbs" and
"preverbs"
all objects now call create when first loaded, even if loaded via
inheritance (create called in the original objects, not what's
being inherited)
crash in master.c is now called with three args (type of crash,
command_giver, current_object)
if the driver crashes it tries to dump its core file in /cores
if that dir exists and core dumping is enabled
removed the global define LPCA and replaced it with MUDOS (LPC objects can
do #ifdef MUDOS)
added AUTO_SETEUID option. if defined, all objects do the equivalent of
seteuid(getuid(this_object())); when created.
added AUTO_TRUST_BACKBONE define so that you could disable the automatic
trusting of backbone uid objects if you want.
added Pinkfish's modifications to parse command package so that it actually
works now. :-)
added an optional integer argument to the shutdown() efun. when an
argument is specified, the driver exits with that exit code.
removed smalloc from the driver completely (memory alignment violations and
other problems made it not worth dealing with).
added BSD malloc as an option (seems to work well for those machines having
slow system mallocs like the HP).
added the concepts of "null" and "undefined" to variables and added two
efuns to make use of these concepts
- nullp() - returns true for unitiliazed variables and destructed objects
- undefinedp() - returns true for (1) call_others to non-existant
methods, (2) access to map keys that aren't in the map, and
(3) arguments in the formal parameter list of a function for which
values were not passed.
there's a DROP_CORE option in options.h which allows you to specify if you
want the driver to try to dump core if it has crashed
replaced sort_array() with a faster version. Also changed it so that
it expects the callback function to return -1, 0, or 1 in a fashion
similar to how strcmp() does it.
added an option to define the default error message users receive. If it
is not defined, then all users get wizard level error messages. This is
useful since players are the ones that most often experience these errors
and this lets players report them in a more coherent fashion (maybe?).
Reworked the domain stuff (added uid.c and uid.h) by separating the
concept of uids and euids from that of domains and authors. The
wizlist (domain list) code is no longer based on uids but rather on
domains. Two new functions are required in master.c:
string domain_file(string domain); and string author_file(string author);
In addition, valid_author(string author) should be added to master if
you wish set_author(string author) to be functional. Note: domain_file
and author_file are similar to creator_file (which returns information
for uids). domain_file lets the gamedriver know which domain a given
object should be in an author_file lets the gamedriver know the author
of the file.