[8318] Deleted as expected runnable objects at related Thread deleting for avoid memory leaks.

This commit is contained in:
VladimirMangos 2009-08-05 20:21:25 +04:00
parent dc8bf0f7e7
commit 0f364bf00a
7 changed files with 30 additions and 15 deletions

View file

@ -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

View file

@ -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;
} }

View file

@ -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:

View file

@ -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()

View file

@ -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

View file

@ -61,7 +61,7 @@ namespace ACE_Based
{ {
public: public:
Thread(); Thread();
Thread(Runnable& instance); explicit Thread(Runnable* instance);
~Thread(); ~Thread();
bool start(); bool start();

View file

@ -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__