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:
Vadim Zeitlin
2001-10-30 02:40:28 +00:00
parent 42be4418fe
commit 9f51f2b678
2 changed files with 56 additions and 30 deletions

View File

@@ -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) $<

View File

@@ -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);