applied Watcom thread patches and made thread entry point stdcall for all compilers
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12204 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -70,7 +70,10 @@ RESFLAGS2 = -R $(name) /i$(WXDIR)\include /i$(WXDIR)\contrib\include
|
||||
OPTFLAGS=/ox /5r
|
||||
|
||||
# /d1 for line numbers only: anything else produces an enormous wx32.lib
|
||||
CPPFLAGS = /bt=nt /w1 /DWIN32 /D__WIN32__ /D__WIN95__ /D__WINDOWS__ /zq $(OPTFLAGS) $(MODEL) $(PRECOMP) $(DEBUGFLAGS) /d__WXMSW__ $(EXTRACPPFLAGS) # /d__WATCOMC__
|
||||
#
|
||||
# NB: /bm switch is needed for thread-safe runtime, if you don't use
|
||||
# wxThread you may remove it
|
||||
CPPFLAGS = /bt=nt /w1 /DWIN32 /bm /zq $(OPTFLAGS) $(MODEL) $(PRECOMP) $(DEBUGFLAGS) /d__WXMSW__ $(EXTRACPPFLAGS) # /d__WATCOMC__
|
||||
|
||||
.cpp.obj: # $< # .AUTODEPEND
|
||||
*$(CCC) $(CPPFLAGS) $(IFLAGS) $<
|
||||
|
@@ -45,21 +45,42 @@
|
||||
#define _MT
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
#if !defined(__MT__)
|
||||
// I can't set -tWM in the IDE (anyone?) so have to do this
|
||||
#define __MT__
|
||||
#endif
|
||||
|
||||
#if !defined(__MFC_COMPAT__)
|
||||
// Needed to know about _beginthreadex etc..
|
||||
#define __MFC_COMPAT__
|
||||
#endif
|
||||
#endif // BC++
|
||||
|
||||
// define wxUSE_BEGIN_THREAD if the compiler has _beginthreadex() function
|
||||
// which should be used instead of Win32 ::CreateThread() if possible
|
||||
#if defined(__VISUALC__) || \
|
||||
(defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
|
||||
(defined(__GNUG__) && defined(__MSVCRT__))
|
||||
(defined(__GNUG__) && defined(__MSVCRT__)) || \
|
||||
defined(__WATCOMC__)
|
||||
|
||||
#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__
|
||||
#undef wxUSE_BEGIN_THREAD
|
||||
#define wxUSE_BEGIN_THREAD
|
||||
#endif
|
||||
|
||||
#ifdef wxUSE_BEGIN_THREAD
|
||||
// this is where _beginthreadex() is declared
|
||||
#include <process.h>
|
||||
|
||||
// the return type of the thread function entry point
|
||||
typedef unsigned THREAD_RETVAL;
|
||||
|
||||
// the calling convention of the thread function entry point
|
||||
#define THREAD_CALLCONV __stdcall
|
||||
#else
|
||||
// the settings for CreateThread()
|
||||
typedef DWORD THREAD_RETVAL;
|
||||
#define THREAD_CALLCONV WINAPI
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -410,7 +431,7 @@ public:
|
||||
DWORD GetId() const { return m_tid; }
|
||||
|
||||
// thread function
|
||||
static DWORD WinThreadStart(wxThread *thread);
|
||||
static THREAD_RETVAL THREAD_CALLCONV WinThreadStart(void *thread);
|
||||
|
||||
private:
|
||||
HANDLE m_hThread; // handle of the thread
|
||||
@@ -419,16 +440,17 @@ private:
|
||||
DWORD m_tid; // thread id
|
||||
};
|
||||
|
||||
DWORD wxThreadInternal::WinThreadStart(wxThread *thread)
|
||||
THREAD_RETVAL wxThreadInternal::WinThreadStart(void *param)
|
||||
{
|
||||
DWORD rc;
|
||||
THREAD_RETVAL rc;
|
||||
bool wasCancelled;
|
||||
|
||||
// first of all, check whether we hadn't been cancelled already and don't
|
||||
// start the user code at all then
|
||||
wxThread *thread = (wxThread *)param;
|
||||
if ( thread->m_internal->GetState() == STATE_EXITED )
|
||||
{
|
||||
rc = (DWORD)-1;
|
||||
rc = (THREAD_RETVAL)-1;
|
||||
wasCancelled = TRUE;
|
||||
}
|
||||
else // do run thread
|
||||
@@ -441,7 +463,7 @@ DWORD wxThreadInternal::WinThreadStart(wxThread *thread)
|
||||
return (DWORD)-1;
|
||||
}
|
||||
|
||||
rc = (DWORD)thread->Entry();
|
||||
rc = (THREAD_RETVAL)thread->Entry();
|
||||
|
||||
// enter m_critsect before changing the thread state
|
||||
thread->m_critsect.Enter();
|
||||
@@ -497,23 +519,26 @@ bool wxThreadInternal::Create(wxThread *thread)
|
||||
// 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)
|
||||
#if defined(__VISUALC__) || \
|
||||
(defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
|
||||
(defined(__GNUG__) && defined(__MSVCRT__))
|
||||
typedef unsigned (__stdcall *RtlThreadStart)(void *);
|
||||
|
||||
m_hThread = (HANDLE)_beginthreadex(NULL, 0,
|
||||
(RtlThreadStart)
|
||||
wxThreadInternal::WinThreadStart,
|
||||
thread, CREATE_SUSPENDED,
|
||||
(unsigned int *)&m_tid);
|
||||
#ifdef wxUSE_BEGIN_THREAD
|
||||
m_hThread = (HANDLE)_beginthreadex
|
||||
(
|
||||
NULL, // default security
|
||||
#ifdef __WATCOMC__
|
||||
10240, // stack size can't be NULL in Watcom
|
||||
#else
|
||||
0, // default stack size
|
||||
#endif
|
||||
wxThreadInternal::WinThreadStart, // entry point
|
||||
thread,
|
||||
CREATE_SUSPENDED,
|
||||
(unsigned int *)&m_tid
|
||||
);
|
||||
#else // compiler doesn't have _beginthreadex
|
||||
m_hThread = ::CreateThread
|
||||
(
|
||||
NULL, // default security
|
||||
0, // default stack size
|
||||
(LPTHREAD_START_ROUTINE) // thread entry point
|
||||
wxThreadInternal::WinThreadStart, //
|
||||
wxThreadInternal::WinThreadStart, // thread entry point
|
||||
(LPVOID)thread, // parameter
|
||||
CREATE_SUSPENDED, // flags
|
||||
&m_tid // [out] thread id
|
||||
@@ -985,9 +1010,7 @@ void wxThread::Exit(ExitCode status)
|
||||
delete this;
|
||||
}
|
||||
|
||||
#if defined(__VISUALC__) || \
|
||||
(defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
|
||||
(defined(__GNUG__) && defined(__MSVCRT__))
|
||||
#ifdef wxUSE_BEGIN_THREAD
|
||||
_endthreadex((unsigned)status);
|
||||
#else // !VC++
|
||||
::ExitThread((DWORD)status);
|
||||
|
Reference in New Issue
Block a user