mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[8318] Deleted as expected runnable objects at related Thread deleting for avoid memory leaks.
This commit is contained in:
parent
dc8bf0f7e7
commit
0f364bf00a
7 changed files with 30 additions and 15 deletions
|
|
@ -223,12 +223,14 @@ int Master::Run()
|
||||||
_HookSignals();
|
_HookSignals();
|
||||||
|
|
||||||
///- Launch WorldRunnable thread
|
///- Launch WorldRunnable thread
|
||||||
ACE_Based::Thread t(*new WorldRunnable);
|
ACE_Based::Thread t(new WorldRunnable);
|
||||||
t.setPriority(ACE_Based::Highest);
|
t.setPriority(ACE_Based::Highest);
|
||||||
|
|
||||||
// set server online
|
// set server online
|
||||||
loginDatabase.PExecute("UPDATE realmlist SET color = 0, population = 0 WHERE id = '%d'",realmID);
|
loginDatabase.PExecute("UPDATE realmlist SET color = 0, population = 0 WHERE id = '%d'",realmID);
|
||||||
|
|
||||||
|
ACE_Based::Thread* cliThread = NULL;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
if (sConfig.GetBoolDefault("Console.Enable", true) && (m_ServiceStatus == -1)/* need disable console in service mode*/)
|
if (sConfig.GetBoolDefault("Console.Enable", true) && (m_ServiceStatus == -1)/* need disable console in service mode*/)
|
||||||
#else
|
#else
|
||||||
|
|
@ -236,10 +238,10 @@ int Master::Run()
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
///- Launch CliRunnable thread
|
///- Launch CliRunnable thread
|
||||||
ACE_Based::Thread td1(*new CliRunnable);
|
cliThread = new ACE_Based::Thread(new CliRunnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
ACE_Based::Thread td2(*new RARunnable);
|
ACE_Based::Thread td2(new RARunnable);
|
||||||
|
|
||||||
///- Handle affinity for multiple processors and process priority on Windows
|
///- Handle affinity for multiple processors and process priority on Windows
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|
@ -300,7 +302,7 @@ int Master::Run()
|
||||||
{
|
{
|
||||||
FreezeDetectorRunnable *fdr = new FreezeDetectorRunnable();
|
FreezeDetectorRunnable *fdr = new FreezeDetectorRunnable();
|
||||||
fdr->SetDelayTime(freeze_delay*1000);
|
fdr->SetDelayTime(freeze_delay*1000);
|
||||||
ACE_Based::Thread t(*fdr);
|
ACE_Based::Thread t(fdr);
|
||||||
t.setPriority(ACE_Based::Highest);
|
t.setPriority(ACE_Based::Highest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -338,9 +340,10 @@ int Master::Run()
|
||||||
|
|
||||||
sLog.outString( "Halting process..." );
|
sLog.outString( "Halting process..." );
|
||||||
|
|
||||||
#ifdef WIN32
|
if(cliThread)
|
||||||
if (sConfig.GetBoolDefault("Console.Enable", true))
|
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
|
||||||
// this only way to terminate CLI thread exist at Win32 (alt. way exist only in Windows Vista API)
|
// this only way to terminate CLI thread exist at Win32 (alt. way exist only in Windows Vista API)
|
||||||
//_exit(1);
|
//_exit(1);
|
||||||
// send keyboard input to safely unblock the CLI thread
|
// send keyboard input to safely unblock the CLI thread
|
||||||
|
|
@ -375,8 +378,17 @@ int Master::Run()
|
||||||
b[3].Event.KeyEvent.wRepeatCount = 1;
|
b[3].Event.KeyEvent.wRepeatCount = 1;
|
||||||
DWORD numb;
|
DWORD numb;
|
||||||
BOOL ret = WriteConsoleInput(hStdIn, b, 4, &numb);
|
BOOL ret = WriteConsoleInput(hStdIn, b, 4, &numb);
|
||||||
|
|
||||||
|
cliThread->wait();
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
cliThread->destroy();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
delete cliThread;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// for some unknown reason, unloading scripts here and not in worldrunnable
|
// for some unknown reason, unloading scripts here and not in worldrunnable
|
||||||
// fixes a memory leak related to detaching threads from the module
|
// fixes a memory leak related to detaching threads from the module
|
||||||
|
|
|
||||||
|
|
@ -926,7 +926,7 @@ bool AuthSocket::_HandleXferResume()
|
||||||
ibuf.Read((char*)&start,sizeof(start));
|
ibuf.Read((char*)&start,sizeof(start));
|
||||||
fseek(pPatch, start, 0);
|
fseek(pPatch, start, 0);
|
||||||
|
|
||||||
ACE_Based::Thread u(*new PatcherRunnable(this));
|
ACE_Based::Thread u(new PatcherRunnable(this));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -959,7 +959,7 @@ bool AuthSocket::_HandleXferAccept()
|
||||||
ibuf.Remove(1); // clear input buffer
|
ibuf.Remove(1); // clear input buffer
|
||||||
fseek(pPatch, 0, 0);
|
fseek(pPatch, 0, 0);
|
||||||
|
|
||||||
ACE_Based::Thread u(*new PatcherRunnable(this));
|
ACE_Based::Thread u(new PatcherRunnable(this));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ class MANGOS_DLL_SPEC Database
|
||||||
|
|
||||||
TransactionQueues m_tranQueues; ///< Transaction queues from diff. threads
|
TransactionQueues m_tranQueues; ///< Transaction queues from diff. threads
|
||||||
QueryQueues m_queryQueues; ///< Query queues from diff threads
|
QueryQueues m_queryQueues; ///< Query queues from diff threads
|
||||||
SqlDelayThread* m_threadBody; ///< Pointer to delay sql executer
|
SqlDelayThread* m_threadBody; ///< Pointer to delay sql executer (owned by m_delayThread)
|
||||||
ACE_Based::Thread* m_delayThread; ///< Pointer to executer thread
|
ACE_Based::Thread* m_delayThread; ///< Pointer to executer thread
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -424,8 +424,8 @@ void DatabaseMysql::InitDelayThread()
|
||||||
assert(!m_delayThread);
|
assert(!m_delayThread);
|
||||||
|
|
||||||
//New delay thread for delay execute
|
//New delay thread for delay execute
|
||||||
m_threadBody = new MySQLDelayThread(this);
|
m_threadBody = new MySQLDelayThread(this); // will deleted at m_delayThread delete
|
||||||
m_delayThread = new ACE_Based::Thread(*m_threadBody);
|
m_delayThread = new ACE_Based::Thread(m_threadBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseMysql::HaltDelayThread()
|
void DatabaseMysql::HaltDelayThread()
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ Thread::Thread() : m_task(0), m_iThreadId(0), m_hThreadHandle(0)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread::Thread(Runnable& instance) : m_task(&instance), m_iThreadId(0), m_hThreadHandle(0)
|
Thread::Thread(Runnable* instance) : m_task(instance), m_iThreadId(0), m_hThreadHandle(0)
|
||||||
{
|
{
|
||||||
bool _start = start();
|
bool _start = start();
|
||||||
ASSERT (_start);
|
ASSERT (_start);
|
||||||
|
|
@ -110,6 +110,9 @@ Thread::Thread(Runnable& instance) : m_task(&instance), m_iThreadId(0), m_hThrea
|
||||||
Thread::~Thread()
|
Thread::~Thread()
|
||||||
{
|
{
|
||||||
//Wait();
|
//Wait();
|
||||||
|
|
||||||
|
// deleted runnable object (owned by Thread)
|
||||||
|
delete m_task;
|
||||||
}
|
}
|
||||||
|
|
||||||
//initialize Thread's class static member
|
//initialize Thread's class static member
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ namespace ACE_Based
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Thread();
|
Thread();
|
||||||
Thread(Runnable& instance);
|
explicit Thread(Runnable* instance);
|
||||||
~Thread();
|
~Thread();
|
||||||
|
|
||||||
bool start();
|
bool start();
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8317"
|
#define REVISION_NR "8318"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue