Example #1
0
// Free List Reconstruction Task routine.
//
void dispatch_FreeListReconstruction(void *pUnused, int iUnused)
{
    UNUSED_PARAMETER(pUnused);
    UNUSED_PARAMETER(iUnused);

    if (mudconf.control_flags & CF_DBCHECK)
    {
        const char *cmdsave = mudstate.debug_cmd;
        mudstate.debug_cmd = (char *)"< dbck >";
        do_dbck(NOTHING, NOTHING, NOTHING, 0);
        Guest.CleanUp();
        pcache_trim();
        pool_reset();
        mudstate.debug_cmd = cmdsave;
    }

    // Schedule ourselves again.
    //
    CLinearTimeAbsolute ltaNow;
    ltaNow.GetUTC();
    CLinearTimeDelta ltd;
    ltd.SetSeconds(mudconf.check_interval);
    mudstate.check_counter = ltaNow + ltd;
    scheduler.DeferTask(mudstate.check_counter, PRIORITY_SYSTEM,
        dispatch_FreeListReconstruction, 0, 0);
}
Example #2
0
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.lastnowmsec = mudstate.nowmsec;
	mudstate.lastnow = mudstate.now;
	mudstate.nowmsec = time_ng(NULL);
	mudstate.now = (time_t) floor(mudstate.nowmsec);

	do_second();
	local_second();

	/* Free list reconstruction */

	if ((mudconf.control_flags & CF_DBCHECK) &&
	    (mudstate.check_counter <= mudstate.nowmsec)) {
		mudstate.check_counter = mudconf.check_interval + mudstate.nowmsec;
		mudstate.debug_cmd = (char *)"< dbck >";
		cache_reset(0);
		do_dbck (NOTHING, NOTHING, 0);
		cache_reset(0);
		pcache_trim();
	}

	/* Database dump routines */

	if ((mudconf.control_flags & CF_CHECKPOINT) &&
	    (mudstate.dump_counter <= mudstate.nowmsec)) {
		mudstate.dump_counter = mudconf.dump_interval + mudstate.nowmsec;
		mudstate.debug_cmd = (char *)"< dump >";
		fork_and_dump(0, (char *)NULL);
	}

	/* Idle user check */

	if ((mudconf.control_flags & CF_IDLECHECK) &&
	    (mudstate.idle_counter <= mudstate.nowmsec)) {
		mudstate.idle_counter = mudconf.idle_interval + mudstate.nowmsec;
		mudstate.debug_cmd = (char *)"< idlecheck >";
		cache_reset(0);
		check_idle();

	}

