Fixed: Potential bug in CWinThread, someone using a mutex on the stack again

This commit is contained in:
kaetemi 2012-04-11 13:24:03 +02:00
parent e799372c7b
commit 700a499f86

View file

@ -73,6 +73,19 @@ CWinThread::CWinThread (IRunnable *runnable, uint32 stackSize)
_MainThread = false; _MainThread = false;
} }
namespace {
class CWinCriticalSection
{
private:
CRITICAL_SECTION cs;
public:
CWinCriticalSection() { InitializeCriticalSection(&cs); }
~CWinCriticalSection() { DeleteCriticalSection(&cs); }
inline void enter() { EnterCriticalSection(&cs); }
inline void leave() { LeaveCriticalSection(&cs); }
};
}/* anonymous namespace */
CWinThread::CWinThread (void* threadHandle, uint32 threadId) CWinThread::CWinThread (void* threadHandle, uint32 threadId)
{ {
// Main thread // Main thread
@ -99,14 +112,12 @@ CWinThread::CWinThread (void* threadHandle, uint32 threadId)
nlassert(0); // WARNING: following code has not tested! don't know if it work fo real ... nlassert(0); // WARNING: following code has not tested! don't know if it work fo real ...
// This is just a suggestion of a possible solution, should this situation one day occur ... // This is just a suggestion of a possible solution, should this situation one day occur ...
// Ensure that this thread don't get deleted, or we could suspend the main thread // Ensure that this thread don't get deleted, or we could suspend the main thread
CRITICAL_SECTION cs; static CWinCriticalSection cs;
InitializeCriticalSection(&cs); cs.enter();
EnterCriticalSection(&cs);
// the 2 following statement must be executed atomicaly among the threads of the current process ! // the 2 following statement must be executed atomicaly among the threads of the current process !
SuspendThread(threadHandle); SuspendThread(threadHandle);
_SuspendCount = ResumeThread(threadHandle); _SuspendCount = ResumeThread(threadHandle);
LeaveCriticalSection(&cs); cs.leave();
DeleteCriticalSection(&cs);
} }
} }