Cleanup detour structures properly on unload
This commit is contained in:
		
							parent
							
								
									2e52ab24b7
								
							
						
					
					
						commit
						63ccb7448f
					
				| @ -150,6 +150,36 @@ void RemoveAllCallbacksForContext(IPluginContext *pContext) | |||||||
| 	RemoveAllCallbacksForContext(HOOKTYPE_POST, &g_pPostDetours, pContext); | 	RemoveAllCallbacksForContext(HOOKTYPE_POST, &g_pPostDetours, pContext); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CleanupDetours(HookType_t hookType, DetourMap *map) | ||||||
|  | { | ||||||
|  | 	PluginCallbackList *wrappers; | ||||||
|  | 	CDynamicHooksSourcePawn *pWrapper; | ||||||
|  | 	DetourMap::iterator it = map->iter(); | ||||||
|  | 	// Run through all active detours we added.
 | ||||||
|  | 	for (; !it.empty(); it.next()) | ||||||
|  | 	{ | ||||||
|  | 		wrappers = it->value; | ||||||
|  | 		// See if there are callbacks of this plugin context registered
 | ||||||
|  | 		// and remove them.
 | ||||||
|  | 		for (int i = wrappers->length() - 1; i >= 0; i--) | ||||||
|  | 		{ | ||||||
|  | 			pWrapper = wrappers->at(i); | ||||||
|  | 			delete pWrapper; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Unhook the function
 | ||||||
|  | 		delete wrappers; | ||||||
|  | 		UnhookFunction(hookType, it->key); | ||||||
|  | 	} | ||||||
|  | 	map->clear(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CleanupDetours() | ||||||
|  | { | ||||||
|  | 	CleanupDetours(HOOKTYPE_PRE, &g_pPreDetours); | ||||||
|  | 	CleanupDetours(HOOKTYPE_POST, &g_pPostDetours); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| ICallingConvention *ConstructCallingConvention(HookSetup *setup) | ICallingConvention *ConstructCallingConvention(HookSetup *setup) | ||||||
| { | { | ||||||
| 	std::vector<DataTypeSized_t> vecArgTypes; | 	std::vector<DataTypeSized_t> vecArgTypes; | ||||||
|  | |||||||
| @ -37,5 +37,6 @@ bool HandleDetour(HookType_t hookType, CHook* pDetour); | |||||||
| bool AddDetourPluginHook(HookType_t hookType, CHook *pDetour, HookSetup *setup, IPluginFunction *pCallback); | bool AddDetourPluginHook(HookType_t hookType, CHook *pDetour, HookSetup *setup, IPluginFunction *pCallback); | ||||||
| bool RemoveDetourPluginHook(HookType_t hookType, CHook *pDetour, IPluginFunction *pCallback); | bool RemoveDetourPluginHook(HookType_t hookType, CHook *pDetour, IPluginFunction *pCallback); | ||||||
| void RemoveAllCallbacksForContext(IPluginContext *pContext); | void RemoveAllCallbacksForContext(IPluginContext *pContext); | ||||||
|  | void CleanupDetours(); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| @ -89,8 +89,7 @@ void DHooks::SDK_OnAllLoaded() | |||||||
| void DHooks::SDK_OnUnload() | void DHooks::SDK_OnUnload() | ||||||
| { | { | ||||||
| 	CleanupHooks(); | 	CleanupHooks(); | ||||||
| 	// FIXME: Unhook only functions that are hooked by a plugin. + cleanup
 | 	CleanupDetours(); | ||||||
| 	GetHookManager()->UnhookAllFunctions(); |  | ||||||
| 	if(g_pEntityListener) | 	if(g_pEntityListener) | ||||||
| 	{ | 	{ | ||||||
| 		g_pEntityListener->CleanupListeners(); | 		g_pEntityListener->CleanupListeners(); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user