#ifdef HAVE_GETRUSAGE
	/* Memory use stats */

	if (mudstate.mstats_counter <= mudstate.nowmsec) {

		int	curr;

		mudstate.mstats_counter = 15 + mudstate.nowmsec;
		curr = mudstate.mstat_curr;
		if ( (curr >= 0 ) && (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

#ifdef RWHO_IN_USE
	if ((mudconf.control_flags & CF_RWHO_XMIT) &&
	    (mudstate.rwho_counter <= mudstate.nowmsec)) {
		mudstate.rwho_counter = mudconf.rwho_interval + mudstate.nowmsec;
		mudstate.debug_cmd = (char *)"< rwho update >";
		rwho_update();
	}
#endif

	/* reset alarm */

	alarm_msec (next_timer());
	mudstate.debug_cmd = cmdsave;
}
Example #3
0
int 
main(int argc, char *argv[])
{
    int setflags, clrflags, ver, nochk;
    int db_ver, db_format, db_flags, do_check, do_write;
    char *fp;
    FILE *f_ptr;
    char s_filename[120];

    f_ptr = NULL;
    nochk = 0;
    if (argc == 3) {
	for (fp = argv[2]; *fp; fp++) {
           if (*fp == 'x') {
              nochk = 1;
              break;
           }
        }
    }
    if (!nochk) {
       sprintf(s_filename, "%.115s.db", argv[1]);
       if ( (f_ptr = fopen(s_filename, "r")) != NULL ) {
          fprintf(stderr, "GDBM file(s) already exist for %s\n", s_filename);
          fclose(f_ptr);
          exit(1);
       }
       sprintf(s_filename, "%.115s.dir", argv[1]);
       if ( (f_ptr = fopen(s_filename, "r")) != NULL ) {
          fprintf(stderr, "GDBM file(s) already exist for %s\n", s_filename);
          fclose(f_ptr);
          exit(1);
       }
       sprintf(s_filename, "%.115s.pag", argv[1]);
       if ( (f_ptr = fopen(s_filename, "r")) != NULL ) {
          fprintf(stderr, "GDBM file(s) already exist for %s\n", s_filename);
          fclose(f_ptr);
          exit(1);
       }
    }
    debugmem = (Debugmem *)malloc(sizeof(Debugmem));

    if( !debugmem )
      abort();

    INITDEBUG(debugmem);

    if ((argc < 2) || (argc > 3)) {
	usage(argv[0]);
	exit(1);
    }
    dddb_var_init();
    cache_var_init();
    cf_init();

    /* Decide what conversions to do and how to format the output file */

    setflags = clrflags = ver = do_check = 0;
    do_write = 1;

    if (argc == 3) {
	for (fp = argv[2]; *fp; fp++) {
	    switch (*fp) {
	    case 'C':
		do_check = 1;
		break;
	    case 'G':
		setflags |= V_GDBM;
		break;
	    case 'g':
		clrflags |= V_GDBM;
		break;
	    case 'Z':
		setflags |= V_ZONE;
		break;
	    case 'z':
		clrflags |= V_ZONE;
		break;
	    case 'L':
		setflags |= V_LINK;
		break;
	    case 'l':
		clrflags |= V_LINK;
		break;
	    case 'N':
		setflags |= V_ATRNAME;
		break;
	    case 'n':
		clrflags |= V_ATRNAME;
		break;
	    case 'K':
		setflags |= V_ATRKEY;
		break;
	    case 'k':
		clrflags |= V_ATRKEY;
		break;
	    case 'P':
		setflags |= V_PARENT;
		break;
	    case 'p':
		clrflags |= V_PARENT;
		break;
	    case 'W':
		do_write = 1;
		break;
	    case 'w':
		do_write = 0;
		break;
	    case 'X':
		clrflags = 0xffffffff;
		setflags = OUTPUT_FLAGS;
		ver = OUTPUT_VERSION;
		break;
	    case 'x':
		clrflags = 0xffffffff;
		setflags = UNLOAD_OUTFLAGS;
		ver = UNLOAD_VERSION;
		break;
	    case '0':
	    case '1':
	    case '2':
	    case '3':
	    case '4':
	    case '5':
	    case '6':
	    case '7':
	    case '8':
	    case '9':
		ver = ver * 10 + (*fp - '0');
		break;
	    default:
		fprintf(stderr, "Unknown flag: '%c'\n", *fp);
		usage(argv[0]);
		exit(1);
	    }
	}
    }
    /* Open the gdbm file */

    if (init_gdbm_db(argv[1]) < 0) {
	fprintf(stderr, "Can't open GDBM file\n");
	exit(1);
    }
    /* Go do it */

    db_read(stdin, &db_format, &db_ver, &db_flags);
    fprintf(stderr, "Input: ");
    info(db_format, db_flags, db_ver);
    val_count();

    if (do_check)
	do_dbck(NOTHING, NOTHING, DBCK_FULL);

    if (do_write) {
	db_flags = (db_flags & ~clrflags) | setflags;
	if (db_format != F_MUSH)
	    db_ver = 3;
	if (ver != 0)
	    db_ver = ver;
	fprintf(stderr, "Output: ");
	info(F_MUSH, db_flags, db_ver);
	db_write(stdout, F_MUSH, db_ver | db_flags);
    }
    CLOSE;
    return(0);
}