/****************************************************** Desolation of the Dragon MUD II (C) 1997-2002 Jesse DeFer http://www.dotd.com dotd@dotd.com ******************************************************/ /* * recycle list code - Garil 8/14/99 * * Instead of a ton of malloc() and free() calls, call them once and merely move the * unused structures to another list, then upon the next creation they merely need * to be moved and initialized, possibly prevents memory fragmentation, and calling * malloc once is probably faster, who knows? */ #include <string.h> #include "mud.h" CHAR_DATA * first_recy_char; CHAR_DATA * last_recy_char; OBJ_DATA * first_recy_obj; OBJ_DATA * last_recy_obj; int mobs_in_recycle; int objs_in_recycle; int mobs_unrecycled; int mobs_recycled; int objs_unrecycled; int objs_recycled; unsigned int unum; void *recy_char; void *recy_obj; void init_recycler(void) { int x; log_string_plus("initializing recycler", LOG_NORMAL, LEVEL_LOG_CSET, SEV_INFO); first_recy_char = NULL; last_recy_char = NULL; mobs_in_recycle = objs_in_recycle = 0; mobs_unrecycled = mobs_recycled = 0; objs_unrecycled = objs_recycled = 0; unum = 0; CREATE(recy_char, CHAR_DATA, 1000); for (x=0; x<1000; x++) LINK((CHAR_DATA *)recy_char+(sizeof(CHAR_DATA)*x), first_recy_char, last_recy_char, next, prev); mobs_in_recycle = 1000; CREATE(recy_obj, OBJ_DATA, 1000); for (x=0; x<1000; x++) LINK((OBJ_DATA *)recy_obj+(sizeof(OBJ_DATA)*x), first_recy_obj, last_recy_obj, next, prev); objs_in_recycle = 1000; } void free_recycled(void) { DISPOSE(recy_char); DISPOSE(recy_obj); } void do_recstat(CHAR_DATA *ch, char *argument) { CHAR_DATA *rch; OBJ_DATA *robj; ch_printf(ch, "mobs_in_recycle: %d\n\r" "objs_in_recycle: %d\n\r" "mobs_unrecycled: %d\n\r" "mobs_recycled : %d\n\r" "objs_unrecycled: %d\n\r" "objs_recycled : %d\n\r", mobs_in_recycle, objs_in_recycle, mobs_unrecycled, mobs_recycled, objs_unrecycled, objs_recycled); for (rch = first_recy_char; rch; rch=rch->next) { if (rch->name) bug("RECYCLE: ch with name"); if (rch->short_descr) bug("RECYCLE: ch with short_descr"); if (rch->description) bug("RECYCLE: ch with description"); if (rch->intro_descr) bug("RECYCLE: ch with intro_descr"); } for (robj = first_recy_obj; robj; robj=robj->next) { if (robj->name) bug("RECYCLE: obj with name"); if (robj->short_descr) bug("RECYCLE: obj with short_descr"); if (robj->description) bug("RECYCLE: obj with description"); if (robj->action_desc) bug("RECYCLE: obj with action_desc"); } } CHAR_DATA *unrecycle_char(void) { CHAR_DATA *ch; if ((ch=first_recy_char)) { UNLINK(ch, first_recy_char, last_recy_char, next, prev); mobs_in_recycle--; mobs_unrecycled++; if (ch->trust) bug("unrecycle_char: trust %d", ch->trust); } else CREATE(ch, CHAR_DATA, 1); ch->recycled = FALSE; ch->unum = unum++; return ch; } void recycle_char(CHAR_DATA *ch) { if (!ch) return; if (ch->recycled) { bug("ch already recycled"); return; } /* UNLINK(ch, first_char, last_char, next, prev);*/ LINK(ch, first_recy_char, last_recy_char, next, prev); free_char(ch); memset(ch, 0, sizeof(CHAR_DATA)); ch->recycled = TRUE; mobs_in_recycle++; mobs_recycled++; } OBJ_DATA *unrecycle_obj(void) { OBJ_DATA *obj; if ((obj=first_recy_obj)) { UNLINK(obj, first_recy_obj, last_recy_obj, next, prev); objs_in_recycle--; objs_unrecycled++; } else CREATE(obj, OBJ_DATA, 1); obj->recycled = FALSE; obj->unum = unum++; return obj; } void recycle_obj(OBJ_DATA *obj) { if (!obj) return; if (obj->recycled) { bug("obj already recycled"); return; } /* UNLINK(obj, first_obj, last_obj, next, prev);*/ LINK(obj, first_recy_obj, last_recy_obj, next, prev); /* memset(obj, 0, sizeof(OBJ_DATA));*/ obj->recycled = TRUE; objs_in_recycle++; objs_recycled++; }