/* main.m Main program to cheezmud. Copyright (C) 1995 David Flater. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* main.m Main program to cheezmud. * DWF 1/26/95 */ #include "cheezmud.h" /* Collection of all mud objects */ id world; /* Time of last heartbeat */ struct timeval lastheartbeat; void reaper () { id t; while ((t = pop_death ())) { [world remove: t]; [t free]; } } void do_heartbeats () { if (timesincelastheartbeat () >= heartbeat_microseconds) { /* This must be done in two passes to avoid extremely bad luck. */ /* Pass 1: send heartbeat, don't free anything */ /* Pass 2: free the dead ones */ [world elementsPerform: @selector(heartbeat)]; reaper (); /* This gives more accurate heartbeats than simply calling gettimeofday. */ lastheartbeat.tv_usec += heartbeat_microseconds; while (lastheartbeat.tv_usec > 1000000) { lastheartbeat.tv_sec++; lastheartbeat.tv_usec -= 1000000; } /* If we fall behind, do not play catch-up. Skip a beat instead. */ if (timesincelastheartbeat () >= heartbeat_microseconds) gettimeofday (&lastheartbeat, NULL); } } int main (int argc, char **argv) { srandom (time(NULL)); powerup (); world = [OrdCltn new]; genesis (); gettimeofday (&lastheartbeat, NULL); cheezlog ("Mud started"); while (1) { /* The heartbeat is invoked from within service_cons. */ service_cons (); wait_for_activity (); } }