#include "util/synchronization/semaphore.h"
#include <errno.h>
#include <math.h>
#include <time.h>
#include <chrono>
#include "base/check_op.h"
#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
#include "build/build_config.h"
#include "util/misc/time.h"
namespace crashpad {
#if BUILDFLAG(IS_ANDROID)
Semaphore::Semaphore(int value) : cv_(), mutex_(), value_(value) {}
Semaphore::~Semaphore() = default;
void Semaphore::Wait() {
std::unique_lock<std::mutex> lock(mutex_);
cv_.wait(lock, [this] { return this->value_ > 0; });
--value_;
}
bool Semaphore::TimedWait(double seconds) {
DCHECK_GE(seconds, 0.0);
if (isinf(seconds)) {
Wait();
return true;
}
std::unique_lock<std::mutex> lock(mutex_);
if (!cv_.wait_for(lock, std::chrono::duration<double>(seconds), [this] {
return this->value_ > 0;
})) {
return false;
}
--value_;
return true;
}
void Semaphore::Signal() {
std::lock_guard<std::mutex> lock(mutex_);
++value_;
cv_.notify_one();
}
#elif !BUILDFLAG(IS_APPLE)
Semaphore::Semaphore(int value) { … }
Semaphore::~Semaphore() { … }
void Semaphore::Wait() { … }
bool Semaphore::TimedWait(double seconds) { … }
void Semaphore::Signal() { … }
#endif
}