5 #ifndef V8_LIBPLATFORM_V8_TRACING_H_
6 #define V8_LIBPLATFORM_V8_TRACING_H_
11 #include <unordered_set>
18 namespace trace_processor {
19 class TraceProcessorStorage;
33 class TraceEventListener;
51 char phase,
const uint8_t* category_enabled_flag,
const char* name,
52 const char* scope, uint64_t
id, uint64_t bind_id,
int num_args,
53 const char** arg_names,
const uint8_t* arg_types,
54 const uint64_t* arg_values,
55 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
56 unsigned int flags, int64_t timestamp, int64_t cpu_timestamp);
57 void UpdateDuration(int64_t timestamp, int64_t cpu_timestamp);
58 void InitializeForTesting(
59 char phase,
const uint8_t* category_enabled_flag,
const char* name,
60 const char* scope, uint64_t
id, uint64_t bind_id,
int num_args,
61 const char** arg_names,
const uint8_t* arg_types,
62 const uint64_t* arg_values,
63 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
64 unsigned int flags,
int pid,
int tid, int64_t ts, int64_t tts,
65 uint64_t duration, uint64_t cpu_duration);
67 int pid()
const {
return pid_; }
68 int tid()
const {
return tid_; }
69 char phase()
const {
return phase_; }
71 return category_enabled_flag_;
73 const char*
name()
const {
return name_; }
74 const char*
scope()
const {
return scope_; }
75 uint64_t
id()
const {
return id_; }
76 uint64_t
bind_id()
const {
return bind_id_; }
82 return arg_convertables_;
84 unsigned int flags()
const {
return flags_; }
85 int64_t
ts() {
return ts_; }
86 int64_t
tts() {
return tts_; }
96 const uint8_t* category_enabled_flag_;
103 std::unique_ptr<v8::ConvertableToTraceFormat>
105 char* parameter_copy_storage_ =
nullptr;
110 uint64_t cpu_duration_;
121 virtual void AppendTraceEvent(
TraceObject* trace_event) = 0;
122 virtual void Flush() = 0;
124 static TraceWriter* CreateJSONTraceWriter(std::ostream& stream);
125 static TraceWriter* CreateJSONTraceWriter(std::ostream& stream,
126 const std::string& tag);
138 void Reset(uint32_t new_seq);
139 bool IsFull()
const {
return next_free_ == kChunkSize; }
143 uint32_t
seq()
const {
return seq_; }
144 size_t size()
const {
return next_free_; }
146 static const size_t kChunkSize = 64;
149 size_t next_free_ = 0;
163 virtual TraceObject* AddTraceEvent(uint64_t* handle) = 0;
164 virtual TraceObject* GetEventByHandle(uint64_t handle) = 0;
165 virtual bool Flush() = 0;
167 static const size_t kRingBufferChunks = 1024;
169 static TraceBuffer* CreateTraceBufferRingBuffer(
size_t max_chunks,
200 TraceConfig() : enable_systrace_(false), enable_argument_filter_(false) {}
203 return included_categories_;
212 void AddIncludedCategory(
const char* included_category);
214 bool IsCategoryGroupEnabled(
const char* category_group)
const;
218 bool enable_systrace_ : 1;
219 bool enable_argument_filter_ : 1;
220 StringList included_categories_;
227 #if defined(_MSC_VER)
228 #define V8_PLATFORM_NON_EXPORTED_BASE(code) \
229 __pragma(warning(suppress : 4275)) code
231 #define V8_PLATFORM_NON_EXPORTED_BASE(code) code
232 #endif // defined(_MSC_VER)
240 #if defined(V8_USE_PERFETTO)
243 void InitializeForPerfetto(std::ostream* output_stream);
246 void SetTraceEventListenerForTesting(TraceEventListener* listener);
247 #else // defined(V8_USE_PERFETTO)
254 ENABLED_FOR_RECORDING = 1 << 0,
256 ENABLED_FOR_EVENT_CALLBACK = 1 << 2,
258 ENABLED_FOR_ETW_EXPORT = 1 << 3
265 const uint8_t* GetCategoryGroupEnabled(
const char* category_group)
override;
266 uint64_t AddTraceEvent(
267 char phase,
const uint8_t* category_enabled_flag,
const char* name,
268 const char* scope, uint64_t
id, uint64_t bind_id, int32_t num_args,
269 const char** arg_names,
const uint8_t* arg_types,
270 const uint64_t* arg_values,
271 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
272 unsigned int flags)
override;
273 uint64_t AddTraceEventWithTimestamp(
274 char phase,
const uint8_t* category_enabled_flag,
const char* name,
275 const char* scope, uint64_t
id, uint64_t bind_id, int32_t num_args,
276 const char** arg_names,
const uint8_t* arg_types,
277 const uint64_t* arg_values,
278 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
279 unsigned int flags, int64_t timestamp)
override;
280 void UpdateTraceEventDuration(
const uint8_t* category_enabled_flag,
281 const char* name, uint64_t handle)
override;
283 static const char* GetCategoryGroupName(
const uint8_t* category_enabled_flag);
284 #endif // !defined(V8_USE_PERFETTO)
286 void AddTraceStateObserver(
288 void RemoveTraceStateObserver(
295 #if !defined(V8_USE_PERFETTO)
296 virtual int64_t CurrentTimestampMicroseconds();
297 virtual int64_t CurrentCpuTimestampMicroseconds();
298 #endif // !defined(V8_USE_PERFETTO)
301 #if !defined(V8_USE_PERFETTO)
302 void UpdateCategoryGroupEnabledFlag(
size_t category_index);
303 void UpdateCategoryGroupEnabledFlags();
304 #endif // !defined(V8_USE_PERFETTO)
306 std::unique_ptr<base::Mutex> mutex_;
307 std::unique_ptr<TraceConfig> trace_config_;
308 std::atomic_bool recording_{
false};
309 std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
311 #if defined(V8_USE_PERFETTO)
312 std::ostream* output_stream_ =
nullptr;
313 std::unique_ptr<perfetto::trace_processor::TraceProcessorStorage>
315 TraceEventListener* listener_for_testing_ =
nullptr;
316 std::unique_ptr<perfetto::TracingSession> tracing_session_;
317 #else // !defined(V8_USE_PERFETTO)
318 std::unique_ptr<TraceBuffer> trace_buffer_;
319 #endif // !defined(V8_USE_PERFETTO)
326 #undef V8_PLATFORM_NON_EXPORTED_BASE
332 #endif // V8_LIBPLATFORM_V8_TRACING_H_