#include "wx/thread.h"
#ifdef __WXMAC__
+#include <Threads.h>
#include "wx/mac/uma.h"
#endif
class wxMacStCritical
{
public :
- wxMacStCritical()
+ wxMacStCritical()
{
if ( UMASystemIsInitialized() )
ThreadBeginCritical() ;
m_owner = kNoThreadID ;
}
- ~wxMutexInternal()
+ ~wxMutexInternal()
{
}
err = ::MacGetCurrentThread(¤t);
// if we are not the owner, add this thread to the list of waiting threads, stop this thread
// and invoke the scheduler to continue executing the owner's thread
- while ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current)
+ while ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current)
{
m_internal->m_waiters.Add(current);
err = ::SetThreadStateEndCritical(kCurrentThreadID, kStoppedThreadState, m_internal->m_owner);
{
wxMacStCritical critical ;
if ( UMASystemIsInitialized() )
- {
- OSErr err ;
+ {
ThreadID current = kNoThreadID;
::MacGetCurrentThread(¤t);
// if we are not the owner, give an error back
- if ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current )
+ if ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current )
return wxMUTEX_BUSY;
-
+
m_internal->m_owner = current;
}
m_locked++;
wxMutexError wxMutex::Unlock()
{
if ( UMASystemIsInitialized() )
- {
+ {
OSErr err;
err = ::ThreadBeginCritical();
-
+
if (m_locked > 0)
m_locked--;
// now pass on to the first waiting thread
ThreadID firstWaiting = kNoThreadID;
bool found = false;
- while (!m_internal->m_waiters.IsEmpty() && !found)
+ while (!m_internal->m_waiters.IsEmpty() && !found)
{
firstWaiting = m_internal->m_waiters[0];
err = ::SetThreadState(firstWaiting, kReadyThreadState, kNoThreadID);
// in case this was not successful (dead thread), we just loop on and reset the id
- found = (err != threadNotFoundErr);
+ found = (err != threadNotFoundErr);
if ( !found )
firstWaiting = kNoThreadID ;
m_internal->m_waiters.RemoveAt(0) ;
class wxConditionInternal
{
public:
- wxConditionInternal()
+ wxConditionInternal(wxMutex& mutex) : m_mutex(mutex)
{
m_excessSignals = 0 ;
}
wxArrayLong m_waiters ;
wxInt32 m_excessSignals ;
+ wxMutex& m_mutex;
};
-wxCondition::wxCondition()
+wxCondition::wxCondition(wxMutex& mutex)
{
- m_internal = new wxConditionInternal;
+ m_internal = new wxConditionInternal(mutex);
}
wxCondition::~wxCondition()
(void)m_internal->Wait(0xFFFFFFFFL);
}
-bool wxCondition::Wait(unsigned long sec,
- unsigned long nsec)
+bool wxCondition::Wait(unsigned long timeout_millis)
{
- return m_internal->Wait(sec*1000 + nsec/1000000);
+ return m_internal->Wait(timeout_millis);
}
void wxCondition::Signal()
// this works because all these threads are already waiting and so each
// SetEvent() inside Signal() is really a PulseEvent() because the event
// state is immediately returned to non-signaled
- for ( int i = 0; i < m_internal->m_waiters.Count(); i++ )
+ for ( size_t i = 0; i < m_internal->m_waiters.Count(); i++ )
{
Signal();
}
// thread priority
void SetPriority(unsigned int priority);
unsigned int GetPriority() const { return m_priority; }
-
+
void SetResult( void *res ) { m_result = res ; }
void *GetResult() { return m_result ; }
bool wxThreadInternal::Suspend()
{
OSErr err ;
-
+
::ThreadBeginCritical();
if ( m_state != STATE_RUNNING )
wxASSERT( err == noErr ) ;
wxASSERT( current != m_tid ) ;
-
+
::ThreadBeginCritical();
if ( m_state != STATE_PAUSED && m_state != STATE_NEW )
{
::ThreadEndCritical() ;
wxLogSysError(_("Can not resume thread %x"), m_tid);
return FALSE;
-
+
}
err = ::SetThreadStateEndCritical(m_tid, kReadyThreadState, kNoThreadID);
wxASSERT( err == noErr ) ;
-
+
m_state = STATE_RUNNING;
::ThreadEndCritical() ;
::YieldToAnyThread() ;
wxThread *wxThread::This()
{
wxMacStCritical critical ;
-
+
ThreadID current ;
OSErr err ;
-
+
err = MacGetCurrentThread( ¤t ) ;
-
- for ( int i = 0 ; i < s_threads.Count() ; ++i )
+
+ for ( size_t i = 0 ; i < s_threads.Count() ; ++i )
{
if ( ( (wxThread*) s_threads[i] )->GetId() == current )
return (wxThread*) s_threads[i] ;
{
ThreadID current ;
OSErr err ;
-
+
err = MacGetCurrentThread( ¤t ) ;
return current == gs_idMainThread;
}
void wxThread::Sleep(unsigned long milliseconds)
{
clock_t start = clock() ;
- do
+ do
{
YieldToAnyThread() ;
} while( clock() - start < milliseconds / CLOCKS_PER_SEC ) ;
return 1;
}
+unsigned long wxThread::GetCurrentId()
+{
+ ThreadID current ;
+ MacGetCurrentThread( ¤t ) ;
+ return (unsigned long)current;
+}
+
bool wxThread::SetConcurrency(size_t level)
{
wxASSERT_MSG( IsMain(), _T("should only be called from the main thread") );
// processor system it doesn't make much sense anyhow
return level == 1;
}
-
+
return TRUE ;
}
m_internal->SetResult( status ) ;
-/*
+/*
#if defined(__VISUALC__) || (defined(__BORLANDC__) && (__BORLANDC__ >= 0x500))
_endthreadex((unsigned)status);
#else // !VC++
return false ;
}
-// wake up the main thread
+// wake up the main thread
void WXDLLEXPORT wxWakeUpMainThread()
{
wxMacWakeUp() ;