#if wxUSE_THREADS
#include "wx/msw/private.h"
+#include "wx/msw/missing.h"
#include "wx/module.h"
#include "wx/thread.h"
wxMutexError LockTimeout(DWORD milliseconds);
HANDLE m_mutex;
+
+ DECLARE_NO_COPY_CLASS(wxMutexInternal)
};
// all mutexes are recursive under Win32 so we don't use mutexType
{
if ( !::ReleaseMutex(m_mutex) )
{
- wxLogLastError(_("ReleaseMutex()"));
+ wxLogLastError(_T("ReleaseMutex()"));
return wxMUTEX_MISC_ERROR;
}
bool IsOk() const { return m_semaphore != NULL; }
wxSemaError Wait() { return WaitTimeout(INFINITE); }
- wxSemaError TryWait() { return WaitTimeout(0); }
+
+ wxSemaError TryWait()
+ {
+ wxSemaError rc = WaitTimeout(0);
+ if ( rc == wxSEMA_TIMEOUT )
+ rc = wxSEMA_BUSY;
+
+ return rc;
+ }
+
wxSemaError WaitTimeout(unsigned long milliseconds);
wxSemaError Post();
private:
HANDLE m_semaphore;
+
+ DECLARE_NO_COPY_CLASS(wxSemaphoreInternal)
};
wxSemaphoreInternal::wxSemaphoreInternal(int initialcount, int maxcount)
return wxSEMA_NO_ERROR;
case WAIT_TIMEOUT:
- return wxSEMA_BUSY;
+ return wxSEMA_TIMEOUT;
default:
wxLogLastError(_T("WaitForSingleObject(semaphore)"));
wxThreadState m_state; // state, see wxThreadState enum
unsigned int m_priority; // thread priority in "wx" units
DWORD m_tid; // thread id
+
+ DECLARE_NO_COPY_CLASS(wxThreadInternal)
};
THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param)
bool wxThreadInternal::Create(wxThread *thread, unsigned int stackSize)
{
+ wxASSERT_MSG( m_state == STATE_NEW && !m_hThread,
+ _T("Create()ing thread twice?") );
+
// for compilers which have it, we should use C RTL function for thread
// creation instead of Win32 API one because otherwise we will have memory
// leaks if the thread uses C RTL (and most threads do)
// we can't just wait for the thread to terminate because it might be
// calling some GUI functions and so it will never terminate before we
// process the Windows messages that result from these functions
- DWORD result;
+ DWORD result = 0; // suppress warnings from broken compilers
do
{
if ( IsMain() )