Skip to content

Commit 312ecba

Browse files
committed
Re-introduced memory leaks. 😖 (Fixes #430)
1 parent a2dd2ff commit 312ecba

File tree

5 files changed

+37
-73
lines changed

5 files changed

+37
-73
lines changed

Diff for: addons/source-python/packages/source-python/commands/manager.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,8 @@ def _unregister_command(self, name, callback):
136136
:param callable callback:
137137
The callback that is assigned to the command.
138138
"""
139-
self._get_command(name).remove_callback(callback)
139+
try:
140+
self._get_command(name).remove_callback(callback)
141+
except ValueError:
142+
# Command was not registered
143+
pass

Diff for: src/core/modules/commands/commands_server.cpp

+18-24
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,6 @@ CServerCommandManager* GetServerCommand(const char* szName,
9898
return manager;
9999
}
100100

101-
//-----------------------------------------------------------------------------
102-
// Removes a CServerCommandManager instance for the given name.
103-
//-----------------------------------------------------------------------------
104-
void RemoveCServerCommandManager(const char* szName)
105-
{
106-
ServerCommandMap::iterator iter;
107-
if (find_manager<ServerCommandMap, ServerCommandMap::iterator>(g_ServerCommandMap, szName, iter))
108-
{
109-
delete iter->second;
110-
g_ServerCommandMap.erase(iter);
111-
}
112-
}
113-
114101
//-----------------------------------------------------------------------------
115102
// Returns a CServerCommandManager instance.
116103
//-----------------------------------------------------------------------------
@@ -121,8 +108,17 @@ CServerCommandManager* CServerCommandManager::CreateCommand(const char* szName,
121108
char* szNameCopy = strdup(szName);
122109
char* szHelpTextCopy = NULL;
123110

124-
// FInd if the command already exists
125-
ConCommandBase* pConCommand = g_pCVar->FindCommandBase(szName);
111+
// Find if the command already exists
112+
ConCommandBase* pBase = g_pCVar->FindCommandBase(szName);
113+
if (pBase && !pBase->IsCommand()) {
114+
BOOST_RAISE_EXCEPTION(
115+
PyExc_ValueError,
116+
"Failed to create ConCommand(\"%s\") because a ConVar with the same name already exists.",
117+
szName
118+
)
119+
}
120+
121+
ConCommand *pConCommand = static_cast<ConCommand *>(pBase);
126122
if( pConCommand )
127123
{
128124
// Store the current command's help text and flags
@@ -147,7 +143,7 @@ CServerCommandManager* CServerCommandManager::CreateCommand(const char* szName,
147143
//-----------------------------------------------------------------------------
148144
// CServerCommandManager constructor.
149145
//-----------------------------------------------------------------------------
150-
CServerCommandManager::CServerCommandManager(ConCommandBase* pConCommand,
146+
CServerCommandManager::CServerCommandManager(ConCommand* pConCommand,
151147
const char* szName, const char* szHelpText, int iFlags):
152148
ConCommand(szName, (FnCommandCallback_t)NULL, szHelpText, iFlags),
153149
m_pOldCommand(pConCommand)
@@ -209,17 +205,18 @@ void CServerCommandManager::RemoveCallback( PyObject* pCallable, HookType_t type
209205
{
210206
object oCallable = object(handle<>(borrowed(pCallable)));
211207
m_vecCallables[type]->UnregisterListener(pCallable);
212-
if( !m_vecCallables[HOOKTYPE_PRE]->GetCount() && !m_vecCallables[HOOKTYPE_POST]->GetCount() )
213-
{
214-
RemoveCServerCommandManager(m_Name);
215-
}
216208
}
217209

218210
//-----------------------------------------------------------------------------
219211
// Calls all callables for the command when it is called on the server.
220212
//-----------------------------------------------------------------------------
221213
void CServerCommandManager::Dispatch( const CCommand& command )
222214
{
215+
if (!m_vecCallables[HOOKTYPE_PRE]->GetCount() && !m_vecCallables[HOOKTYPE_POST]->GetCount() && !m_pOldCommand) {
216+
Msg("Unknown command \"%s\"\n", m_Name);
217+
return;
218+
}
219+
223220
bool block = false;
224221

225222
// Pre hook callbacks
@@ -240,10 +237,7 @@ void CServerCommandManager::Dispatch( const CCommand& command )
240237
if(m_pOldCommand)
241238
{
242239
if (m_pOldCommand->IsCommand()) {
243-
static_cast<ConCommand *>(m_pOldCommand)->Dispatch(command);
244-
}
245-
else {
246-
static_cast<ConVar *>(m_pOldCommand)->SetValue(command.ArgS());
240+
m_pOldCommand->Dispatch(command);
247241
}
248242
}
249243

Diff for: src/core/modules/commands/commands_server.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ class CServerCommandManager : public ConCommand
5151
void Dispatch( const CCommand& command);
5252

5353
public:
54-
CServerCommandManager(ConCommandBase* pConCommand, const char* szName, const char* szHelpString = 0, int iFlags = 0);
54+
CServerCommandManager(ConCommand* pConCommand, const char* szName, const char* szHelpString = 0, int iFlags = 0);
5555
std::map< HookType_t, CListenerManager* > m_vecCallables;
5656
const char* m_Name;
57-
ConCommandBase* m_pOldCommand;
57+
ConCommand* m_pOldCommand;
5858
};
5959

6060
#endif // _COMMANDS_SERVER_H

Diff for: src/core/modules/cvars/cvars.h

+11-45
Original file line numberDiff line numberDiff line change
@@ -36,33 +36,6 @@
3636
#include "modules/commands/commands_server.h"
3737

3838

39-
//-----------------------------------------------------------------------------
40-
// ICvar shared extension class.
41-
//-----------------------------------------------------------------------------
42-
class ICVarSharedExt
43-
{
44-
public:
45-
static ConVar *FindVar(ICvar *pCVar, const char *szName)
46-
{
47-
ConCommandBase *pBase = pCVar->FindCommandBase(szName);
48-
if (pBase)
49-
{
50-
if (pBase->IsCommand()) {
51-
CServerCommandManager *pManager = dynamic_cast<CServerCommandManager *>(pBase);
52-
if (pManager && pManager->m_pOldCommand && !pManager->m_pOldCommand->IsCommand()) {
53-
return static_cast<ConVar *>(pManager->m_pOldCommand);
54-
}
55-
}
56-
else {
57-
return static_cast<ConVar *>(pBase);
58-
}
59-
}
60-
61-
return NULL;
62-
};
63-
};
64-
65-
6639
//-----------------------------------------------------------------------------
6740
// ConVar extension class.
6841
//-----------------------------------------------------------------------------
@@ -92,34 +65,27 @@ class ConVarExt
9265
PyErr_Clear();
9366
}
9467

95-
ConVar *pConVar = ICVarSharedExt::FindVar(g_pCVar, name);
68+
ConCommandBase *pBase = g_pCVar->FindCommandBase(name);
69+
if (pBase && pBase->IsCommand()) {
70+
BOOST_RAISE_EXCEPTION(
71+
PyExc_ValueError,
72+
"Failed to create ConVar(\"%s\") because a ConCommand with the same name already exists.",
73+
name
74+
)
75+
}
76+
77+
ConVar *pConVar = static_cast<ConVar *>(pBase);
9678
if (!pConVar)
9779
{
9880
ConVar* pConVar = new ConVar(strdup(name), strdup(value), flags,
9981
strdup(description), !min_value.is_none(), fMin, !max_value.is_none(), fMax);
10082

101-
return boost::shared_ptr<ConVar>(pConVar, &Deleter);
83+
return boost::shared_ptr<ConVar>(pConVar, &NeverDeleteDeleter<ConVar *>);
10284
}
10385

10486
return boost::shared_ptr<ConVar>(pConVar, &NeverDeleteDeleter<ConVar *>);
10587
}
10688

107-
static void Deleter(ConVar *pConVar)
108-
{
109-
ConCommandBase *pBase = g_pCVar->FindCommandBase(pConVar->GetName());
110-
if (pBase) {
111-
CServerCommandManager *pManager = dynamic_cast<CServerCommandManager *>(pBase);
112-
if (pManager && pManager->m_pOldCommand == pConVar) {
113-
pManager->m_pOldCommand = NULL;
114-
}
115-
else if (pBase == pConVar) {
116-
g_pCVar->UnregisterConCommand(pConVar);
117-
}
118-
}
119-
120-
delete pConVar;
121-
}
122-
12389
static bool HasMin(ConVar* pConVar)
12490
{
12591
float fMin;

Diff for: src/core/modules/cvars/cvars_wrap.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void export_cvar_interface(scope _cvars)
103103
)
104104

105105
.def("find_var",
106-
&ICVarSharedExt::FindVar,
106+
GET_METHOD(ConVar*, ICvar, FindVar, const char *),
107107
"Find the ConVar instance of console variable.\n\n"
108108
":return: Return ``None`` if the console variable was not found.\n"
109109
":rtype: ConVar",

0 commit comments

Comments
 (0)