X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8cd8a7feb72a8f45d5cb4d5f51fca7e73291d2b5..83666e99093aa0b65c497f7e6c75d98a875667cc:/src/msw/thread.cpp diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index 301144ac14..cc4d13a2e6 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -75,8 +75,9 @@ // this is where _beginthreadex() is declared #include <process.h> - // the return type of the thread function entry point - typedef wxUIntPtr THREAD_RETVAL; + // the return type of the thread function entry point: notice that this + // type can't hold a pointer under Win64 + typedef unsigned THREAD_RETVAL; // the calling convention of the thread function entry point #define THREAD_CALLCONV __stdcall @@ -144,7 +145,7 @@ static bool gs_waitingForThread = false; // wxCriticalSection // ---------------------------------------------------------------------------- -wxCriticalSection::wxCriticalSection() +wxCriticalSection::wxCriticalSection( wxCriticalSectionType WXUNUSED(critSecType) ) { wxCOMPILE_TIME_ASSERT( sizeof(CRITICAL_SECTION) <= sizeof(wxCritSectBuffer), wxCriticalSectionBufferTooSmall ); @@ -188,12 +189,15 @@ private: wxMutexError LockTimeout(DWORD milliseconds); HANDLE m_mutex; + + unsigned long m_owningThread; + wxMutexType m_type; DECLARE_NO_COPY_CLASS(wxMutexInternal) }; // all mutexes are recursive under Win32 so we don't use mutexType -wxMutexInternal::wxMutexInternal(wxMutexType WXUNUSED(mutexType)) +wxMutexInternal::wxMutexInternal(wxMutexType mutexType) { // create a nameless (hence intra process and always private) mutex m_mutex = ::CreateMutex @@ -203,10 +207,14 @@ wxMutexInternal::wxMutexInternal(wxMutexType WXUNUSED(mutexType)) NULL // no name ); + m_type = mutexType; + m_owningThread = 0; + if ( !m_mutex ) { wxLogLastError(_T("CreateMutex()")); } + } wxMutexInternal::~wxMutexInternal() @@ -230,6 +238,16 @@ wxMutexError wxMutexInternal::TryLock() wxMutexError wxMutexInternal::LockTimeout(DWORD milliseconds) { + if (m_type == wxMUTEX_DEFAULT) + { + // Don't allow recursive + if (m_owningThread != 0) + { + if (m_owningThread == wxThread::GetCurrentId()) + return wxMUTEX_DEAD_LOCK; + } + } + DWORD rc = ::WaitForSingleObject(m_mutex, milliseconds); if ( rc == WAIT_ABANDONED ) { @@ -260,11 +278,20 @@ wxMutexError wxMutexInternal::LockTimeout(DWORD milliseconds) return wxMUTEX_MISC_ERROR; } + if (m_type == wxMUTEX_DEFAULT) + { + // required for checking recursiveness + m_owningThread = wxThread::GetCurrentId(); + } + return wxMUTEX_NO_ERROR; } wxMutexError wxMutexInternal::Unlock() { + // required for checking recursiveness + m_owningThread = 0; + if ( !::ReleaseMutex(m_mutex) ) { wxLogLastError(_T("ReleaseMutex()")); @@ -528,7 +555,7 @@ THREAD_RETVAL wxThreadInternal::DoThreadStart(wxThread *thread) return THREAD_ERROR_EXIT; } - rc = (THREAD_RETVAL)thread->Entry(); + rc = wxPtrToUInt(thread->Entry()); } wxCATCH_ALL( wxTheApp->OnUnhandledException(); ) @@ -1092,7 +1119,7 @@ wxThreadError wxThread::Resume() wxThread::ExitCode wxThread::Wait() { - ExitCode rc = (ExitCode)THREAD_ERROR_EXIT; + ExitCode rc = wxUIntToPtr(THREAD_ERROR_EXIT); // although under Windows we can wait for any thread, it's an error to // wait for a detached one in wxWin API