summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/thread')
-rw-r--r--src/corelib/thread/qthread_unix.cpp6
-rw-r--r--src/corelib/thread/qwaitcondition_unix.cpp18
2 files changed, 15 insertions, 9 deletions
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index f0ba7a7f07..996ed1779d 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -389,14 +389,13 @@ Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
int QThread::idealThreadCount() Q_DECL_NOTHROW
{
- int cores = -1;
+ int cores = 1;
#if defined(Q_OS_HPUX)
// HP-UX
struct pst_dynamic psd;
if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) == -1) {
perror("pstat_getdynamic");
- cores = -1;
} else {
cores = (int)psd.psd_proc_cnt;
}
@@ -408,7 +407,6 @@ int QThread::idealThreadCount() Q_DECL_NOTHROW
mib[1] = HW_NCPU;
if (sysctl(mib, 2, &cores, &len, NULL, 0) != 0) {
perror("sysctl");
- cores = -1;
}
#elif defined(Q_OS_IRIX)
// IRIX
@@ -443,9 +441,9 @@ int QThread::idealThreadCount() Q_DECL_NOTHROW
#else
// the rest: Linux, Solaris, AIX, Tru64
cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
-#endif
if (cores == -1)
return 1;
+#endif
return cores;
}
diff --git a/src/corelib/thread/qwaitcondition_unix.cpp b/src/corelib/thread/qwaitcondition_unix.cpp
index 90dfcb7ba1..fd6af7db39 100644
--- a/src/corelib/thread/qwaitcondition_unix.cpp
+++ b/src/corelib/thread/qwaitcondition_unix.cpp
@@ -52,9 +52,12 @@
QT_BEGIN_NAMESPACE
#ifdef Q_OS_ANDROID
-// Android lacks pthread_condattr_setclock, but it does have a nice function
-// for relative waits. Use weakref so we can determine at runtime whether it is
-// present.
+// pthread_condattr_setclock is available only since Android 5.0. On older versions, there's
+// a private function for relative waits (hidden in 5.0).
+// Use weakref so we can determine at runtime whether each of them is present.
+static int local_condattr_setclock(pthread_condattr_t*, clockid_t)
+__attribute__((weakref("pthread_condattr_setclock")));
+
static int local_cond_timedwait_relative(pthread_cond_t*, pthread_mutex_t *, const timespec *)
__attribute__((weakref("__pthread_cond_timedwait_relative")));
#endif
@@ -70,10 +73,15 @@ void qt_initialize_pthread_cond(pthread_cond_t *cond, const char *where)
pthread_condattr_t condattr;
pthread_condattr_init(&condattr);
-#if !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID) && !defined(Q_OS_HAIKU) && (_POSIX_MONOTONIC_CLOCK-0 >= 0)
+#if (_POSIX_MONOTONIC_CLOCK-0 >= 0)
+#if defined(Q_OS_ANDROID)
+ if (local_condattr_setclock && QElapsedTimer::clockType() == QElapsedTimer::MonotonicClock)
+ local_condattr_setclock(&condattr, CLOCK_MONOTONIC);
+#elif !defined(Q_OS_MAC) && !defined(Q_OS_HAIKU)
if (QElapsedTimer::clockType() == QElapsedTimer::MonotonicClock)
pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
#endif
+#endif
report_error(pthread_cond_init(cond, &condattr), where, "cv init");
pthread_condattr_destroy(&condattr);
}
@@ -108,7 +116,7 @@ public:
{
timespec ti;
#ifdef Q_OS_ANDROID
- if (Q_LIKELY(local_cond_timedwait_relative)) {
+ if (local_cond_timedwait_relative) {
ti.tv_sec = time / 1000;
ti.tv_nsec = time % 1000 * Q_UINT64_C(1000) * 1000;
return local_cond_timedwait_relative(&cond, &mutex, &ti);