#endif
#ifndef WX_PRECOMP
- #include "wx/wx.h"
+# include "wx/wx.h"
#endif
#if wxUSE_THREADS
#include "wx/module.h"
#include "wx/thread.h"
+#ifdef Yield
+# undef Yield
+#endif
+
// must have this symbol defined to get _beginthread/_endthread declarations
#ifndef _MT
#define _MT
#endif
-#ifdef __VISUALC__
+#if defined(__VISUALC__) || \
+ (defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
+ (defined(__GNUG__) && defined(__MSVCRT__))
+
+#if defined(__BORLANDC__) && !defined(__MT__)
+// I can't set -tWM in the IDE (anyone?) so have to do this
+#define __MT__
+#endif
+
+#if defined(__BORLANDC__) && !defined(__MFC_COMPAT__)
+// Needed to know about _beginthreadex etc..
+#define __MFC_COMPAT__
+#endif
+
#include <process.h>
#endif
class wxMutexInternal
{
public:
- HANDLE p_mutex;
+ wxMutexInternal()
+ {
+ m_mutex = ::CreateMutex(NULL, FALSE, NULL);
+ if ( !m_mutex )
+ {
+ wxLogSysError(_("Can not create mutex"));
+ }
+ }
+
+ ~wxMutexInternal() { if ( m_mutex ) CloseHandle(m_mutex); }
+
+public:
+ HANDLE m_mutex;
};
wxMutex::wxMutex()
{
m_internal = new wxMutexInternal;
- m_internal->p_mutex = CreateMutex(NULL, FALSE, NULL);
- if ( !m_internal->p_mutex )
- {
- wxLogSysError(_("Can not create mutex."));
- }
m_locked = 0;
}
wxMutex::~wxMutex()
{
- if (m_locked > 0)
- wxLogDebug(wxT("Warning: freeing a locked mutex (%d locks)."), m_locked);
- CloseHandle(m_internal->p_mutex);
+ if ( m_locked > 0 )
+ {
+ wxLogDebug(_T("Warning: freeing a locked mutex (%d locks)."), m_locked);
+ }
+
+ delete m_internal;
}
wxMutexError wxMutex::Lock()
{
DWORD ret;
- ret = WaitForSingleObject(m_internal->p_mutex, INFINITE);
+ ret = WaitForSingleObject(m_internal->m_mutex, INFINITE);
switch ( ret )
{
case WAIT_ABANDONED:
{
DWORD ret;
- ret = WaitForSingleObject(m_internal->p_mutex, 0);
+ ret = WaitForSingleObject(m_internal->m_mutex, 0);
if (ret == WAIT_TIMEOUT || ret == WAIT_ABANDONED)
return wxMUTEX_BUSY;
if (m_locked > 0)
m_locked--;
- BOOL ret = ReleaseMutex(m_internal->p_mutex);
+ BOOL ret = ReleaseMutex(m_internal->m_mutex);
if ( ret == 0 )
{
wxLogSysError(_("Couldn't release a mutex"));
// 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)
-#ifdef __VISUALC__
+#if defined(__VISUALC__) || \
+ (defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
+ (defined(__GNUG__) && defined(__MSVCRT__))
typedef unsigned (__stdcall *RtlThreadStart)(void *);
m_hThread = (HANDLE)_beginthreadex(NULL, 0,
wxThreadInternal::WinThreadStart,
thread, CREATE_SUSPENDED,
(unsigned int *)&m_tid);
-#else // !VC++
+#else // compiler doesn't have _beginthreadex
m_hThread = ::CreateThread
(
NULL, // default security
CREATE_SUSPENDED, // flags
&m_tid // [out] thread id
);
-#endif // VC++/!VC++
+#endif // _beginthreadex/CreateThread
if ( m_hThread == NULL )
{
if ( hModKernel )
{
pfnSetProcessAffinityMask = (SETPROCESSAFFINITYMASK)
- ::GetProcAddress(hModKernel, _T("SetProcessAffinityMask"));
+ ::GetProcAddress(hModKernel,
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x520)
+ "SetProcessAffinityMask");
+#else
+ _T("SetProcessAffinityMask"));
+#endif
}
// we've discovered a MT version of Win9x!
delete this;
}
-#ifdef __VISUALC__
+#if defined(__VISUALC__) || \
+ (defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
+ (defined(__GNUG__) && defined(__MSVCRT__))
_endthreadex((unsigned)status);
#else // !VC++
::ExitThread((DWORD)status);