From 9f51f2b678a4fc689191536720e27303ec22c85b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 30 Oct 2001 02:40:28 +0000 Subject: [PATCH] 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 --- src/makewat.env | 5 ++- src/msw/thread.cpp | 81 +++++++++++++++++++++++++++++----------------- 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/src/makewat.env b/src/makewat.env index 3f5cdb8355..3b86de02a4 100644 --- a/src/makewat.env +++ b/src/makewat.env @@ -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) $< diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index f76f9a4c7b..a70d1389c6 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -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__)) - -#if defined(__BORLANDC__) && !defined(__MT__) -// I can't set -tWM in the IDE (anyone?) so have to do this -#define __MT__ -#endif + (defined(__GNUG__) && defined(__MSVCRT__)) || \ + defined(__WATCOMC__) -#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 + + // 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); -- 2.45.2