diff options
author | Zach Reizner <zachr@google.com> | 2015-11-10 15:18:08 -0800 |
---|---|---|
committer | Zach Reizner <zachr@google.com> | 2015-11-10 15:26:10 -0800 |
commit | 8467b129419b0f78974bd478809ad32da4fd09fa (patch) | |
tree | 14f57d459e2c1267b27cd81e6389b569d4a03166 /worker.cpp | |
parent | db81fce67419d82d828eebec25e57284e90dd93a (diff) | |
download | drm_hwcomposer-8467b129419b0f78974bd478809ad32da4fd09fa.tar.gz |
drm_hwcomposer: add optional timeout for WaitForSignalOrExitLocked
Change-Id: I5beef0833cc0a384aa76e821694183e024a8850c
Diffstat (limited to 'worker.cpp')
-rw-r--r-- | worker.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
@@ -23,11 +23,14 @@ #include <stdlib.h> #include <sys/resource.h> #include <sys/signal.h> +#include <time.h> #include <cutils/log.h> namespace android { +static const int64_t kBillion = 1000000000LL; + Worker::Worker(const char *name, int priority) : name_(name), priority_(priority), exit_(false), initialized_(false) { } @@ -42,7 +45,10 @@ Worker::~Worker() { } int Worker::InitWorker() { - int ret = pthread_cond_init(&cond_, NULL); + pthread_condattr_t cond_attr; + pthread_condattr_init(&cond_attr); + pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC); + int ret = pthread_cond_init(&cond_, &cond_attr); if (ret) { ALOGE("Failed to int thread %s condition %d", name_.c_str(), ret); return ret; @@ -128,11 +134,25 @@ int Worker::Exit() { return exit_ret; } -int Worker::WaitForSignalOrExitLocked() { +int Worker::WaitForSignalOrExitLocked(int64_t max_nanoseconds) { if (exit_) return -EINTR; - int ret = pthread_cond_wait(&cond_, &lock_); + int ret = 0; + if (max_nanoseconds < 0) { + ret = pthread_cond_wait(&cond_, &lock_); + } else { + struct timespec abs_deadline; + ret = clock_gettime(CLOCK_MONOTONIC, &abs_deadline); + if (ret) + return ret; + int64_t nanos = (int64_t)abs_deadline.tv_nsec + max_nanoseconds; + abs_deadline.tv_sec += nanos / kBillion; + abs_deadline.tv_nsec = nanos % kBillion; + ret = pthread_cond_timedwait(&cond_, &lock_, &abs_deadline); + if (ret == ETIMEDOUT) + ret = -ETIMEDOUT; + } if (exit_) return -EINTR; |