Switch ConsoleDetours off KTrie (bug 5884 part 9, r=ds).
This commit is contained in:
parent
77c7b312ea
commit
0235d57625
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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_;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user