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>
This commit is contained in:
parent
2fbe972a65
commit
dcf9c403ba
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user