// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "thread.h"
#endif
#include "wx/thread.h"
#ifdef __WXMAC__
+#if TARGET_API_MAC_OSX
#include <CoreServices/CoreServices.h>
+#else
+#include <DriverServices.h>
+#include <Multiprocessing.h>
+#include "wx/math.h"
+#endif
#include "wx/mac/uma.h"
#endif
-// trace mask for wxThread operations
-#define TRACE_THREADS _T("thread")
-
-// you can get additional debugging messages for the semaphore operations
-#define TRACE_SEMA _T("semaphore")
-
-
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// wxMutex implementation
// ----------------------------------------------------------------------------
+static bool wxMacMPThreadsInitVerify()
+{
+ static bool hasThreadManager = false ;
+ if ( !hasThreadManager )
+ hasThreadManager = MPLibraryIsLoaded();
+
+ if ( !hasThreadManager )
+ {
+ wxMessageBox( wxT("Error") , wxT("MP Thread Support is not available on this System" ), wxOK ) ;
+ return FALSE ;
+ }
+ return TRUE ;
+}
+
#if 0
class wxMutexInternal
wxMutexInternal::wxMutexInternal(wxMutexType mutexType )
{
+ wxMacMPThreadsInitVerify() ;
+
m_isOk = false ;
m_semaphore = kInvalidID ;
wxMutexInternal::wxMutexInternal(wxMutexType mutexType )
{
+ wxMacMPThreadsInitVerify() ;
m_isOk = false ;
m_critRegion = kInvalidID ;
wxSemaphoreInternal::wxSemaphoreInternal(int initialcount, int maxcount)
{
+ wxMacMPThreadsInitVerify() ;
m_isOk = false ;
m_semaphore = kInvalidID ;
if ( maxcount == 0 )
MPQueueID m_notifyQueueId; // its notification queue
wxThreadState m_state; // see wxThreadState enum
- int m_prio; // in wxWindows units: from 0 to 100
+ int m_prio; // in wxWidgets units: from 0 to 100
// this flag is set when the thread should terminate
bool m_cancelled;
bool wxThreadInternal::Create(wxThread *thread, unsigned int stackSize)
{
+ wxMacMPThreadsInitVerify() ;
wxASSERT_MSG( m_state == STATE_NEW && !m_tid,
_T("Create()ing thread twice?") );
if ( m_tid)
{
// Mac priorities range from 1 to 10,000, with a default of 100.
- // wxWindows priorities range from 0 to 100 with a default of 50.
- // We can map wxWindows to Mac priorities easily by assuming
+ // wxWidgets priorities range from 0 to 100 with a default of 50.
+ // We can map wxWidgets to Mac priorities easily by assuming
// the former uses a logarithmic scale.
const unsigned int macPriority = ( int)( exp( priority / 25.0 * log( 10.0)) + 0.5);
kDurationForever);
if ( err)
{
- wxLogSysError( _( "Cannot wait on thread to exit."));
+ wxLogSysError( _( "Cannot wait for thread termination."));
rc = (void*) -1;
}
switch ( state )
{
case STATE_PAUSED:
- wxLogTrace(TRACE_THREADS, _T("Thread %ld suspended, resuming."),
- GetId());
-
m_internal->Resume();
-
return wxTHREAD_NO_ERROR;
-
case STATE_EXITED:
- wxLogTrace(TRACE_THREADS, _T("Thread %ld exited, won't resume."),
- GetId());
return wxTHREAD_NO_ERROR;
default:
IMPLEMENT_DYNAMIC_CLASS(wxThreadModule, wxModule)
bool wxThreadModule::OnInit()
-{
- bool hasThreadManager = false ;
- hasThreadManager = MPLibraryIsLoaded();
-
- if ( !hasThreadManager )
+{
+ if ( !wxMacMPThreadsInitVerify() )
{
- wxMessageBox( "Error" , "MP Thread Support is not available on this System" , wxOK ) ;
return FALSE ;
}