Switch ConsoleDetours off KTrie (bug 5884 part 9, r=ds).

This commit is contained in:
David Anderson 2013-08-25 12:15:26 -07:00
parent 77c7b312ea
commit 0235d57625
3 changed files with 30 additions and 42 deletions

View File

@ -50,6 +50,7 @@
#include "HalfLife2.h" #include "HalfLife2.h"
#include "ConCommandBaseIterator.h" #include "ConCommandBaseIterator.h"
#include "logic_bridge.h" #include "logic_bridge.h"
#include <am-utility.h>
#if defined PLATFORM_POSIX #if defined PLATFORM_POSIX
# include <dlfcn.h> # include <dlfcn.h>
@ -585,13 +586,11 @@ void ConsoleDetours::OnSourceModAllInitialized()
void ConsoleDetours::OnSourceModShutdown() void ConsoleDetours::OnSourceModShutdown()
{ {
List<Listener*>::iterator iter = m_Listeners.begin(); for (StringHashMap<IChangeableForward *>::iterator iter = m_Listeners.iter();
while (iter != m_Listeners.end()) !iter.empty();
iter.next())
{ {
Listener *listener = (*iter); g_Forwards.ReleaseForward(iter->value);
g_Forwards.ReleaseForward(listener->forward);
delete listener;
iter = m_Listeners.erase(iter);
} }
g_Forwards.ReleaseForward(m_pForward); g_Forwards.ReleaseForward(m_pForward);
@ -623,22 +622,15 @@ bool ConsoleDetours::AddListener(IPluginFunction *fun, const char *command)
} }
else else
{ {
const char *str = UTIL_ToLowerCase(command); ke::AutoArray<char> str(UTIL_ToLowerCase(command));
Listener *listener; IChangeableForward *forward;
Listener **plistener = m_CmdLookup.retrieve(str); if (!m_Listeners.retrieve(str, &forward))
if (plistener == NULL)
{ {
listener = new Listener; forward = g_Forwards.CreateForwardEx(NULL, ET_Hook, 3, NULL, Param_Cell,
listener->forward = g_Forwards.CreateForwardEx(NULL, ET_Hook, 3, NULL, Param_Cell, Param_String, Param_Cell);
Param_String, Param_Cell); m_Listeners.insert(str, forward);
m_CmdLookup.insert(str, listener);
} }
else forward->AddFunction(fun);
{
listener = *plistener;
}
listener->forward->AddFunction(fun);
delete [] str;
} }
return true; return true;
@ -652,14 +644,11 @@ bool ConsoleDetours::RemoveListener(IPluginFunction *fun, const char *command)
} }
else else
{ {
const char *str = UTIL_ToLowerCase(command); ke::AutoArray<char> str(UTIL_ToLowerCase(command));
Listener *listener; IChangeableForward *forward;
Listener **plistener = m_CmdLookup.retrieve(str); if (!m_Listeners.retrieve(str, &forward))
delete [] str;
if (plistener == NULL)
return false; return false;
listener = *plistener; return forward->RemoveFunction(fun);
return listener->forward->RemoveFunction(fun);
} }
} }
@ -695,18 +684,17 @@ cell_t ConsoleDetours::InternalDispatch(int client, const CCommand& args)
if (result >= Pl_Handled) if (result >= Pl_Handled)
return result; return result;
Listener **plistener = m_CmdLookup.retrieve(name); IChangeableForward *forward;
if (plistener == NULL) if (!m_Listeners.retrieve(name, &forward))
return result; return result;
Listener *listener = *plistener; if (forward->GetFunctionCount() == 0)
if (listener->forward->GetFunctionCount() == 0)
return result; return result;
cell_t result2 = Pl_Continue; cell_t result2 = Pl_Continue;
listener->forward->PushCell(client); forward->PushCell(client);
listener->forward->PushString(name); forward->PushString(name);
listener->forward->PushCell(args.ArgC() - 1); forward->PushCell(args.ArgC() - 1);
listener->forward->Execute(&result2, NULL); forward->Execute(&result2, NULL);
if (result2 > result) if (result2 > result)
result = result2; result = result2;

View File

@ -34,7 +34,7 @@
#include "sm_globals.h" #include "sm_globals.h"
#include "sourcemm_api.h" #include "sourcemm_api.h"
#include "ForwardSys.h" #include "ForwardSys.h"
#include <sm_trie_tpl.h> #include <sm_stringhashmap.h>
class ConsoleDetours : class ConsoleDetours :
public SMGlobalClass, public SMGlobalClass,
@ -43,10 +43,6 @@ class ConsoleDetours :
friend class PlayerManager; friend class PlayerManager;
friend class GenericCommandHooker; friend class GenericCommandHooker;
struct Listener
{
IChangeableForward *forward;
};
public: public:
ConsoleDetours(); ConsoleDetours();
public: //SMGlobalClass public: //SMGlobalClass
@ -73,8 +69,7 @@ public:
private: private:
FeatureStatus status; FeatureStatus status;
IChangeableForward *m_pForward; IChangeableForward *m_pForward;
KTrie<Listener*> m_CmdLookup; StringHashMap<IChangeableForward *> m_Listeners;
List<Listener*> m_Listeners;
}; };
extern ConsoleDetours g_ConsoleDetours; extern ConsoleDetours g_ConsoleDetours;

View File

@ -115,6 +115,7 @@ public:
} }
typedef typename Internal::Result Result; typedef typename Internal::Result Result;
typedef typename Internal::iterator iterator;
// Some KTrie-like helper functions. // Some KTrie-like helper functions.
bool retrieve(const char *aKey, T *aResult = NULL) bool retrieve(const char *aKey, T *aResult = NULL)
@ -191,6 +192,10 @@ public:
internal_.clear(); internal_.clear();
} }
iterator iter() {
return internal_.iter();
}
size_t mem_usage() const { size_t mem_usage() const {
return internal_.estimateMemoryUse() + memory_used_; return internal_.estimateMemoryUse() + memory_used_;
} }