void Dynvar_Shutdown( void ) { if( dynvar_initialized ) { struct trie_dump_s *dump; unsigned int i; assert( dynvar_trie ); Cmd_RemoveCommand( "dynvarlist" ); Cmd_RemoveCommand( "setdyn" ); Trie_Dump( dynvar_trie, "", TRIE_DUMP_VALUES, &dump ); for( i = 0; i < dump->size; i++ ) { Dynvar_Destroy( (dynvar_t *)dump->key_value_vector[i].value ); } Trie_FreeDump( dump ); dynvar_initialized = qfalse; } if( dynvar_preinitialized ) { assert( dynvar_trie ); Trie_Destroy( dynvar_trie ); dynvar_trie = NULL; dynvar_preinitialized = qfalse; } }
/* * ML_GetMapByNum * Prints map infostring in "mapname\0fullname" format into "out" string, * returns fullsize (so that out can be reallocated if there's not enough space) */ size_t ML_GetMapByNum( int num, char *out, size_t size ) { static int i = 0; static struct trie_dump_s *dump = NULL; size_t fsize; mapinfo_t *map; if( !ml_initialized ) return 0; if( ml_flush || i > num ) { if( dump ) { Trie_FreeDump( dump ); dump = NULL; } ml_flush = false; } if( !dump ) { i = 0; Trie_Dump( mlist_filenames_trie, "", TRIE_DUMP_VALUES, &dump ); } for( ; i < num && i < (int)dump->size; i++ ) ; if( i == (int)dump->size ) return 0; map = ( mapinfo_t * )( dump->key_value_vector[i].value ); fsize = strlen( map->filename ) + 1 + strlen( map->fullname ) + 1; if( out && (fsize <= size) ) { Q_strncpyz( out, map->filename, size ); Q_strncpyz( out + strlen( out ) + 1, strcmp( map->fullname, MLIST_UNKNOWN_MAPNAME ) ? map->fullname : map->filename, size - (strlen( out ) + 1) ); } return fsize; }
/* * Cvar_ArchiveList_f */ static void Cvar_ArchiveList_f( void ) { struct trie_dump_s *dump; unsigned int i; assert( cvar_trie ); Trie_Dump( cvar_trie, "", TRIE_DUMP_VALUES, &dump ); for( i = 0; i < dump->size; ++i ) { cvar_t *const var = dump->key_value_vector[i].value; if( Cvar_FlagIsSet( var->flags, CVAR_DEVELOPER ) ) continue; if( !Cvar_FlagIsSet( var->flags, CVAR_ARCHIVE ) ) continue; Com_Printf( "set %s \"%s\"\n", var->name, var->dvalue ); } Trie_FreeDump( dump ); }
/* * CL_MasterAddressCache_Shutdown */ static void CL_MasterAddressCache_Shutdown( void ) { unsigned i; trie_dump_t *dump; if( resolverThreads ) { for( i = 0; resolverThreads[i]; i++ ) { QThread_Join( resolverThreads[i] ); } free( resolverThreads ); resolverThreads = NULL; } QMutex_Destroy( &resolveLock ); // free allocated memory Trie_Dump( serverlist_masters_trie, "", TRIE_DUMP_BOTH, &dump ); for( i = 0; i < dump->size; ++i ) { free( dump->key_value_vector[i].value ); } Trie_Destroy( serverlist_masters_trie ); }
/* * ML_BuildCache * Write the map data to a cache file */ static void ML_BuildCache( void ) { int filenum; mapinfo_t *map; struct trie_dump_s *dump; if( !ml_initialized ) return; if( FS_FOpenFile( MLIST_CACHE, &filenum, FS_WRITE|FS_CACHE ) != -1 ) { unsigned int i; Trie_Dump( mlist_filenames_trie, "", TRIE_DUMP_VALUES, &dump ); for( i = 0; i < dump->size; ++i ) { map = ( mapinfo_t * )( dump->key_value_vector[i].value ); FS_Printf( filenum, "%s\r\n%s\r\n", map->filename, map->fullname ); } Trie_FreeDump( dump ); FS_FCloseFile( filenum ); } }
/* * Cvar_Shutdown * * Reads in all archived cvars */ void Cvar_Shutdown( void ) { if( cvar_initialized ) { unsigned int i; struct trie_dump_s *dump; extern cvar_t *developer, *developerMemory; #ifndef DEDICATED_ONLY extern cvar_t *con_printText; #endif assert( cvar_trie ); // NULL out some console variables so that we won't try to read from // the memory pointers after the data has already been freed but before we // reset the pointers to NULL developer = NULL; developerMemory = NULL; dedicated = NULL; #ifndef DEDICATED_ONLY con_printText = NULL; #endif Cmd_RemoveCommand( "set" ); Cmd_RemoveCommand( "seta" ); Cmd_RemoveCommand( "setau" ); Cmd_RemoveCommand( "setas" ); Cmd_RemoveCommand( "setu" ); Cmd_RemoveCommand( "sets" ); Cmd_RemoveCommand( "reset" ); Cmd_RemoveCommand( "toggle" ); Cmd_RemoveCommand( "cvarlist" ); #ifndef PUBLIC_BUILD Cmd_RemoveCommand( "cvararchivelist" ); #endif Trie_Dump( cvar_trie, "", TRIE_DUMP_VALUES, &dump ); for( i = 0; i < dump->size; ++i ) { cvar_t *const var = dump->key_value_vector[i].value; if( var->string ) Mem_ZoneFree( var->string ); if( var->dvalue ) Mem_ZoneFree( var->dvalue ); Mem_ZoneFree( var ); } Trie_FreeDump( dump ); cvar_initialized = qfalse; } if( cvar_preinitialized ) { assert( cvar_trie ); Trie_Destroy( cvar_trie ); cvar_trie = NULL; cvar_preinitialized = qfalse; } }