#ifdef __WXMAC__
#include <Threads.h>
#include "wx/mac/uma.h"
+#include "wx/mac/macnotfy.h"
+#include <Timer.h>
#endif
#define INFINITE 0xFFFFFFFF
+
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
static ThreadID gs_idMainThread = kNoThreadID ;
static bool gs_waitingForThread = FALSE ;
+size_t g_numberOfThreads = 0;
// ============================================================================
// MacOS implementation of thread classes
}
bool IsOk() const { return m_mutex.IsOk() ; }
-
+
wxCondError Wait()
{
return WaitTimeout(0xFFFFFFFF );
}
-
+
wxCondError WaitTimeout(unsigned long msectimeout)
{
wxMacStCritical critical ;
{
wxMacStCritical critical ;
return wxCOND_NO_ERROR;
- }
+ }
wxArrayLong m_waiters ;
wxInt32 m_excessSignals ;
SetPriority(m_priority);
}
+ m_state = STATE_NEW;
+
return TRUE;
}
void wxThread::Yield()
{
+#if TARGET_API_MAC_OSX
+ CFRunLoopRunInMode( kCFRunLoopDefaultMode , 0 , true ) ;
+#endif
::YieldToAnyThread() ;
+
}
void wxThread::Sleep(unsigned long milliseconds)
{
- clock_t start = clock() ;
- do
- {
- YieldToAnyThread() ;
- } while( clock() - start < milliseconds / CLOCKS_PER_SEC ) ;
+ UnsignedWide start, now;
+
+ Microseconds(&start);
+
+ double mssleep = milliseconds * 1000 ;
+ double msstart, msnow ;
+ msstart = (start.hi * 4294967296.0 + start.lo) ;
+
+ do
+ {
+ YieldToAnyThread();
+ Microseconds(&now);
+ msnow = (now.hi * 4294967296.0 + now.lo) ;
+ } while( msnow - msstart < mssleep );
}
int wxThread::GetCPUCount()
wxThread::wxThread(wxThreadKind kind)
{
+ g_numberOfThreads++;
m_internal = new wxThreadInternal();
m_isDetached = kind == wxTHREAD_DETACHED;
wxThread::~wxThread()
{
+ if (g_numberOfThreads>0)
+ {
+ g_numberOfThreads--;
+ }
+#ifdef __WXDEBUG__
+ else
+ {
+ wxFAIL_MSG(wxT("More threads deleted than created."));
+ }
+#endif
+
s_threads.Remove( (void*) this ) ;
if (m_internal != NULL) {
delete m_internal;
}
}
- // if ( !::GetExitCodeThread(hThread, (LPDWORD)&rc) )
- {
- wxLogLastError("GetExitCodeThread");
-
- rc = (ExitCode)-1;
- }
-
if ( IsDetached() )
{
// if the thread exits normally, this is done in WinThreadStart, but in
delete this;
}
- // wxASSERT_MSG( (DWORD)rc != STILL_ACTIVE,
- // wxT("thread must be already terminated.") );
-
if ( pRc )
*pRc = rc;
#endif
if ( !hasThreadManager )
{
- wxMessageBox( "Error" , "Thread Support is not available on this System" , wxOK ) ;
+ wxLogSysError( wxT("Thread Support is not available on this System") );
return FALSE ;
}
#include "wx/thrimpl.cpp"
#endif // wxUSE_THREADS
-
-// vi:sts=4:sw=4:et