|  | // Copyright (c) 2024, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | #include "platform/globals.h"  // NOLINT | 
|  |  | 
|  | #if defined(DART_USE_ABSL) | 
|  |  | 
|  | #include "platform/synchronization.h" | 
|  |  | 
|  | #include "platform/assert.h" | 
|  | #include "platform/utils.h" | 
|  |  | 
|  | namespace dart { | 
|  |  | 
|  | Mutex::Mutex() {} | 
|  |  | 
|  | Mutex::~Mutex() {} | 
|  |  | 
|  | ABSL_NO_THREAD_SAFETY_ANALYSIS | 
|  | void Mutex::Lock() { | 
|  | mutex_.Lock(); | 
|  | owner_.Acquire(); | 
|  | } | 
|  |  | 
|  | ABSL_NO_THREAD_SAFETY_ANALYSIS | 
|  | bool Mutex::TryLock() { | 
|  | if (!mutex_.TryLock()) { | 
|  | return false; | 
|  | } | 
|  | owner_.Acquire(); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | ABSL_NO_THREAD_SAFETY_ANALYSIS | 
|  | void Mutex::Unlock() { | 
|  | owner_.Release(); | 
|  | mutex_.Unlock(); | 
|  | } | 
|  |  | 
|  | ConditionVariable::ConditionVariable() {} | 
|  |  | 
|  | ConditionVariable::~ConditionVariable() {} | 
|  |  | 
|  | ABSL_NO_THREAD_SAFETY_ANALYSIS | 
|  | ConditionVariable::WaitResult ConditionVariable::Wait(Mutex* mutex, | 
|  | int64_t timeout_millis) { | 
|  | static_assert(kNoTimeout * kMicrosecondsPerMillisecond == kNoTimeout); | 
|  | return WaitMicros(mutex, timeout_millis * kMicrosecondsPerMillisecond); | 
|  | } | 
|  |  | 
|  | ABSL_NO_THREAD_SAFETY_ANALYSIS | 
|  | ConditionVariable::WaitResult ConditionVariable::WaitMicros( | 
|  | Mutex* mutex, | 
|  | int64_t timeout_micros) { | 
|  | mutex->owner_.Release(); | 
|  | Monitor::WaitResult retval = kNotified; | 
|  | if (timeout_micros == kNoTimeout) { | 
|  | // Wait forever. | 
|  | cv_.Wait(&mutex->mutex_); | 
|  | } else { | 
|  | if (cv_.WaitWithTimeout(&mutex->mutex_, | 
|  | absl::Microseconds(timeout_micros))) { | 
|  | retval = kTimedOut; | 
|  | } | 
|  | } | 
|  | mutex->owner_.Acquire(); | 
|  | return retval; | 
|  | } | 
|  |  | 
|  | ABSL_NO_THREAD_SAFETY_ANALYSIS | 
|  | void ConditionVariable::Notify() { | 
|  | cv_.Signal(); | 
|  | } | 
|  |  | 
|  | ABSL_NO_THREAD_SAFETY_ANALYSIS | 
|  | void ConditionVariable::NotifyAll() { | 
|  | cv_.SignalAll(); | 
|  | } | 
|  |  | 
|  | }  // namespace dart | 
|  |  | 
|  | #endif  // defined(DART_USE_ABSL) |