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
|
OPTFLAGS=/ox /5r
|
||||||
|
|
||||||
# /d1 for line numbers only: anything else produces an enormous wx32.lib
|
# /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
|
.cpp.obj: # $< # .AUTODEPEND
|
||||||
*$(CCC) $(CPPFLAGS) $(IFLAGS) $<
|
*$(CCC) $(CPPFLAGS) $(IFLAGS) $<
|
||||||
|
@@ -45,21 +45,42 @@
|
|||||||
#define _MT
|
#define _MT
|
||||||
#endif
|
#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__) || \
|
#if defined(__VISUALC__) || \
|
||||||
(defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
|
(defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
|
||||||
(defined(__GNUG__) && defined(__MSVCRT__))
|
(defined(__GNUG__) && defined(__MSVCRT__)) || \
|
||||||
|
defined(__WATCOMC__)
|
||||||
|
|
||||||
#if defined(__BORLANDC__) && !defined(__MT__)
|
#undef wxUSE_BEGIN_THREAD
|
||||||
// I can't set -tWM in the IDE (anyone?) so have to do this
|
#define wxUSE_BEGIN_THREAD
|
||||||
#define __MT__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__BORLANDC__) && !defined(__MFC_COMPAT__)
|
|
||||||
// Needed to know about _beginthreadex etc..
|
|
||||||
#define __MFC_COMPAT__
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef wxUSE_BEGIN_THREAD
|
||||||
|
// this is where _beginthreadex() is declared
|
||||||
#include <process.h>
|
#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
|
#endif
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -410,7 +431,7 @@ public:
|
|||||||
DWORD GetId() const { return m_tid; }
|
DWORD GetId() const { return m_tid; }
|
||||||
|
|
||||||
// thread function
|
// thread function
|
||||||
static DWORD WinThreadStart(wxThread *thread);
|
static THREAD_RETVAL THREAD_CALLCONV WinThreadStart(void *thread);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
HANDLE m_hThread; // handle of the thread
|
HANDLE m_hThread; // handle of the thread
|
||||||
@@ -419,16 +440,17 @@ private:
|
|||||||
DWORD m_tid; // thread id
|
DWORD m_tid; // thread id
|
||||||
};
|
};
|
||||||
|
|
||||||
DWORD wxThreadInternal::WinThreadStart(wxThread *thread)
|
THREAD_RETVAL wxThreadInternal::WinThreadStart(void *param)
|
||||||
{
|
{
|
||||||
DWORD rc;
|
THREAD_RETVAL rc;
|
||||||
bool wasCancelled;
|
bool wasCancelled;
|
||||||
|
|
||||||
// first of all, check whether we hadn't been cancelled already and don't
|
// first of all, check whether we hadn't been cancelled already and don't
|
||||||
// start the user code at all then
|
// start the user code at all then
|
||||||
|
wxThread *thread = (wxThread *)param;
|
||||||
if ( thread->m_internal->GetState() == STATE_EXITED )
|
if ( thread->m_internal->GetState() == STATE_EXITED )
|
||||||
{
|
{
|
||||||
rc = (DWORD)-1;
|
rc = (THREAD_RETVAL)-1;
|
||||||
wasCancelled = TRUE;
|
wasCancelled = TRUE;
|
||||||
}
|
}
|
||||||
else // do run thread
|
else // do run thread
|
||||||
@@ -441,7 +463,7 @@ DWORD wxThreadInternal::WinThreadStart(wxThread *thread)
|
|||||||
return (DWORD)-1;
|
return (DWORD)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = (DWORD)thread->Entry();
|
rc = (THREAD_RETVAL)thread->Entry();
|
||||||
|
|
||||||
// enter m_critsect before changing the thread state
|
// enter m_critsect before changing the thread state
|
||||||
thread->m_critsect.Enter();
|
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
|
// 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
|
// creation instead of Win32 API one because otherwise we will have memory
|
||||||
// leaks if the thread uses C RTL (and most threads do)
|
// leaks if the thread uses C RTL (and most threads do)
|
||||||
#if defined(__VISUALC__) || \
|
#ifdef wxUSE_BEGIN_THREAD
|
||||||
(defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
|
m_hThread = (HANDLE)_beginthreadex
|
||||||
(defined(__GNUG__) && defined(__MSVCRT__))
|
(
|
||||||
typedef unsigned (__stdcall *RtlThreadStart)(void *);
|
NULL, // default security
|
||||||
|
#ifdef __WATCOMC__
|
||||||
m_hThread = (HANDLE)_beginthreadex(NULL, 0,
|
10240, // stack size can't be NULL in Watcom
|
||||||
(RtlThreadStart)
|
#else
|
||||||
wxThreadInternal::WinThreadStart,
|
0, // default stack size
|
||||||
thread, CREATE_SUSPENDED,
|
#endif
|
||||||
(unsigned int *)&m_tid);
|
wxThreadInternal::WinThreadStart, // entry point
|
||||||
|
thread,
|
||||||
|
CREATE_SUSPENDED,
|
||||||
|
(unsigned int *)&m_tid
|
||||||
|
);
|
||||||
#else // compiler doesn't have _beginthreadex
|
#else // compiler doesn't have _beginthreadex
|
||||||
m_hThread = ::CreateThread
|
m_hThread = ::CreateThread
|
||||||
(
|
(
|
||||||
NULL, // default security
|
NULL, // default security
|
||||||
0, // default stack size
|
0, // default stack size
|
||||||
(LPTHREAD_START_ROUTINE) // thread entry point
|
wxThreadInternal::WinThreadStart, // thread entry point
|
||||||
wxThreadInternal::WinThreadStart, //
|
|
||||||
(LPVOID)thread, // parameter
|
(LPVOID)thread, // parameter
|
||||||
CREATE_SUSPENDED, // flags
|
CREATE_SUSPENDED, // flags
|
||||||
&m_tid // [out] thread id
|
&m_tid // [out] thread id
|
||||||
@@ -985,9 +1010,7 @@ void wxThread::Exit(ExitCode status)
|
|||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__VISUALC__) || \
|
#ifdef wxUSE_BEGIN_THREAD
|
||||||
(defined(__BORLANDC__) && (__BORLANDC__ >= 0x500)) || \
|
|
||||||
(defined(__GNUG__) && defined(__MSVCRT__))
|
|
||||||
_endthreadex((unsigned)status);
|
_endthreadex((unsigned)status);
|
||||||
#else // !VC++
|
#else // !VC++
|
||||||
::ExitThread((DWORD)status);
|
::ExitThread((DWORD)status);
|
||||||
|
Reference in New Issue
Block a user