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

View File

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

View File

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