(more) FreeBSD thread fixes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-03-05 16:24:07 +00:00
parent 91845adaba
commit 68401dfe2c
3 changed files with 30 additions and 6 deletions

View File

@@ -151,9 +151,9 @@ public:
WXCRITICAL_INLINE ~wxCriticalSection(); WXCRITICAL_INLINE ~wxCriticalSection();
// enter the section (the same as locking a mutex) // enter the section (the same as locking a mutex)
void WXCRITICAL_INLINE Enter(); WXCRITICAL_INLINE void Enter();
// leave the critical section (same as unlocking a mutex) // leave the critical section (same as unlocking a mutex)
void WXCRITICAL_INLINE Leave(); WXCRITICAL_INLINE void Leave();
private: private:
// no assignment operator nor copy ctor // no assignment operator nor copy ctor

View File

@@ -405,7 +405,12 @@ bool wxThread::IsMain()
void wxThread::Yield() void wxThread::Yield()
{ {
#ifdef HAVE_SCHED_YIELD
sched_yield(); sched_yield();
#else // !HAVE_SCHED_YIELD
// may be it will have the desired effect?
Sleep(0);
#endif // HAVE_SCHED_YIELD
} }
void wxThread::Sleep(unsigned long milliseconds) void wxThread::Sleep(unsigned long milliseconds)
@@ -434,6 +439,7 @@ wxThreadError wxThread::Create()
pthread_attr_t attr; pthread_attr_t attr;
pthread_attr_init(&attr); pthread_attr_init(&attr);
#ifdef HAVE_THREAD_PRIORITY_FUNCTIONS
int prio; int prio;
if ( pthread_attr_getschedpolicy(&attr, &prio) != 0 ) if ( pthread_attr_getschedpolicy(&attr, &prio) != 0 )
{ {
@@ -456,6 +462,7 @@ wxThreadError wxThread::Create()
(p_internal->GetPriority()*(max_prio-min_prio))/100; (p_internal->GetPriority()*(max_prio-min_prio))/100;
pthread_attr_setschedparam(&attr, &sp); pthread_attr_setschedparam(&attr, &sp);
} }
#endif // HAVE_THREAD_PRIORITY_FUNCTIONS
// create the new OS thread object // create the new OS thread object
int rc = pthread_create(&p_internal->thread_id, &attr, int rc = pthread_create(&p_internal->thread_id, &attr,
@@ -482,8 +489,9 @@ wxThreadError wxThread::Run()
void wxThread::SetPriority(unsigned int prio) void wxThread::SetPriority(unsigned int prio)
{ {
wxCHECK_RET( (WXTHREAD_MIN_PRIORITY <= prio) && wxCHECK_RET( ((int)WXTHREAD_MIN_PRIORITY <= (int)prio) &&
(prio <= WXTHREAD_MAX_PRIORITY), "invalid thread priority" ); ((int)prio <= (int)WXTHREAD_MAX_PRIORITY),
"invalid thread priority" );
wxCriticalSectionLocker lock(m_critsect); wxCriticalSectionLocker lock(m_critsect);
@@ -496,6 +504,7 @@ void wxThread::SetPriority(unsigned int prio)
case STATE_RUNNING: case STATE_RUNNING:
case STATE_PAUSED: case STATE_PAUSED:
#ifdef HAVE_THREAD_PRIORITY_FUNCTIONS
{ {
struct sched_param sparam; struct sched_param sparam;
sparam.sched_priority = prio; sparam.sched_priority = prio;
@@ -506,6 +515,7 @@ void wxThread::SetPriority(unsigned int prio)
wxLogError(_("Failed to set thread priority %d."), prio); wxLogError(_("Failed to set thread priority %d."), prio);
} }
} }
#endif // HAVE_THREAD_PRIORITY_FUNCTIONS
break; break;
case STATE_EXITED: case STATE_EXITED:
@@ -604,7 +614,9 @@ wxThreadError wxThread::Kill()
return wxTHREAD_NOT_RUNNING; return wxTHREAD_NOT_RUNNING;
default: default:
#ifdef HAVE_PTHREAD_CANCEL
if ( pthread_cancel(p_internal->GetId()) != 0 ) if ( pthread_cancel(p_internal->GetId()) != 0 )
#endif
{ {
wxLogError(_("Failed to terminate a thread.")); wxLogError(_("Failed to terminate a thread."));

View File

@@ -405,7 +405,12 @@ bool wxThread::IsMain()
void wxThread::Yield() void wxThread::Yield()
{ {
#ifdef HAVE_SCHED_YIELD
sched_yield(); sched_yield();
#else // !HAVE_SCHED_YIELD
// may be it will have the desired effect?
Sleep(0);
#endif // HAVE_SCHED_YIELD
} }
void wxThread::Sleep(unsigned long milliseconds) void wxThread::Sleep(unsigned long milliseconds)
@@ -434,6 +439,7 @@ wxThreadError wxThread::Create()
pthread_attr_t attr; pthread_attr_t attr;
pthread_attr_init(&attr); pthread_attr_init(&attr);
#ifdef HAVE_THREAD_PRIORITY_FUNCTIONS
int prio; int prio;
if ( pthread_attr_getschedpolicy(&attr, &prio) != 0 ) if ( pthread_attr_getschedpolicy(&attr, &prio) != 0 )
{ {
@@ -456,6 +462,7 @@ wxThreadError wxThread::Create()
(p_internal->GetPriority()*(max_prio-min_prio))/100; (p_internal->GetPriority()*(max_prio-min_prio))/100;
pthread_attr_setschedparam(&attr, &sp); pthread_attr_setschedparam(&attr, &sp);
} }
#endif // HAVE_THREAD_PRIORITY_FUNCTIONS
// create the new OS thread object // create the new OS thread object
int rc = pthread_create(&p_internal->thread_id, &attr, int rc = pthread_create(&p_internal->thread_id, &attr,
@@ -482,8 +489,9 @@ wxThreadError wxThread::Run()
void wxThread::SetPriority(unsigned int prio) void wxThread::SetPriority(unsigned int prio)
{ {
wxCHECK_RET( (WXTHREAD_MIN_PRIORITY <= prio) && wxCHECK_RET( ((int)WXTHREAD_MIN_PRIORITY <= (int)prio) &&
(prio <= WXTHREAD_MAX_PRIORITY), "invalid thread priority" ); ((int)prio <= (int)WXTHREAD_MAX_PRIORITY),
"invalid thread priority" );
wxCriticalSectionLocker lock(m_critsect); wxCriticalSectionLocker lock(m_critsect);
@@ -496,6 +504,7 @@ void wxThread::SetPriority(unsigned int prio)
case STATE_RUNNING: case STATE_RUNNING:
case STATE_PAUSED: case STATE_PAUSED:
#ifdef HAVE_THREAD_PRIORITY_FUNCTIONS
{ {
struct sched_param sparam; struct sched_param sparam;
sparam.sched_priority = prio; sparam.sched_priority = prio;
@@ -506,6 +515,7 @@ void wxThread::SetPriority(unsigned int prio)
wxLogError(_("Failed to set thread priority %d."), prio); wxLogError(_("Failed to set thread priority %d."), prio);
} }
} }
#endif // HAVE_THREAD_PRIORITY_FUNCTIONS
break; break;
case STATE_EXITED: case STATE_EXITED:
@@ -604,7 +614,9 @@ wxThreadError wxThread::Kill()
return wxTHREAD_NOT_RUNNING; return wxTHREAD_NOT_RUNNING;
default: default:
#ifdef HAVE_PTHREAD_CANCEL
if ( pthread_cancel(p_internal->GetId()) != 0 ) if ( pthread_cancel(p_internal->GetId()) != 0 )
#endif
{ {
wxLogError(_("Failed to terminate a thread.")); wxLogError(_("Failed to terminate a thread."));