summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qwaitcondition_unix.cpp
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2013-03-30 10:52:52 -0700
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-04-02 19:01:32 +0200
commitdcf9c403ba8e903bb52a6fb656c7e2de23383c10 (patch)
tree28510b63b6818dc9b53aed88a40dcf8acc80ab14 /src/corelib/thread/qwaitcondition_unix.cpp
parent2fbe972a656cf218e5b48c018618e464c878840c (diff)
Use Bionic's __pthread_cond_timedwait_relative
The Linux futex interface uses relative timeouts anyway, so this avoids a double round-trip through clock_gettime: once in Qt code to calculate absolute from relative and once in libc for reversing. Glibc does not offer such a function because its pthread_cond objects use a kernel interface that works on absolute times. Change-Id: I8fbcd3f73d4364a16716b0eea17e8f5f9ab5cd05 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
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);
}