5#ifndef V8_LIBPLATFORM_V8_TRACING_H_
6#define V8_LIBPLATFORM_V8_TRACING_H_
11#include <unordered_set>
18namespace trace_processor {
19class TraceProcessorStorage;
33class TraceEventListener;
50 char phase,
const uint8_t* category_enabled_flag,
const char* name,
51 const char* scope, uint64_t
id, uint64_t bind_id,
int num_args,
52 const char** arg_names,
const uint8_t* arg_types,
53 const uint64_t* arg_values,
54 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
55 unsigned int flags, int64_t timestamp, int64_t cpu_timestamp);
58 char phase,
const uint8_t* category_enabled_flag,
const char* name,
59 const char* scope, uint64_t
id, uint64_t bind_id,
int num_args,
60 const char** arg_names,
const uint8_t* arg_types,
61 const uint64_t* arg_values,
62 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
63 unsigned int flags,
int pid,
int tid, int64_t ts, int64_t tts,
64 uint64_t duration, uint64_t cpu_duration);
66 int pid()
const {
return pid_; }
67 int tid()
const {
return tid_; }
68 char phase()
const {
return phase_; }
70 return category_enabled_flag_;
72 const char*
name()
const {
return name_; }
73 const char*
scope()
const {
return scope_; }
74 uint64_t
id()
const {
return id_; }
75 uint64_t
bind_id()
const {
return bind_id_; }
81 return arg_convertables_;
83 unsigned int flags()
const {
return flags_; }
84 int64_t
ts() {
return ts_; }
85 int64_t
tts() {
return tts_; }
95 const uint8_t* category_enabled_flag_;
102 std::unique_ptr<v8::ConvertableToTraceFormat>
104 char* parameter_copy_storage_ =
nullptr;
109 uint64_t cpu_duration_;
125 const std::string& tag);
140 bool IsFull()
const {
return next_free_ == kChunkSize; }
144 uint32_t
seq()
const {
return seq_; }
145 size_t size()
const {
return next_free_; }
147 static const size_t kChunkSize = 64;
150 size_t next_free_ = 0;
168 static const size_t kRingBufferChunks = 1024;
201 TraceConfig() : enable_systrace_(false), enable_argument_filter_(false) {}
204 return included_categories_;
219 bool enable_systrace_ : 1;
220 bool enable_argument_filter_ : 1;
229#define V8_PLATFORM_NON_EXPORTED_BASE(code) \
230 __pragma(warning(suppress : 4275)) code
232#define V8_PLATFORM_NON_EXPORTED_BASE(code) code
241#if defined(V8_USE_PERFETTO)
244 void InitializeForPerfetto(std::ostream* output_stream);
247 void SetTraceEventListenerForTesting(TraceEventListener* listener);
255 ENABLED_FOR_RECORDING = 1 << 0,
257 ENABLED_FOR_EVENT_CALLBACK = 1 << 2,
259 ENABLED_FOR_ETW_EXPORT = 1 << 3
268 char phase,
const uint8_t* category_enabled_flag,
const char* name,
269 const char* scope, uint64_t
id, uint64_t bind_id, int32_t num_args,
270 const char** arg_names,
const uint8_t* arg_types,
271 const uint64_t* arg_values,
272 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
273 unsigned int flags)
override;
275 char phase,
const uint8_t* category_enabled_flag,
const char* name,
276 const char* scope, uint64_t
id, uint64_t bind_id, int32_t num_args,
277 const char** arg_names,
const uint8_t* arg_types,
278 const uint64_t* arg_values,
279 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
280 unsigned int flags, int64_t timestamp)
override;
282 const char* name, uint64_t handle)
override;
296#if !defined(V8_USE_PERFETTO)
302#if !defined(V8_USE_PERFETTO)
303 void UpdateCategoryGroupEnabledFlag(
size_t category_index);
304 void UpdateCategoryGroupEnabledFlags();
307 std::unique_ptr<base::Mutex> mutex_;
308 std::unique_ptr<TraceConfig> trace_config_;
309 std::atomic_bool recording_{
false};
310 std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
312#if defined(V8_USE_PERFETTO)
313 std::ostream* output_stream_ =
nullptr;
314 std::unique_ptr<perfetto::trace_processor::TraceProcessorStorage>
316 TraceEventListener* listener_for_testing_ =
nullptr;
317 std::unique_ptr<perfetto::TracingSession> tracing_session_;
319 std::unique_ptr<TraceBuffer> trace_buffer_;
327#undef V8_PLATFORM_NON_EXPORTED_BASE
#define V8_PLATFORM_NON_EXPORTED_BASE(code)