// Copyright (c) 2020, 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 "vm/globals.h"
#if defined(DART_HOST_OS_MACOS) && defined(SUPPORT_TIMELINE)

#include "vm/log.h"
#include "vm/timeline.h"

namespace dart {

// Only available on iOS 12.0, macOS 10.14 or above
TimelineEventMacosRecorder::TimelineEventMacosRecorder()
    : TimelineEventPlatformRecorder() {
  Timeline::set_recorder_discards_clock_values(true);
}

TimelineEventMacosRecorder::~TimelineEventMacosRecorder() {}

void TimelineEventMacosRecorder::OnEvent(TimelineEvent* event) {
  if (event == NULL) {
    return;
  }

#if defined(DART_HOST_OS_SUPPORTS_SIGNPOST)
  os_log_t log = event->stream_->macos_log();
  if (!os_signpost_enabled(log)) {
    return;
  }

  const char* label = event->label();
  uint8_t _Alignas(16) buffer[64];
  buffer[0] = 0;

  switch (event->event_type()) {
    case TimelineEvent::kInstant: {
      _os_signpost_emit_with_name_impl(&__dso_handle, log, OS_SIGNPOST_EVENT,
                                       OS_SIGNPOST_ID_EXCLUSIVE, label, "",
                                       buffer, sizeof(buffer));
      break;
    }
    case TimelineEvent::kBegin: {
      _os_signpost_emit_with_name_impl(
          &__dso_handle, log, OS_SIGNPOST_INTERVAL_BEGIN,
          OS_SIGNPOST_ID_EXCLUSIVE, label, "", buffer, sizeof(buffer));
      break;
    }
    case TimelineEvent::kEnd: {
      _os_signpost_emit_with_name_impl(
          &__dso_handle, log, OS_SIGNPOST_INTERVAL_END,
          OS_SIGNPOST_ID_EXCLUSIVE, label, "", buffer, sizeof(buffer));
      break;
    }
    case TimelineEvent::kAsyncBegin: {
      _os_signpost_emit_with_name_impl(
          &__dso_handle, log, OS_SIGNPOST_INTERVAL_BEGIN, event->AsyncId(),
          label, "", buffer, sizeof(buffer));
      break;
    }
    case TimelineEvent::kAsyncEnd: {
      _os_signpost_emit_with_name_impl(
          &__dso_handle, log, OS_SIGNPOST_INTERVAL_END, event->AsyncId(), label,
          "", buffer, sizeof(buffer));
      break;
    }
    case TimelineEvent::kCounter: {
      const char* fmt = "%s";
      Utils::SNPrint(reinterpret_cast<char*>(buffer), sizeof(buffer), fmt,
                     event->arguments()[0].value);
      _os_signpost_emit_with_name_impl(&__dso_handle, log, OS_SIGNPOST_EVENT,
                                       event->AsyncId(), label, fmt, buffer,
                                       sizeof(buffer));
      break;
    }
    default:
      break;
  }
#endif  // defined(DART_HOST_OS_SUPPORTS_SIGNPOST)
}

}  // namespace dart

#endif  // defined(DART_HOST_OS_MACOS) && defined(SUPPORT_TIMELINE)
