Fixed: Potential bug in CWinThread, someone using a mutex on the stack again
This commit is contained in:
parent
e41f5da96b
commit
392b224799
1 changed files with 16 additions and 5 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue