// Copyright 2020 the V8 project 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 "src/profiler/profiler-stats.h"

#include <algorithm>

#include "src/base/platform/platform.h"

namespace v8 {
namespace internal {

void ProfilerStats::AddReason(Reason reason) {
  counts_[reason].fetch_add(1, std::memory_order_relaxed);
}

void ProfilerStats::Clear() {
  for (int i = 0; i < Reason::kNumberOfReasons; i++) {
    counts_[i].store(0, std::memory_order_relaxed);
  }
}

void ProfilerStats::Print() const {
  base::OS::Print("ProfilerStats:\n");
  for (int i = 0; i < Reason::kNumberOfReasons; i++) {
    base::OS::Print("  %-30s\t\t %d\n", ReasonToString(static_cast<Reason>(i)),
                    counts_[i].load(std::memory_order_relaxed));
  }
}

// static
const char* ProfilerStats::ReasonToString(Reason reason) {
  switch (reason) {
    case kTickBufferFull:
      return "kTickBufferFull";
    case kIsolateNotLocked:
      return "kIsolateNotLocked";
    case kSimulatorFillRegistersFailed:
      return "kSimulatorFillRegistersFailed";
    case kNoFrameRegion:
      return "kNoFrameRegion";
    case kInCallOrApply:
      return "kInCallOrApply";
    case kNoSymbolizedFrames:
      return "kNoSymbolizedFrames";
    case kNullPC:
      return "kNullPC";
    case kNumberOfReasons:
      return "kNumberOfReasons";
  }
  UNREACHABLE();
}

}  // namespace internal
}  // namespace v8
