#ifndef BASE_TRACE_EVENT_TRACE_EVENT_H_
#define BASE_TRACE_EVENT_TRACE_EVENT_H_
#include <stddef.h>
#include <stdint.h>
#include <atomic>
#include <memory>
#include <utility>
#include "base/base_export.h"
#include "base/threading/platform_thread.h"
#include "base/time/time.h"
#include "base/time/time_override.h"
#include "base/trace_event/builtin_categories.h"
#include "base/trace_event/common/trace_event_common.h"
#include "base/trace_event/trace_arguments.h"
#include "base/trace_event/trace_event_impl.h"
#include "base/trace_event/traced_value_support.h"
#include "base/tracing_buildflags.h"
#define TRACE_EVENT_API_ADD_TRACE_EVENT trace_event_internal::AddTraceEvent
#define TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID \
trace_event_internal::AddTraceEventWithProcessId
#define TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP \
trace_event_internal::AddTraceEventWithThreadIdAndTimestamp
#define TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION \
trace_event_internal::UpdateTraceEventDuration
#define TRACE_EVENT_API_ADD_METADATA_EVENT \
trace_event_internal::AddMetadataEvent
#define TRACE_EVENT_API_ATOMIC_WORD std::atomic<intptr_t>
#define TRACE_EVENT_API_ATOMIC_LOAD(var) (var).load(std::memory_order_acquire)
#define TRACE_EVENT_API_ATOMIC_STORE(var, value) \
(var).store((value), std::memory_order_release)
#define TRACE_EVENT_API_CLASS_EXPORT BASE_EXPORT
namespace trace_event_internal {
const int kZeroNumArgs = 0;
const uint64_t kNoId = 0;
base::trace_event::TraceEventHandle BASE_EXPORT
AddTraceEvent(char phase,
const unsigned char* category_group_enabled,
const char* name,
uint64_t id,
base::trace_event::TraceArguments* args,
unsigned int flags);
base::trace_event::TraceEventHandle BASE_EXPORT
AddTraceEventWithProcessId(char phase,
const unsigned char* category_group_enabled,
const char* name,
uint64_t id,
base::ProcessId process_id,
base::trace_event::TraceArguments* args,
unsigned int flags);
base::trace_event::TraceEventHandle BASE_EXPORT
AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
uint64_t id,
base::PlatformThreadId thread_id,
const base::TimeTicks& timestamp,
base::trace_event::TraceArguments* args,
unsigned int flags);
base::trace_event::TraceEventHandle BASE_EXPORT
AddTraceEventWithThreadIdAndTimestamps(
char phase,
const unsigned char* category_group_enabled,
const char* name,
uint64_t id,
base::PlatformThreadId thread_id,
const base::TimeTicks& timestamp,
unsigned int flags);
void BASE_EXPORT
UpdateTraceEventDuration(const unsigned char* category_group_enabled,
const char* name,
base::trace_event::TraceEventHandle handle);
}
namespace base {
namespace trace_event {
template <typename IDType, const char* category>
class TraceScopedTrackableObject {
public:
TraceScopedTrackableObject(const char* name, IDType id)
: name_(name), id_(id) {
TRACE_EVENT_OBJECT_CREATED_WITH_ID(category, name_, id_);
}
TraceScopedTrackableObject(const TraceScopedTrackableObject&) = delete;
TraceScopedTrackableObject& operator=(const TraceScopedTrackableObject&) =
delete;
template <typename ArgType>
void snapshot(ArgType snapshot) {
TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(category, name_, id_, snapshot);
}
~TraceScopedTrackableObject() {
TRACE_EVENT_OBJECT_DELETED_WITH_ID(category, name_, id_);
}
private:
const char* name_;
IDType id_;
};
template <class TrackType>
class TrackRegistration {
public:
explicit TrackRegistration(const TrackType& track) : track_(track) {
if (perfetto::Tracing::IsInitialized()) {
base::TrackEvent::SetTrackDescriptor(track, track.Serialize());
}
}
~TrackRegistration() {
if (perfetto::Tracing::IsInitialized()) {
base::TrackEvent::EraseTrackDescriptor(track_);
}
}
TrackRegistration(const TrackRegistration&) = delete;
TrackRegistration& operator=(const TrackRegistration&) = delete;
const TrackType& operator*() const { return track_; }
const TrackType& track() const { return track_; }
private:
TrackType track_;
};
}
}
#if BUILDFLAG(IS_ARKWEB) && BUILDFLAG(ARKWEB_DFX_TRACING)
#include "arkweb/chromium_ext/base/trace_event/trace_event_oh.h"
#endif
#endif