summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qwaitcondition_unix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/thread/qwaitcondition_unix.cpp')
-rw-r--r--src/corelib/thread/qwaitcondition_unix.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/corelib/thread/qwaitcondition_unix.cpp b/src/corelib/thread/qwaitcondition_unix.cpp
index 59c4035232..616a4bdfb8 100644
--- a/src/corelib/thread/qwaitcondition_unix.cpp
+++ b/src/corelib/thread/qwaitcondition_unix.cpp
@@ -59,6 +59,14 @@
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.
+static int local_cond_timedwait_relative(pthread_cond_t*, pthread_mutex_t *, const timespec *)
+__attribute__((weakref("__pthread_cond_timedwait_relative")));
+#endif
+
static void report_error(int code, const char *where, const char *what)
{
if (code != 0)
@@ -107,6 +115,13 @@ public:
int wait_relative(unsigned long time)
{
timespec ti;
+#ifdef Q_OS_ANDROID
+ if (Q_LIKELY(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);
+ }
+#endif
qt_abstime_for_timeout(&ti, time);
return pthread_cond_timedwait(&cond, &mutex, &ti);
}