removed const block/default string logic because it doesn't realloc safely and doesn't really save much, substituting code should catch the common cases anyway

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3105 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2009-01-29 02:55:08 +00:00
parent f06fcc78af
commit 1206f6ae07
4 changed files with 24 additions and 166 deletions

View File

@ -24,58 +24,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cvar_group_t *cvar_groups;
//cvar_t *cvar_vars;
char *cvar_null_string = "";
static char *cvar_null_string = "";
static char *cvar_zero_string = "0";
cvar_const_cache_t cc_cache;
// cvar string cache functions
// CCC_AddString: adds a string into the cvar CB, and creates one
// if non-existant
char *CCC_AddString(char *s)
char *Cvar_DefaultAlloc(char *str)
{
int size = strlen(s) + 1;
if (!cc_cache.cb)
cc_cache.cb = CB_Malloc(CC_CACHE_SIZE, CC_CACHE_STEP);
return CB_Copy (cc_cache.cb, s, size);
}
// CCC_CheckAndAddString: checks against the CCC table, updates table,
// and either adds or returns cached string
char *CCC_CheckAndAddString(char *s)
{
int i;
char *c;
if (str[0] == '\0')
return cvar_null_string;
if (str[0] == '0' && str[1] == '\0')
return cvar_zero_string;
for (i = 0; i < CC_CACHE_ENTRIES; i++)
{
if (cc_cache.cached[i] && !strcmp(s, cc_cache.cached[i]))
{
// move string to top, pushing others down
c = cc_cache.cached[i];
if (i != 0)
{
Q_memcpy(cc_cache.cached + 1,
cc_cache.cached,
sizeof(char*) * i);
cc_cache.cached[0] = c;
}
c = (char *)Z_Malloc(strlen(str)+1);
Q_strcpy(c, str);
return c;
}
}
// not in cache, so add it to table
// move current cached strings down
Q_memcpy(cc_cache.cached + 1,
cc_cache.cached,
sizeof(char*) * (CC_CACHE_ENTRIES - 1));
return (cc_cache.cached[0] = CCC_AddString(s));
return c;
}
void Cvar_DefaultFree(char *str)
{
if (str == cvar_null_string)
return;
else if (str == cvar_zero_string)
return;
else
Z_Free(str);
}
/*
============
@ -893,7 +868,7 @@ void Cvar_Free(cvar_t *tbf)
}
unlinked:
Z_Free(tbf->string);
// Z_Free(tbf->defaultstr);
Cvar_DefaultFree(tbf->defaultstr);
if (tbf->latched_string)
Z_Free(tbf->latched_string);
Z_Free(tbf);
@ -906,6 +881,7 @@ Cvar_RegisterVariable
Adds a freestanding variable to the variable list.
============
*/
qboolean Cvar_Register (cvar_t *variable, const char *groupname)
{
cvar_t *old;
@ -935,7 +911,7 @@ qboolean Cvar_Register (cvar_t *variable, const char *groupname)
variable->string = (char*)Z_Malloc (1);
//cheat prevention - engine set default is the one that stays.
variable->defaultstr = CCC_CheckAndAddString(value); //give it it's default (for server controlled vars and things)
variable->defaultstr = Cvar_DefaultAlloc(value); //give it it's default (for server controlled vars and things)
// set it through the function to be consistant
if (old->latched_string)
@ -967,7 +943,7 @@ qboolean Cvar_Register (cvar_t *variable, const char *groupname)
variable->string = (char*)Z_Malloc (1);
variable->defaultstr = CCC_CheckAndAddString(value); //give it it's default (for server controlled vars and things)
variable->defaultstr = Cvar_DefaultAlloc(value); //give it it's default (for server controlled vars and things)
// set it through the function to be consistant
Cvar_SetCore (variable, value, true);
@ -1236,7 +1212,4 @@ void Cvar_Shutdown(void)
cvar_groups = grp->next;
Z_Free(grp);
}
if (cc_cache.cb)
CB_Free(cc_cache.cb);
}

View File

@ -180,14 +180,3 @@ void Cvar_Shutdown(void);
void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats); //locks/unlocks cheat cvars depending on weather we are allowed them.
//extern cvar_t *cvar_vars;
// cvar const cache, used for removing fairly common default cvar values
#define CC_CACHE_ENTRIES 8
#define CC_CACHE_SIZE 2048
#define CC_CACHE_STEP 2048
typedef struct cvar_const_cache_s {
char *cached[CC_CACHE_ENTRIES];
const_block_t *cb;
} cvar_const_cache_t;

View File

@ -2121,93 +2121,6 @@ void *Cache_Alloc (cache_user_t *c, int size, char *name)
#endif
//============================================================================
// Constant block functions
// CB_Malloc: creates a usable const_block
const_block_t *CB_Malloc (int size, int step)
{
// alloc new const block
const_block_t *cb = Z_Malloc(sizeof(const_block_t));
// init cb members
cb->block = BZ_Malloc(size);
cb->point = cb->block;
cb->curleft = size;
cb->cursize = size;
cb->memstep = step;
return cb;
}
// CB_Slice: slices a chunk of memory off of the const block, and
// reallocs if necessary
char *CB_Slice (const_block_t *cb, int size)
{
char *c;
while (size > cb->curleft)
{
cb->block = BZ_Realloc(cb->block, cb->cursize + cb->memstep);
cb->point = cb->block + (cb->cursize - cb->curleft);
cb->cursize += cb->memstep;
cb->curleft += cb->memstep;
}
c = cb->point;
cb->point += size;
cb->curleft -= size;
return c;
}
// CB_Copy: copies a stream of bytes into a const block, returns
// pointer of copied string
char *CB_Copy (const_block_t *cb, char *data, int size)
{
char *c;
c = CB_Slice(cb, size);
Q_memcpy(c, data, size);
return c;
}
// CB_Free: frees a const block
void CB_Free (const_block_t *cb)
{
BZ_Free(cb->block);
Z_Free(cb);
}
#if 0
// CB_Reset: resets a const block to size
void CB_Reset (const_block_t *cb, int size)
{
if (cb->cursize != size)
{
cb->block = BZ_Realloc(cb->block, size);
cb->cursize = size;
}
cb->point = cb->block;
cb->curleft = cb->cursize;
}
// CB_Trim: trims a const block to minimal size
void CB_Trim (const_block_t *cb)
{
if (cb->curleft > 0)
{
cb->cursize -= cb->curleft;
cb->block = BZ_Realloc(cb->block, cb->cursize);
cb->point = cb->block + cb->cursize;
}
cb->curleft = 0;
}
#endif
/*
========================
Memory_Init

View File

@ -149,20 +149,3 @@ void *Cache_Alloc (cache_user_t *c, int size, char *name);
void Cache_Report (void);
// Constant Block memory functions
// - Constant blocks are used for loads of strings/etc that
// are allocated once and change very little during the rest
// of run time, such as cvar names and default values
typedef struct const_block_s {
int curleft; // current bytes left in block
int cursize; // current maximum size of block
int memstep; // bytes to step per realloc
char *point; // current block point
char *block; // memory block
} const_block_t;
const_block_t *CB_Malloc (int size, int step);
//char *CB_Slice (const_block_t *cb, int size);
char *CB_Copy (const_block_t *cb, char *data, int size);
void CB_Free (const_block_t *cb);