// Copyright 2017 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "absl/synchronization/blocking_counter.h"

#include <atomic>

#include "absl/base/config.h"
#include "absl/base/internal/raw_logging.h"
#include "absl/base/internal/tracing.h"
#include "absl/synchronization/mutex.h"

namespace absl {
ABSL_NAMESPACE_BEGIN

namespace {

// Return whether int *arg is true.
bool IsDone(void *arg) { return *reinterpret_cast<bool *>(arg); }

}  // namespace

BlockingCounter::BlockingCounter(int initial_count)
    : count_(initial_count),
      num_waiting_(0),
      done_{initial_count == 0 ? true : false} {
  ABSL_RAW_CHECK(initial_count >= 0, "BlockingCounter initial_count negative");
}

bool BlockingCounter::DecrementCount() {
  int count = count_.fetch_sub(1, std::memory_order_acq_rel) - 1;
  ABSL_RAW_CHECK(count >= 0,
                 "BlockingCounter::DecrementCount() called too many times");
  if (count == 0) {
    base_internal::TraceSignal(this, TraceObjectKind());
    MutexLock l(lock_);
    done_ = true;
    return true;
  }
  return false;
}

void BlockingCounter::Wait() {
  base_internal::TraceWait(this, TraceObjectKind());
  {
    MutexLock l(this->lock_);

    // only one thread may call Wait(). To support more than one thread,
    // implement a counter num_to_exit, like in the Barrier class.
    ABSL_RAW_CHECK(num_waiting_ == 0, "multiple threads called Wait()");
    num_waiting_++;

    this->lock_.Await(Condition(IsDone, &this->done_));

    // At this point, we know that all threads executing DecrementCount
    // will not touch this object again.
    // Therefore, the thread calling this method is free to delete the object
    // after we return from this method.
  }
  base_internal::TraceContinue(this, TraceObjectKind());
}

ABSL_NAMESPACE_END
}  // namespace absl
