X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4c460b340f3f32621e83e6efd2f25c43005d60b0..96fa7876bf2cb12837b2eaf49a54f8a0547ef7c2:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index fad73a2df9..5bbb54a778 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -45,6 +45,15 @@ #include #endif +#ifdef HAVE_THR_SETCONCURRENCY + #include +#endif + +// we use wxFFile under Linux in GetCPUCount() +#ifdef __LINUX__ + #include "wx/ffile.h" +#endif + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -716,7 +725,7 @@ void wxThreadInternal::Wait() wxMutexGuiLeave(); bool isDetached = m_isDetached; - long id = GetId(); + long id = (long)GetId(); wxLogTrace(TRACE_THREADS, _T("Starting to wait for thread %ld to exit."), id); @@ -740,7 +749,7 @@ void wxThreadInternal::Wait() // we're cancelled inside pthread_join(), things will almost // certainly break - but if we disable the cancellation, we // might deadlock - if ( pthread_join(id, &m_exitcode) != 0 ) + if ( pthread_join((pthread_t)id, &m_exitcode) != 0 ) { wxLogError(_("Failed to join a thread, potential memory leak " "detected - please restart the program")); @@ -834,6 +843,63 @@ void wxThread::Sleep(unsigned long milliseconds) wxUsleep(milliseconds); } +int wxThread::GetCPUCount() +{ +#if defined(__LINUX__) + // read from proc (can't use wxTextFile here because it's a special file: + // it has 0 size but still can be read from) + wxLogNull nolog; + + wxFFile file(_T("/proc/cpuinfo")); + if ( file.IsOpened() ) + { + // slurp the whole file + wxString s; + if ( file.ReadAll(&s) ) + { + // (ab)use Replace() to find the number of "processor" strings + size_t count = s.Replace(_T("processor"), _T("")); + if ( count > 0 ) + { + return count; + } + + wxLogDebug(_T("failed to parse /proc/cpuinfo")); + } + else + { + wxLogDebug(_T("failed to read /proc/cpuinfo")); + } + } +#elif defined(_SC_NPROCESSORS_ONLN) + // this works for Solaris + int rc = sysconf(_SC_NPROCESSORS_ONLN); + if ( rc != -1 ) + { + return rc; + } +#endif // different ways to get number of CPUs + + // unknown + return -1; +} + +bool wxThread::SetConcurrency(size_t level) +{ +#ifdef HAVE_THR_SETCONCURRENCY + int rc = thr_setconcurrency(level); + if ( rc != 0 ) + { + wxLogSysError(rc, _T("thr_setconcurrency() failed")); + } + + return rc == 0; +#else // !HAVE_THR_SETCONCURRENCY + // ok only for the default value + return level == 0; +#endif // HAVE_THR_SETCONCURRENCY/!HAVE_THR_SETCONCURRENCY +} + // ----------------------------------------------------------------------------- // creating thread // ----------------------------------------------------------------------------- @@ -867,8 +933,18 @@ wxThreadError wxThread::Create() wxLogError(_("Cannot retrieve thread scheduling policy.")); } - int min_prio = sched_get_priority_min(policy), - max_prio = sched_get_priority_max(policy), +#ifdef __VMS__ + /* the pthread.h contains too many spaces. This is a work-around */ +# undef sched_get_priority_max +#undef sched_get_priority_min +#define sched_get_priority_max(_pol_) \ + (_pol_ == SCHED_OTHER ? PRI_FG_MAX_NP : PRI_FIFO_MAX) +#define sched_get_priority_min(_pol_) \ + (_pol_ == SCHED_OTHER ? PRI_FG_MIN_NP : PRI_FIFO_MIN) +#endif + + int max_prio = sched_get_priority_max(policy), + min_prio = sched_get_priority_min(policy), prio = m_internal->GetPriority(); if ( min_prio == -1 || max_prio == -1 )