/*
* timer.c -- Subroutines for (system-) timed events
*/
/*
* $Id: timer.c,v 1.2 1995/11/22 23:33:17 root Exp $
*/
#include "copyright.h"
#include "autoconf.h"
#include <signal.h>
#include "mudconf.h"
#include "config.h"
#include "db.h"
#include "interface.h"
#include "match.h"
#include "externs.h"
#include "command.h"
extern void NDECL(do_second);
extern void FDECL(fork_and_dump, (int key));
extern unsigned int FDECL(alarm, (unsigned int seconds));
extern void NDECL(pcache_trim);
int NDECL(next_timer)
{
int result;
result = mudstate.dump_counter;
if (mudstate.check_counter < result)
result = mudstate.check_counter;
if (mudstate.idle_counter < result)
result = mudstate.idle_counter;
if (mudstate.mstats_counter < result)
result = mudstate.mstats_counter;
if (mudstate.events_counter < result)
result = mudstate.events_counter;
result = -mudstate.now;
if (result <= 0)
result = 1;
return result;
}
void NDECL(init_timer)
{
mudstate.now = time(NULL);
mudstate.dump_counter = ((mudconf.dump_offset == 0) ?
mudconf.dump_interval : mudconf.dump_offset) + mudstate.now;
mudstate.check_counter = ((mudconf.check_offset == 0) ?
mudconf.check_interval : mudconf.check_offset) + mudstate.now;
mudstate.idle_counter = mudconf.idle_interval + mudstate.now;
mudstate.mstats_counter = 15 + mudstate.now;
mudstate.events_counter = 900 + mudstate.now;
alarm(next_timer());
}
void NDECL(dispatch)
{
char *cmdsave;
cmdsave = mudstate.debug_cmd;
mudstate.debug_cmd = (char *)"< dispatch >";
/*
* this routine can be used to poll from interface.c
*/
if (!mudstate.alarm_triggered)
return;
mudstate.alarm_triggered = 0;
mudstate.now = time(NULL);
do_second();
/*
* Free list reconstruction
*/
if ((mudconf.control_flags & CF_DBCHECK) &&
(mudstate.check_counter <= mudstate.now)) {
mudstate.check_counter = mudconf.check_interval + mudstate.now;
mudstate.debug_cmd = (char *)"< dbck >";
#ifndef MEMORY_BASED
cache_reset(0);
#endif /*
* MEMORY_BASED
*/
do_dbck(NOTHING, NOTHING, 0);
#ifndef MEMORY_BASED
cache_reset(0);
#endif /*
* MEMORY_BASED
*/
pcache_trim();
}
/*
* Database dump routines
*/
if ((mudconf.control_flags & CF_CHECKPOINT) &&
(mudstate.dump_counter <= mudstate.now)) {
mudstate.dump_counter = mudconf.dump_interval + mudstate.now;
mudstate.debug_cmd = (char *)"< dump >";
fork_and_dump(0);
}
/*
* Idle user check
*/
if ((mudconf.control_flags & CF_IDLECHECK) &&
(mudstate.idle_counter <= mudstate.now)) {
mudstate.idle_counter = mudconf.idle_interval + mudstate.now;
mudstate.debug_cmd = (char *)"< idlecheck >";
#ifndef MEMORY_BASED
cache_reset(0);
#endif /*
* MEMORY_BASED
*/
check_idle();
}
/*
* Check for execution of attribute events
*/
if ((mudconf.control_flags & CF_EVENTCHECK) &&
(mudstate.events_counter <= mudstate.now)) {
mudstate.events_counter = 900 + mudstate.now;
mudstate.debug_cmd = (char *)"< eventcheck >";
check_events();
}
#ifdef HAVE_GETRUSAGE
/*
* Memory use stats
*/
if (mudstate.mstats_counter <= mudstate.now) {
int curr;
mudstate.mstats_counter = 15 + mudstate.now;
curr = mudstate.mstat_curr;
if (mudstate.now > mudstate.mstat_secs[curr]) {
struct rusage usage;
curr = 1 - curr;
getrusage(RUSAGE_SELF, &usage);
mudstate.mstat_ixrss[curr] = usage.ru_ixrss;
mudstate.mstat_idrss[curr] = usage.ru_idrss;
mudstate.mstat_isrss[curr] = usage.ru_isrss;
mudstate.mstat_secs[curr] = mudstate.now;
mudstate.mstat_curr = curr;
}
}
#endif
/*
* reset alarm
*/
alarm(next_timer());
mudstate.debug_cmd = cmdsave;
}
/*
* ---------------------------------------------------------------------------
* * do_timewarp: Adjust various internal timers.
*/
void do_timewarp(player, cause, key, arg)
dbref player, cause;
int key;
char *arg;
{
int secs;
secs = atoi(arg);
if ((key == 0) || (key & TWARP_QUEUE)) /*
* Sem/Wait queues
*/
do_queue(player, cause, QUEUE_WARP, arg);
if (key & TWARP_DUMP)
mudstate.dump_counter -= secs;
if (key & TWARP_CLEAN)
mudstate.check_counter -= secs;
if (key & TWARP_IDLE)
mudstate.idle_counter -= secs;
if (key & TWARP_EVENTS)
mudstate.events_counter -= secs;
}