diff --git a/engine/common/base_cmd.c b/engine/common/base_cmd.c index df471ecd..312689f4 100644 --- a/engine/common/base_cmd.c +++ b/engine/common/base_cmd.c @@ -30,6 +30,7 @@ struct base_command_hashmap_s }; static base_command_hashmap_t *hashed_cmds[HASH_SIZE]; +static poolhandle_t basecmd_pool; #define BaseCmd_HashKey( x ) COM_HashKey( name, HASH_SIZE ) @@ -128,7 +129,7 @@ void BaseCmd_Insert( base_command_type_e type, base_command_t *basecmd, const ch uint hash = BaseCmd_HashKey( name ); size_t len = Q_strlen( name ); - elem = Z_Malloc( sizeof( base_command_hashmap_t ) + len ); + elem = Mem_Malloc( basecmd_pool, sizeof( base_command_hashmap_t ) + len ); elem->basecmd = basecmd; elem->type = type; Q_strncpy( elem->name, name, len + 1 ); @@ -183,9 +184,15 @@ initialize base command hashmap system */ void BaseCmd_Init( void ) { + basecmd_pool = Mem_AllocPool( "BaseCmd" ); memset( hashed_cmds, 0, sizeof( hashed_cmds ) ); } +void BaseCmd_Shutdown( void ) +{ + Mem_FreePool( &basecmd_pool ); +} + /* ============ BaseCmd_Stats_f diff --git a/engine/common/base_cmd.h b/engine/common/base_cmd.h index bfc520b7..e0c1b4ad 100644 --- a/engine/common/base_cmd.h +++ b/engine/common/base_cmd.h @@ -32,6 +32,7 @@ typedef enum base_command_type typedef void base_command_t; void BaseCmd_Init( void ); +void BaseCmd_Shutdown( void ); base_command_t *BaseCmd_Find( base_command_type_e type, const char *name ); void BaseCmd_FindAll( const char *name, base_command_t **cmd, base_command_t **alias, base_command_t **cvar ); diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 5c109f4a..9d23cfad 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -46,6 +46,7 @@ static cmdalias_t *cmd_alias; static uint cmd_condition; static int cmd_condlevel; static qboolean cmd_currentCommandIsPrivileged; +static poolhandle_t cmd_pool; static void Cmd_ExecuteStringWithPrivilegeCheck( const char *text, qboolean isPrivileged ); @@ -432,7 +433,7 @@ static void Cmd_Alias_f( void ) { if( !Q_strcmp( s, a->name )) { - Z_Free( a->value ); + Mem_Free( a->value ); break; } } @@ -441,7 +442,7 @@ static void Cmd_Alias_f( void ) { cmdalias_t *cur, *prev; - a = Z_Malloc( sizeof( cmdalias_t )); + a = Mem_Malloc( cmd_pool, sizeof( cmdalias_t )); Q_strncpy( a->name, s, sizeof( a->name )); @@ -469,7 +470,7 @@ static void Cmd_Alias_f( void ) } Q_strncat( cmd, "\n", sizeof( cmd )); - a->value = copystring( cmd ); + a->value = copystringpool( cmd_pool, cmd ); } /* @@ -636,7 +637,7 @@ void Cmd_TokenizeString( const char *text ) // clear the args from the last string for( i = 0; i < cmd_argc; i++ ) - Z_Free( cmd_argv[i] ); + Mem_Free( cmd_argv[i] ); cmd_argc = 0; // clear previous args cmd_args = NULL; @@ -670,7 +671,7 @@ void Cmd_TokenizeString( const char *text ) if( cmd_argc < MAX_CMD_TOKENS ) { - cmd_argv[cmd_argc] = copystring( cmd_token ); + cmd_argv[cmd_argc] = copystringpool( cmd_pool, cmd_token ); cmd_argc++; } } @@ -708,7 +709,7 @@ int Cmd_AddCommandEx( const char *cmd_name, xcommand_t function, const char *cmd if( FBitSet( cmd->flags, CMD_OVERRIDABLE )) { Mem_Free( cmd->desc ); - cmd->desc = copystring( cmd_desc ); + cmd->desc = copystringpool( cmd_pool, cmd_desc ); cmd->function = function; cmd->flags = iFlags; @@ -723,9 +724,9 @@ int Cmd_AddCommandEx( const char *cmd_name, xcommand_t function, const char *cmd } // use a small malloc to avoid zone fragmentation - cmd = Z_Malloc( sizeof( cmd_t ) ); - cmd->name = copystring( cmd_name ); - cmd->desc = copystring( cmd_desc ); + cmd = Mem_Malloc( cmd_pool, sizeof( cmd_t ) ); + cmd->name = copystringpool( cmd_pool, cmd_name ); + cmd->desc = copystringpool( cmd_pool, cmd_desc ); cmd->function = function; cmd->flags = iFlags; @@ -1340,6 +1341,7 @@ Cmd_Init */ void Cmd_Init( void ) { + cmd_pool = Mem_AllocPool( "Console Commands" ); cmd_functions = NULL; cmd_condition = 0; cmd_alias = NULL; @@ -1366,6 +1368,11 @@ void Cmd_Init( void ) #endif } +void Cmd_Shutdown( void ) +{ + Mem_FreePool( &cmd_pool ); +} + #if XASH_ENGINE_TESTS #include "tests.h" diff --git a/engine/common/common.h b/engine/common/common.h index 630c28a3..8447d348 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -432,6 +432,7 @@ int Cmd_Argc( void ); const char *Cmd_Args( void ) RETURNS_NONNULL; const char *Cmd_Argv( int arg ) RETURNS_NONNULL; void Cmd_Init( void ); +void Cmd_Shutdown( void ); void Cmd_Unlink( int group ); int Cmd_AddCommandEx( const char *cmd_name, xcommand_t function, const char *cmd_desc, int flags, const char *funcname ); @@ -628,6 +629,7 @@ int pfnNumberOfEntities( void ); int pfnIsInGame( void ); float pfnTime( void ); #define copystring( s ) _copystring( host.mempool, s, __FILE__, __LINE__ ) +#define copystringpool( pool, s ) _copystring( pool, s, __FILE__, __LINE__ ) #define SV_CopyString( s ) _copystring( svgame.stringspool, s, __FILE__, __LINE__ ) #define freestring( s ) if( s != NULL ) { Mem_Free( s ); s = NULL; } char *_copystring( poolhandle_t mempool, const char *s, const char *filename, int fileline ); diff --git a/engine/common/cvar.c b/engine/common/cvar.c index bb5bd5f6..cdc18d7d 100644 --- a/engine/common/cvar.c +++ b/engine/common/cvar.c @@ -19,6 +19,7 @@ GNU General Public License for more details. #include "eiface.h" // ARRAYSIZE static convar_t *cvar_vars = NULL; // head of list +static poolhandle_t cvar_pool; CVAR_DEFINE_AUTO( cmd_scripting, "0", FCVAR_ARCHIVE|FCVAR_PRIVILEGED, "enable simple condition checking and variable operations" ); typedef struct cvar_filter_quirks_s @@ -432,7 +433,7 @@ convar_t *Cvar_Get( const char *name, const char *value, int flags, const char * { // directly set value freestring( var->string ); - var->string = copystring( value ); + var->string = copystringpool( cvar_pool, value ); var->value = Q_atof( var->string ); SetBits( var->flags, flags ); @@ -452,18 +453,18 @@ convar_t *Cvar_Get( const char *name, const char *value, int flags, const char * Con_Reportf( "%s change description from %s to %s\n", var->name, var->desc, var_desc ); // update description if needs freestring( var->desc ); - var->desc = copystring( var_desc ); + var->desc = copystringpool( cvar_pool, var_desc ); } return var; } // allocate a new cvar - var = Z_Malloc( sizeof( *var )); - var->name = copystring( name ); - var->string = copystring( value ); - var->def_string = copystring( value ); - var->desc = copystring( var_desc ); + var = Mem_Malloc( cvar_pool, sizeof( *var )); + var->name = copystringpool( cvar_pool, name ); + var->string = copystringpool( cvar_pool, value ); + var->def_string = copystringpool( cvar_pool, value ); + var->desc = copystringpool( cvar_pool, var_desc ); var->value = Q_atof( var->string ); var->flags = flags|FCVAR_ALLOCATED; @@ -549,7 +550,7 @@ void Cvar_RegisterVariable( convar_t *var ) if( FBitSet( var->flags, FCVAR_EXTENDED )) var->def_string = var->string; // just swap pointers - var->string = copystring( var->string ); + var->string = copystringpool( cvar_pool, var->string ); var->value = Q_atof( var->string ); // find the supposed position in chain (alphanumerical order) @@ -679,7 +680,7 @@ static convar_t *Cvar_Set2( const char *var_name, const char *value ) // and finally changed the cvar itself freestring( var->string ); - var->string = copystring( pszValue ); + var->string = copystringpool( cvar_pool, pszValue ); var->value = Q_atof( var->string ); // tell engine about changes @@ -738,7 +739,7 @@ void GAME_EXPORT Cvar_DirectSet( convar_t *var, const char *value ) // and finally changed the cvar itself freestring( var->string ); - var->string = copystring( pszValue ); + var->string = copystringpool( cvar_pool, pszValue ); var->value = Q_atof( var->string ); // tell engine about changes @@ -781,7 +782,7 @@ void Cvar_FullSet( const char *var_name, const char *value, int flags ) } freestring( var->string ); - var->string = copystring( value ); + var->string = copystringpool( cvar_pool, value ); var->value = Q_atof( var->string ); SetBits( var->flags, flags ); @@ -1260,7 +1261,7 @@ pending_cvar_t *Cvar_PrepareToUnlink( int group ) continue; namelen = Q_strlen( cv->name ) + 1; - p = Mem_Malloc( host.mempool, sizeof( *list ) + namelen ); + p = Mem_Malloc( cvar_pool, sizeof( *list ) + namelen ); p->next = NULL; p->cv_cur = cv; p->cv_next = cv->next; @@ -1336,6 +1337,7 @@ Reads in all archived cvars */ void Cvar_Init( void ) { + cvar_pool = Mem_AllocPool( "Console Variables" ); cvar_vars = NULL; cvar_active_filter_quirks = NULL; Cvar_RegisterVariable( &cmd_scripting ); @@ -1348,6 +1350,11 @@ void Cvar_Init( void ) Cmd_AddCommand( "cvarlist", Cvar_List_f, "display all console variables beginning with the specified prefix" ); } +void Cvar_Shutdown( void ) +{ + Mem_FreePool( &cvar_pool ); +} + /* ============ Cvar_PostFSInit diff --git a/engine/common/cvar.h b/engine/common/cvar.h index fd72cd6d..c9ab02f2 100644 --- a/engine/common/cvar.h +++ b/engine/common/cvar.h @@ -52,6 +52,7 @@ void Cvar_Reset( const char *var_name ); void Cvar_SetCheatState( void ); qboolean Cvar_CommandWithPrivilegeCheck( convar_t *v, qboolean isPrivileged ); void Cvar_Init( void ); +void Cvar_Shutdown( void ); void Cvar_PostFSInit( void ); void Cvar_Unlink( int group ); diff --git a/engine/common/host.c b/engine/common/host.c index 6ff298e9..31be36cf 100644 --- a/engine/common/host.c +++ b/engine/common/host.c @@ -1400,6 +1400,10 @@ void Host_ShutdownWithReason( const char *reason ) Host_FreeCommon(); Platform_Shutdown(); + BaseCmd_Shutdown(); + Cmd_Shutdown(); + Cvar_Shutdown(); + // must be last, console uses this Mem_FreePool( &host.mempool );