// Copyright 2016 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that can
// be found in the LICENSE file.

#include "libcef/common/waitable_event_impl.h"

#include "include/cef_task.h"

#include "base/time/time.h"

namespace {

bool AllowWait() {
  if (CefCurrentlyOn(TID_UI) || CefCurrentlyOn(TID_IO)) {
    NOTREACHED() << "waiting is not allowed on the current thread";
    return false;
  }
  return true;
}

}  // namespace

// static
CefRefPtr<CefWaitableEvent> CefWaitableEvent::CreateWaitableEvent(
    bool automatic_reset,
    bool initially_signaled) {
  return new CefWaitableEventImpl(automatic_reset, initially_signaled);
}

CefWaitableEventImpl::CefWaitableEventImpl(bool automatic_reset,
                                           bool initially_signaled)
    : event_(automatic_reset ? base::WaitableEvent::ResetPolicy::AUTOMATIC
                             : base::WaitableEvent::ResetPolicy::MANUAL,
             initially_signaled
                 ? base::WaitableEvent::InitialState::SIGNALED
                 : base::WaitableEvent::InitialState::NOT_SIGNALED) {}

void CefWaitableEventImpl::Reset() {
  event_.Reset();
}

void CefWaitableEventImpl::Signal() {
  event_.Signal();
}

bool CefWaitableEventImpl::IsSignaled() {
  return event_.IsSignaled();
}

void CefWaitableEventImpl::Wait() {
  if (!AllowWait())
    return;
  event_.Wait();
}

bool CefWaitableEventImpl::TimedWait(int64 max_ms) {
  if (!AllowWait())
    return false;
  return event_.TimedWait(base::TimeDelta::FromMilliseconds(max_ms));
}
