Remove memtables from ConCmdManager (bug 5899 part 3, r=fyren).
Remove memtables from ConCmdManager (
bug 5899 part 3, r=fyren).
1.1 --- a/core/ConCmdManager.cpp Sat Aug 31 11:51:23 2013 -0700
1.2 +++ b/core/ConCmdManager.cpp Sat Aug 31 19:50:15 2013 -0700
1.3 @@ -38,6 +38,8 @@
1.4 #include "ChatTriggers.h"
1.5 #include "logic_bridge.h"
1.6
1.7 +using namespace ke;
1.8 +
1.9 ConCmdManager g_ConCmds;
1.10
1.11 #if SOURCE_ENGINE == SE_DOTA
1.12 @@ -53,7 +55,7 @@
1.13 typedef ke::LinkedList<CmdHook *> PluginHookList;
1.14 void RegisterInPlugin(CmdHook *hook);
1.15
1.16 -ConCmdManager::ConCmdManager() : m_Strings(1024)
1.17 +ConCmdManager::ConCmdManager()
1.18 {
1.19 m_CmdClient = 0;
1.20 }
1.21 @@ -105,6 +107,9 @@
1.22 }
1.23 }
1.24
1.25 + if (hook->admin)
1.26 + hook->admin->group->hooks.remove(hook);
1.27 +
1.28 iter = pInfo->hooks.erase(iter);
1.29 delete hook;
1.30 }
1.31 @@ -124,6 +129,8 @@
1.32 CmdHook *hook = *iter;
1.33
1.34 hook->info->hooks.remove(hook);
1.35 + if (hook->admin)
1.36 + hook->admin->group->hooks.remove(hook);
1.37
1.38 if (hook->info->hooks.empty())
1.39 RemoveConCmd(hook->info, hook->info->pCmd->GetName(), true, true);
1.40 @@ -450,19 +457,17 @@
1.41 if (!pInfo)
1.42 return false;
1.43
1.44 - CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description);
1.45 -
1.46 - pHook->admin = new AdminCmdInfo();
1.47 -
1.48 - int grpid;
1.49 - if (!m_CmdGrps.retrieve(group, &grpid))
1.50 + GroupMap::Insert i = m_CmdGrps.findForAdd(group);
1.51 + if (!i.found())
1.52 {
1.53 - grpid = m_Strings.AddString(group);
1.54 - m_CmdGrps.insert(group, grpid);
1.55 + if (!m_CmdGrps.add(i, group))
1.56 + return false;
1.57 + i->value = NoAddRef(new CommandGroup());
1.58 }
1.59 + Ref<CommandGroup> cmdgroup = i->value;
1.60
1.61 - pHook->admin->cmdGrpId = grpid;
1.62 - pHook->admin->flags = adminflags;
1.63 + CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description);
1.64 + pHook->admin = new AdminCmdInfo(cmdgroup, adminflags);
1.65
1.66 /* First get the command group override, if any */
1.67 bool override = g_Admins.GetCommandOverride(group,
1.68 @@ -482,6 +487,7 @@
1.69 pHook->admin->eflags = pHook->admin->flags;
1.70 pInfo->eflags = pHook->admin->eflags;
1.71
1.72 + cmdgroup->hooks.append(pHook);
1.73 pInfo->hooks.append(pHook);
1.74 RegisterInPlugin(pHook);
1.75 return true;
1.76 @@ -586,27 +592,20 @@
1.77 }
1.78 else if (type == Override_CommandGroup)
1.79 {
1.80 - int grpid;
1.81 - if (!m_CmdGrps.retrieve(cmd, &grpid))
1.82 + GroupMap::Result r = m_CmdGrps.find(cmd);
1.83 + if (!r.found())
1.84 return;
1.85
1.86 - /* This is bad :( loop through all commands */
1.87 - List<ConCmdInfo *>::iterator iter;
1.88 - for (iter=m_CmdList.begin(); iter!=m_CmdList.end(); iter++)
1.89 + Ref<CommandGroup> group(r->value);
1.90 +
1.91 + for (PluginHookList::iterator iter = group->hooks.begin(); iter != group->hooks.end(); iter++)
1.92 {
1.93 - ConCmdInfo *pInfo = *iter;
1.94 - for (CmdHookList::iterator citer = pInfo->hooks.begin(); citer != pInfo->hooks.end(); citer++)
1.95 - {
1.96 - CmdHook *hook = (*citer);
1.97 - if (!hook->admin || hook->admin->cmdGrpId != grpid)
1.98 - continue;
1.99 -
1.100 - if (remove)
1.101 - hook->admin->eflags = bits;
1.102 - else
1.103 - hook->admin->eflags = hook->admin->flags;
1.104 - pInfo->eflags = hook->admin->eflags;
1.105 - }
1.106 + CmdHook *hook = *iter;
1.107 + if (remove)
1.108 + hook->admin->eflags = bits;
1.109 + else
1.110 + hook->admin->eflags = hook->admin->flags;
1.111 + hook->info->eflags = hook->admin->eflags;
1.112 }
1.113 }
1.114 }
2.1 --- a/core/ConCmdManager.h Sat Aug 31 11:51:23 2013 -0700
2.2 +++ b/core/ConCmdManager.h Sat Aug 31 19:50:15 2013 -0700
2.3 @@ -35,7 +35,6 @@
2.4 #include "sm_globals.h"
2.5 #include "sourcemm_api.h"
2.6 #include "ForwardSys.h"
2.7 -#include "sm_memtable.h"
2.8 #include <sh_list.h>
2.9 #include <sh_string.h>
2.10 #include <IRootConsoleMenu.h>
2.11 @@ -45,24 +44,31 @@
2.12 #include <am-utility.h>
2.13 #include <am-inlinelist.h>
2.14 #include <am-linkedlist.h>
2.15 +#include <am-refcounting.h>
2.16
2.17 using namespace SourceHook;
2.18
2.19 +struct CmdHook;
2.20 +struct ConCmdInfo;
2.21 +
2.22 +struct CommandGroup : public ke::Refcounted<CommandGroup>
2.23 +{
2.24 + ke::LinkedList<CmdHook *> hooks;
2.25 +};
2.26 +
2.27 struct AdminCmdInfo
2.28 {
2.29 - AdminCmdInfo()
2.30 + AdminCmdInfo(const ke::Ref<CommandGroup> &group, FlagBits flags)
2.31 + : group(group),
2.32 + flags(flags),
2.33 + eflags(0)
2.34 {
2.35 - cmdGrpId = -1;
2.36 - flags = 0;
2.37 - eflags = 0;
2.38 }
2.39 - int cmdGrpId; /* index into cmdgroup string table */
2.40 + ke::Ref<CommandGroup> group;
2.41 FlagBits flags; /* default flags */
2.42 FlagBits eflags; /* effective flags */
2.43 };
2.44
2.45 -struct ConCmdInfo;
2.46 -
2.47 struct CmdHook : public ke::InlineListNode<CmdHook>
2.48 {
2.49 enum Type {
2.50 @@ -166,11 +172,12 @@
2.51 return m_CmdList;
2.52 }
2.53 private:
2.54 + typedef StringHashMap<ke::Ref<CommandGroup> > GroupMap;
2.55 +
2.56 StringHashMap<ConCmdInfo *> m_Cmds; /* command lookup */
2.57 - StringHashMap<int> m_CmdGrps; /* command group lookup */
2.58 + GroupMap m_CmdGrps; /* command group map */
2.59 ConCmdList m_CmdList; /* command list */
2.60 int m_CmdClient; /* current client */
2.61 - BaseStringTable m_Strings; /* string table */
2.62 };
2.63
2.64 extern ConCmdManager g_ConCmds;
3.1 --- a/public/amtl/am-refcounting.h Sat Aug 31 11:51:23 2013 -0700
3.2 +++ b/public/amtl/am-refcounting.h Sat Aug 31 19:50:15 2013 -0700
3.3 @@ -58,6 +58,13 @@
3.4 mutable T *thing_;
3.5 };
3.6
3.7 +template <typename T>
3.8 +static inline Newborn<T>
3.9 +NoAddRef(T *t)
3.10 +{
3.11 + return Newborn<T>(t);
3.12 +}
3.13 +
3.14 // When returning a value, we'd rather not be needlessly changing the refcount,
3.15 // so we have a special type to use for returns.
3.16 template <typename T>