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 e41f5da96b
commit 392b224799

View file

@ -73,6 +73,19 @@ CWinThread::CWinThread (IRunnable *runnable, uint32 stackSize)
_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)
{
// 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 ...
// 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
CRITICAL_SECTION cs;
InitializeCriticalSection(&cs);
EnterCriticalSection(&cs);
static CWinCriticalSection cs;
cs.enter();
// the 2 following statement must be executed atomicaly among the threads of the current process !
SuspendThread(threadHandle);
_SuspendCount = ResumeThread(threadHandle);
LeaveCriticalSection(&cs);
DeleteCriticalSection(&cs);
cs.leave();
}
}