diff options
Diffstat (limited to 'src/components/utils/src/conditional_variable_posix.cc')
-rw-r--r-- | src/components/utils/src/conditional_variable_posix.cc | 23 |
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; } |