Remove memtables from ConCmdManager (bug 5899 part 3, r=fyren).
This commit is contained in:
parent
ba927964c8
commit
67ce8aff61
@ -38,6 +38,8 @@
|
|||||||
#include "ChatTriggers.h"
|
#include "ChatTriggers.h"
|
||||||
#include "logic_bridge.h"
|
#include "logic_bridge.h"
|
||||||
|
|
||||||
|
using namespace ke;
|
||||||
|
|
||||||
ConCmdManager g_ConCmds;
|
ConCmdManager g_ConCmds;
|
||||||
|
|
||||||
#if SOURCE_ENGINE == SE_DOTA
|
#if SOURCE_ENGINE == SE_DOTA
|
||||||
@ -53,7 +55,7 @@ SH_DECL_HOOK1_void(IServerGameClients, SetCommandClient, SH_NOATTRIB, false, int
|
|||||||
typedef ke::LinkedList<CmdHook *> PluginHookList;
|
typedef ke::LinkedList<CmdHook *> PluginHookList;
|
||||||
void RegisterInPlugin(CmdHook *hook);
|
void RegisterInPlugin(CmdHook *hook);
|
||||||
|
|
||||||
ConCmdManager::ConCmdManager() : m_Strings(1024)
|
ConCmdManager::ConCmdManager()
|
||||||
{
|
{
|
||||||
m_CmdClient = 0;
|
m_CmdClient = 0;
|
||||||
}
|
}
|
||||||
@ -105,6 +107,9 @@ void ConCmdManager::OnUnlinkConCommandBase(ConCommandBase *pBase, const char *na
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hook->admin)
|
||||||
|
hook->admin->group->hooks.remove(hook);
|
||||||
|
|
||||||
iter = pInfo->hooks.erase(iter);
|
iter = pInfo->hooks.erase(iter);
|
||||||
delete hook;
|
delete hook;
|
||||||
}
|
}
|
||||||
@ -124,6 +129,8 @@ void ConCmdManager::OnPluginDestroyed(IPlugin *plugin)
|
|||||||
CmdHook *hook = *iter;
|
CmdHook *hook = *iter;
|
||||||
|
|
||||||
hook->info->hooks.remove(hook);
|
hook->info->hooks.remove(hook);
|
||||||
|
if (hook->admin)
|
||||||
|
hook->admin->group->hooks.remove(hook);
|
||||||
|
|
||||||
if (hook->info->hooks.empty())
|
if (hook->info->hooks.empty())
|
||||||
RemoveConCmd(hook->info, hook->info->pCmd->GetName(), true, true);
|
RemoveConCmd(hook->info, hook->info->pCmd->GetName(), true, true);
|
||||||
@ -450,19 +457,17 @@ bool ConCmdManager::AddAdminCommand(IPluginFunction *pFunction,
|
|||||||
if (!pInfo)
|
if (!pInfo)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description);
|
GroupMap::Insert i = m_CmdGrps.findForAdd(group);
|
||||||
|
if (!i.found())
|
||||||
pHook->admin = new AdminCmdInfo();
|
|
||||||
|
|
||||||
int grpid;
|
|
||||||
if (!m_CmdGrps.retrieve(group, &grpid))
|
|
||||||
{
|
{
|
||||||
grpid = m_Strings.AddString(group);
|
if (!m_CmdGrps.add(i, group))
|
||||||
m_CmdGrps.insert(group, grpid);
|
return false;
|
||||||
|
i->value = NoAddRef(new CommandGroup());
|
||||||
}
|
}
|
||||||
|
Ref<CommandGroup> cmdgroup = i->value;
|
||||||
|
|
||||||
pHook->admin->cmdGrpId = grpid;
|
CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description);
|
||||||
pHook->admin->flags = adminflags;
|
pHook->admin = new AdminCmdInfo(cmdgroup, adminflags);
|
||||||
|
|
||||||
/* First get the command group override, if any */
|
/* First get the command group override, if any */
|
||||||
bool override = g_Admins.GetCommandOverride(group,
|
bool override = g_Admins.GetCommandOverride(group,
|
||||||
@ -482,6 +487,7 @@ bool ConCmdManager::AddAdminCommand(IPluginFunction *pFunction,
|
|||||||
pHook->admin->eflags = pHook->admin->flags;
|
pHook->admin->eflags = pHook->admin->flags;
|
||||||
pInfo->eflags = pHook->admin->eflags;
|
pInfo->eflags = pHook->admin->eflags;
|
||||||
|
|
||||||
|
cmdgroup->hooks.append(pHook);
|
||||||
pInfo->hooks.append(pHook);
|
pInfo->hooks.append(pHook);
|
||||||
RegisterInPlugin(pHook);
|
RegisterInPlugin(pHook);
|
||||||
return true;
|
return true;
|
||||||
@ -586,27 +592,20 @@ void ConCmdManager::UpdateAdminCmdFlags(const char *cmd, OverrideType type, Flag
|
|||||||
}
|
}
|
||||||
else if (type == Override_CommandGroup)
|
else if (type == Override_CommandGroup)
|
||||||
{
|
{
|
||||||
int grpid;
|
GroupMap::Result r = m_CmdGrps.find(cmd);
|
||||||
if (!m_CmdGrps.retrieve(cmd, &grpid))
|
if (!r.found())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* This is bad :( loop through all commands */
|
Ref<CommandGroup> group(r->value);
|
||||||
List<ConCmdInfo *>::iterator iter;
|
|
||||||
for (iter=m_CmdList.begin(); iter!=m_CmdList.end(); iter++)
|
|
||||||
{
|
|
||||||
ConCmdInfo *pInfo = *iter;
|
|
||||||
for (CmdHookList::iterator citer = pInfo->hooks.begin(); citer != pInfo->hooks.end(); citer++)
|
|
||||||
{
|
|
||||||
CmdHook *hook = (*citer);
|
|
||||||
if (!hook->admin || hook->admin->cmdGrpId != grpid)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
for (PluginHookList::iterator iter = group->hooks.begin(); iter != group->hooks.end(); iter++)
|
||||||
|
{
|
||||||
|
CmdHook *hook = *iter;
|
||||||
if (remove)
|
if (remove)
|
||||||
hook->admin->eflags = bits;
|
hook->admin->eflags = bits;
|
||||||
else
|
else
|
||||||
hook->admin->eflags = hook->admin->flags;
|
hook->admin->eflags = hook->admin->flags;
|
||||||
pInfo->eflags = hook->admin->eflags;
|
hook->info->eflags = hook->admin->eflags;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
#include "sm_globals.h"
|
#include "sm_globals.h"
|
||||||
#include "sourcemm_api.h"
|
#include "sourcemm_api.h"
|
||||||
#include "ForwardSys.h"
|
#include "ForwardSys.h"
|
||||||
#include "sm_memtable.h"
|
|
||||||
#include <sh_list.h>
|
#include <sh_list.h>
|
||||||
#include <sh_string.h>
|
#include <sh_string.h>
|
||||||
#include <IRootConsoleMenu.h>
|
#include <IRootConsoleMenu.h>
|
||||||
@ -45,24 +44,31 @@
|
|||||||
#include <am-utility.h>
|
#include <am-utility.h>
|
||||||
#include <am-inlinelist.h>
|
#include <am-inlinelist.h>
|
||||||
#include <am-linkedlist.h>
|
#include <am-linkedlist.h>
|
||||||
|
#include <am-refcounting.h>
|
||||||
|
|
||||||
using namespace SourceHook;
|
using namespace SourceHook;
|
||||||
|
|
||||||
|
struct CmdHook;
|
||||||
|
struct ConCmdInfo;
|
||||||
|
|
||||||
|
struct CommandGroup : public ke::Refcounted<CommandGroup>
|
||||||
|
{
|
||||||
|
ke::LinkedList<CmdHook *> hooks;
|
||||||
|
};
|
||||||
|
|
||||||
struct AdminCmdInfo
|
struct AdminCmdInfo
|
||||||
{
|
{
|
||||||
AdminCmdInfo()
|
AdminCmdInfo(const ke::Ref<CommandGroup> &group, FlagBits flags)
|
||||||
|
: group(group),
|
||||||
|
flags(flags),
|
||||||
|
eflags(0)
|
||||||
{
|
{
|
||||||
cmdGrpId = -1;
|
|
||||||
flags = 0;
|
|
||||||
eflags = 0;
|
|
||||||
}
|
}
|
||||||
int cmdGrpId; /* index into cmdgroup string table */
|
ke::Ref<CommandGroup> group;
|
||||||
FlagBits flags; /* default flags */
|
FlagBits flags; /* default flags */
|
||||||
FlagBits eflags; /* effective flags */
|
FlagBits eflags; /* effective flags */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ConCmdInfo;
|
|
||||||
|
|
||||||
struct CmdHook : public ke::InlineListNode<CmdHook>
|
struct CmdHook : public ke::InlineListNode<CmdHook>
|
||||||
{
|
{
|
||||||
enum Type {
|
enum Type {
|
||||||
@ -166,11 +172,12 @@ public:
|
|||||||
return m_CmdList;
|
return m_CmdList;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
typedef StringHashMap<ke::Ref<CommandGroup> > GroupMap;
|
||||||
|
|
||||||
StringHashMap<ConCmdInfo *> m_Cmds; /* command lookup */
|
StringHashMap<ConCmdInfo *> m_Cmds; /* command lookup */
|
||||||
StringHashMap<int> m_CmdGrps; /* command group lookup */
|
GroupMap m_CmdGrps; /* command group map */
|
||||||
ConCmdList m_CmdList; /* command list */
|
ConCmdList m_CmdList; /* command list */
|
||||||
int m_CmdClient; /* current client */
|
int m_CmdClient; /* current client */
|
||||||
BaseStringTable m_Strings; /* string table */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ConCmdManager g_ConCmds;
|
extern ConCmdManager g_ConCmds;
|
||||||
|
@ -58,6 +58,13 @@ class Newborn
|
|||||||
mutable T *thing_;
|
mutable T *thing_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static inline Newborn<T>
|
||||||
|
NoAddRef(T *t)
|
||||||
|
{
|
||||||
|
return Newborn<T>(t);
|
||||||
|
}
|
||||||
|
|
||||||
// When returning a value, we'd rather not be needlessly changing the refcount,
|
// When returning a value, we'd rather not be needlessly changing the refcount,
|
||||||
// so we have a special type to use for returns.
|
// so we have a special type to use for returns.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
Loading…
Reference in New Issue
Block a user