Skip to content

Commit

Permalink
sdkhooks: retain vtable hook until level end (#2094)
Browse files Browse the repository at this point in the history
* Band-aid for Bulk SDKHooks performance impact on linux

Platform specific changes.

* Oops forgot about header

* Simplified/improved LevelShutdown code
  • Loading branch information
KaelaSavia authored May 18, 2024
1 parent 7c757ac commit e373480
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
31 changes: 30 additions & 1 deletion extensions/sdkhooks/extension.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ CUtlVector<IEntityListener *> *EntListeners()
/**
* IServerGameDLL & IVEngineServer Hooks
*/
SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, false);
SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, 0, bool, const char *, const char *, const char *, const char *, bool, bool);
#ifdef GAMEDESC_CAN_CHANGE
SH_DECL_HOOK0(IServerGameDLL, GetGameDescription, SH_NOATTRIB, 0, const char *);
Expand Down Expand Up @@ -247,6 +248,8 @@ bool SDKHooks::SDK_OnLoad(char *error, size_t maxlength, bool late)
sharesys->AddCapabilityProvider(myself, this, "SDKHook_DmgCustomInOTD");
sharesys->AddCapabilityProvider(myself, this, "SDKHook_LogicalEntSupport");

SH_ADD_HOOK(IServerGameDLL, LevelShutdown, gamedll, SH_MEMBER(this, &SDKHooks::LevelShutdown), false);

playerhelpers->AddClientListener(&g_Interface);

plsys->AddPluginsListener(&g_Interface);
Expand Down Expand Up @@ -365,7 +368,9 @@ void SDKHooks::SDK_OnUnload()
forwards->ReleaseForward(g_pOnLevelInit);

plsys->RemovePluginsListener(&g_Interface);


SH_REMOVE_HOOK(IServerGameDLL, LevelShutdown, gamedll, SH_MEMBER(this, &SDKHooks::LevelShutdown), true);

playerhelpers->RemoveClientListener(&g_Interface);

sharesys->DropCapabilityProvider(myself, this, "SDKHook_DmgCustomInOTD");
Expand Down Expand Up @@ -445,6 +450,24 @@ void SDKHooks::OnClientDisconnecting(int client)
HandleEntityDeleted(pEntity);
}

void SDKHooks::LevelShutdown()
{
#if defined PLATFORM_LINUX
for (size_t type = 0; type < SDKHook_MAXHOOKS; ++type)
{
std::vector<CVTableList *> &vtablehooklist = g_HookList[type];
for (size_t listentry = 0; listentry < vtablehooklist.size(); ++listentry)
{
std::vector<HookList> &pawnhooks = vtablehooklist[listentry]->hooks;
pawnhooks.clear();

delete vtablehooklist[listentry];
}
vtablehooklist.clear();
}
#endif
}

void SDKHooks::AddEntityListener(ISMEntityListener *listener)
{
m_EntListeners.push_back(listener);
Expand Down Expand Up @@ -791,12 +814,14 @@ void SDKHooks::Unhook(CBaseEntity *pEntity)
entry--;
}

#if !defined PLATFORM_LINUX
if (pawnhooks.size() == 0)
{
delete vtablehooklist[listentry];
vtablehooklist.erase(vtablehooklist.begin() + listentry);
listentry--;
}
#endif
}
}
}
Expand All @@ -820,12 +845,14 @@ void SDKHooks::Unhook(IPluginContext *pContext)
entry--;
}

#if !defined PLATFORM_LINUX
if (pawnhooks.size() == 0)
{
delete vtablehooklist[listentry];
vtablehooklist.erase(vtablehooklist.begin() + listentry);
listentry--;
}
#endif
}
}
}
Expand Down Expand Up @@ -862,12 +889,14 @@ void SDKHooks::Unhook(int entity, SDKHookType type, IPluginFunction *pCallback)
entry--;
}

#if !defined PLATFORM_LINUX
if (pawnhooks.size() == 0)
{
delete vtablehooklist[listentry];
vtablehooklist.erase(vtablehooklist.begin() + listentry);
listentry--;
}
#endif

break;
}
Expand Down
2 changes: 2 additions & 0 deletions extensions/sdkhooks/extension.h
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@ class SDKHooks :
virtual void AddEntityListener(ISMEntityListener *listener);
virtual void RemoveEntityListener(ISMEntityListener *listener);

public: // IServerGameDLL
void LevelShutdown();
private:
SourceHook::List<ISMEntityListener *> m_EntListeners;

Expand Down

0 comments on commit e373480

Please sign in to comment.