summaryrefslogtreecommitdiff
path: root/src/components/utils/src/conditional_variable_posix.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/utils/src/conditional_variable_posix.cc')
-rw-r--r--src/components/utils/src/conditional_variable_posix.cc23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/components/utils/src/conditional_variable_posix.cc b/src/components/utils/src/conditional_variable_posix.cc
index a89f8cab6..2928cac9d 100644
--- a/src/components/utils/src/conditional_variable_posix.cc
+++ b/src/components/utils/src/conditional_variable_posix.cc
@@ -1,4 +1,4 @@
-/**
+/*
* Copyright (c) 2013, Ford Motor Company
* All rights reserved.
*
@@ -83,14 +83,29 @@ void ConditionalVariable::Broadcast() {
}
-void ConditionalVariable::Wait(AutoLock& auto_lock) {
+bool ConditionalVariable::Wait(Lock& lock) {
+ lock.AssertTakenAndMarkFree();
+ int32_t wait_status = pthread_cond_wait(&cond_var_,
+ &lock.mutex_);
+ lock.AssertFreeAndMarkTaken();
+ if (wait_status != 0) {
+ LOG4CXX_ERROR(logger_, "Failed to wait for conditional variable");
+ return false;
+ }
+ return true;
+}
+
+bool ConditionalVariable::Wait(AutoLock& auto_lock) {
Lock& lock = auto_lock.GetLock();
lock.AssertTakenAndMarkFree();
int32_t wait_status = pthread_cond_wait(&cond_var_,
&lock.mutex_);
lock.AssertFreeAndMarkTaken();
- if (wait_status != 0)
+ if (wait_status != 0) {
LOG4CXX_ERROR(logger_, "Failed to wait for conditional variable");
+ return false;
+ }
+ return true;
}
ConditionalVariable::WaitStatus ConditionalVariable::WaitFor(
@@ -104,7 +119,6 @@ ConditionalVariable::WaitStatus ConditionalVariable::WaitFor(
(milliseconds % kMillisecondsPerSecond) * kNanosecondsPerMillisecond;
wait_interval.tv_sec += wait_interval.tv_nsec / kNanosecondsPerSecond;
wait_interval.tv_nsec %= kNanosecondsPerSecond;
-
Lock& lock = auto_lock.GetLock();
lock.AssertTakenAndMarkFree();
int32_t timedwait_status = pthread_cond_timedwait(&cond_var_,
@@ -129,7 +143,6 @@ ConditionalVariable::WaitStatus ConditionalVariable::WaitFor(
LOG4CXX_ERROR(logger_, "Failed to timewait for conditional variable timedwait_status: " << timedwait_status);
}
}
-
return wait_status;
}