Remove memtables from ConCmdManager (bug 5899 part 3, r=fyren).
authorDavid Anderson <dvander@alliedmods.net>
Sat Aug 31 19:50:15 2013 -0700 (2013-08-31)
changeset 411312e7f3b54c35
parent 4112 31f38e6aae4e
child 4114 58146f5766f0
Remove memtables from ConCmdManager (bug 5899 part 3, r=fyren).
core/ConCmdManager.cpp
core/ConCmdManager.h
public/amtl/am-refcounting.h
     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>