aboutsummaryrefslogtreecommitdiff
path: root/worker.cpp
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2015-11-10 15:18:08 -0800
committerZach Reizner <zachr@google.com>2015-11-10 15:26:10 -0800
commit8467b129419b0f78974bd478809ad32da4fd09fa (patch)
tree14f57d459e2c1267b27cd81e6389b569d4a03166 /worker.cpp
parentdb81fce67419d82d828eebec25e57284e90dd93a (diff)
downloaddrm_hwcomposer-8467b129419b0f78974bd478809ad32da4fd09fa.tar.gz
drm_hwcomposer: add optional timeout for WaitForSignalOrExitLocked
Change-Id: I5beef0833cc0a384aa76e821694183e024a8850c
Diffstat (limited to 'worker.cpp')
-rw-r--r--worker.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/worker.cpp b/worker.cpp
index e169911..1cebedc 100644
--- a/worker.cpp
+++ b/worker.cpp
@@ -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;