| Index: mojo/edk/system/mutex.cc
|
| diff --git a/mojo/edk/system/mutex.cc b/mojo/edk/system/mutex.cc
|
| index 216b35a0388446f0ae910ac0e068af8ae0720616..0f07adff81b3cfb3b797fcf2f86c8b57b24ed875 100644
|
| --- a/mojo/edk/system/mutex.cc
|
| +++ b/mojo/edk/system/mutex.cc
|
| @@ -5,34 +5,54 @@
|
| #include "mojo/edk/system/mutex.h"
|
|
|
| #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
|
| +#include <errno.h>
|
| +#include <string.h>
|
|
|
| #include "base/logging.h"
|
|
|
| namespace mojo {
|
| namespace system {
|
|
|
| -Mutex::Mutex() : lock_() {
|
| +Mutex::Mutex() {
|
| + pthread_mutexattr_t attr;
|
| + int error = pthread_mutexattr_init(&attr);
|
| + DCHECK(!error) << "pthread_mutexattr_init: " << strerror(error);
|
| + error = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
|
| + DCHECK(!error) << "pthread_mutexattr_settype: " << strerror(error);
|
| + error = pthread_mutex_init(&impl_, &attr);
|
| + DCHECK(!error) << "pthread_mutex_init: " << strerror(error);
|
| + error = pthread_mutexattr_destroy(&attr);
|
| + DCHECK(!error) << "pthread_mutexattr_destroy: " << strerror(error);
|
| }
|
|
|
| Mutex::~Mutex() {
|
| - DCHECK(owning_thread_ref_.is_null());
|
| + int error = pthread_mutex_destroy(&impl_);
|
| + DCHECK(!error) << "pthread_mutex_destroy: " << strerror(error);
|
| }
|
|
|
| -void Mutex::AssertHeld() const {
|
| - DCHECK(owning_thread_ref_ == base::PlatformThread::CurrentRef());
|
| +void Mutex::Lock() MOJO_EXCLUSIVE_LOCK_FUNCTION() {
|
| + int error = pthread_mutex_lock(&impl_);
|
| + DCHECK(!error) << "pthread_mutex_lock: " << strerror(error);
|
| }
|
|
|
| -void Mutex::CheckHeldAndUnmark() {
|
| - DCHECK(owning_thread_ref_ == base::PlatformThread::CurrentRef());
|
| - owning_thread_ref_ = base::PlatformThreadRef();
|
| +void Mutex::Unlock() MOJO_UNLOCK_FUNCTION() {
|
| + int error = pthread_mutex_unlock(&impl_);
|
| + DCHECK(!error) << "pthread_mutex_unlock: " << strerror(error);
|
| }
|
|
|
| -void Mutex::CheckUnheldAndMark() {
|
| - DCHECK(owning_thread_ref_.is_null());
|
| - owning_thread_ref_ = base::PlatformThread::CurrentRef();
|
| +bool Mutex::TryLock() MOJO_EXCLUSIVE_TRYLOCK_FUNCTION(true) {
|
| + int error = pthread_mutex_trylock(&impl_);
|
| + DCHECK(!error || error == EBUSY) << "pthread_mutex_trylock: "
|
| + << strerror(error);
|
| + return !error;
|
| +}
|
| +
|
| +void Mutex::AssertHeld() MOJO_ASSERT_EXCLUSIVE_LOCK() {
|
| + int error = pthread_mutex_lock(&impl_);
|
| + DCHECK_EQ(error, EDEADLK) << ". pthread_mutex_lock: " << strerror(error);
|
| }
|
|
|
| } // namespace system
|
| } // namespace mojo
|
|
|
| -#endif // !NDEBUG || DCHECK_ALWAYS_ON
|
| +#endif // !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
|
|
|