// 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:
    case TimelineEvent::kAsyncBegin: {
      _os_signpost_emit_with_name_impl(&__dso_handle, log,
                                       OS_SIGNPOST_INTERVAL_BEGIN, event->Id(),
                                       label, "", buffer, sizeof(buffer));
      break;
    }
    case TimelineEvent::kEnd:
    case TimelineEvent::kAsyncEnd: {
      _os_signpost_emit_with_name_impl(&__dso_handle, log,
                                       OS_SIGNPOST_INTERVAL_END, event->Id(),
                                       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,
                                       OS_SIGNPOST_ID_EXCLUSIVE, 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)
