1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_V8_PLATFORM_H_
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_V8_PLATFORM_H_
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include <stddef.h>
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <stdint.h>
10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include <memory>
11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include <string>
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Isolate;
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * A Task represents a unit of work.
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Task {
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual ~Task() = default;
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Run() = 0;
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch/**
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * An IdleTask represents a unit of work to be performed in idle time.
29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * The Run method is invoked with an argument that specifies the deadline in
30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * seconds returned by MonotonicallyIncreasingTime().
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * The idle task is expected to complete by this deadline.
32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass IdleTask {
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual ~IdleTask() = default;
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual void Run(double deadline_in_seconds) = 0;
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/**
40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * The interface represents complex arguments to trace events.
41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */
42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ConvertableToTraceFormat {
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public:
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual ~ConvertableToTraceFormat() = default;
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  /**
47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * Append the class info to the provided |out| string. The appended
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * data must be a valid JSON object. Strings must be properly quoted, and
49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * escaped. There is no processing applied to the content after it is
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * appended.
51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   */
52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual void AppendAsTraceFormat(std::string* out) const = 0;
53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/**
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * V8 Platform abstraction layer.
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * The embedder has to provide an implementation of this interface before
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * initializing the rest of V8.
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Platform {
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  /**
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * This enum is used to indicate whether a task is potentially long running,
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * or causes a long wait. The embedder might want to use this hint to decide
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * whether to execute the task on a dedicated thread.
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   */
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum ExpectedRuntime {
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kShortRunningTask,
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kLongRunningTask
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual ~Platform() = default;
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  /**
76109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch   * Gets the number of threads that are used to execute background tasks. Is
77109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch   * used to estimate the number of tasks a work package should be split into.
78109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch   * A return value of 0 means that there are no background threads available.
79109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch   * Note that a value of 0 won't prohibit V8 from posting tasks using
80109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch   * |CallOnBackgroundThread|.
81109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch   */
82109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  virtual size_t NumberOfAvailableBackgroundThreads() { return 0; }
83109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
84109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  /**
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * Schedules a task to be invoked on a background thread. |expected_runtime|
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * indicates that the task will run a long time. The Platform implementation
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * takes ownership of |task|. There is no guarantee about order of execution
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * of tasks wrt order of scheduling, nor is there a guarantee about the
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * thread the task will be run on.
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   */
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void CallOnBackgroundThread(Task* task,
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      ExpectedRuntime expected_runtime) = 0;
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  /**
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * Schedules a task to be invoked on a foreground thread wrt a specific
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * |isolate|. Tasks posted for the same isolate should be execute in order of
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   * scheduling. The definition of "foreground" is opaque to V8.
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   */
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void CallOnForegroundThread(Isolate* isolate, Task* task) = 0;
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  /**
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Schedules a task to be invoked on a foreground thread wrt a specific
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * |isolate| after the given number of seconds |delay_in_seconds|.
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Tasks posted for the same isolate should be execute in order of
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * scheduling. The definition of "foreground" is opaque to V8.
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   */
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual void CallDelayedOnForegroundThread(Isolate* isolate, Task* task,
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             double delay_in_seconds) = 0;
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /**
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Schedules a task to be invoked on a foreground thread wrt a specific
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * |isolate| when the embedder is idle.
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Requires that SupportsIdleTasks(isolate) is true.
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Idle tasks may be reordered relative to other task types and may be
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * starved for an arbitrarily long time if no idle time is available.
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * The definition of "foreground" is opaque to V8.
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   */
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual void CallIdleOnForegroundThread(Isolate* isolate, IdleTask* task) {
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // TODO(ulan): Make this function abstract after V8 roll in Chromium.
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /**
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Returns true if idle tasks are enabled for the given |isolate|.
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   */
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual bool IdleTasksEnabled(Isolate* isolate) {
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // TODO(ulan): Make this function abstract after V8 roll in Chromium.
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return false;
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /**
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier   * Monotonically increasing time in seconds from an arbitrary fixed point in
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier   * the past. This function is expected to return at least
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier   * millisecond-precision values. For this reason,
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier   * it is recommended that the fixed point be no further in the past than
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier   * the epoch.
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier   **/
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual double MonotonicallyIncreasingTime() = 0;
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /**
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Called by TRACE_EVENT* macros, don't call this directly.
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * The name parameter is a category group for example:
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * TRACE_EVENT0("v8,parse", "V8.Parse")
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * The pointer returned points to a value with zero or more of the bits
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * defined in CategoryGroupEnabledFlags.
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   **/
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static uint8_t no = 0;
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &no;
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /**
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Gets the category group name of the given category_enabled_flag pointer.
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Usually used while serliazing TRACE_EVENTs.
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   **/
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual const char* GetCategoryGroupName(
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      const uint8_t* category_enabled_flag) {
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const char dummy[] = "dummy";
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return dummy;
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /**
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Adds a trace event to the platform tracing system. This function call is
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * usually the result of a TRACE_* macro from trace_event_common.h when
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * tracing and the category of the particular trace are enabled. It is not
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * advisable to call this function on its own; it is really only meant to be
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * used by the trace macros. The returned handle can be used by
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * UpdateTraceEventDuration to update the duration of COMPLETE events.
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   */
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual uint64_t AddTraceEvent(
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      char phase, const uint8_t* category_enabled_flag, const char* name,
1713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      const char** arg_names, const uint8_t* arg_types,
1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      const uint64_t* arg_values, unsigned int flags) {
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return 0;
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  /**
178f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * Adds a trace event to the platform tracing system. This function call is
179f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * usually the result of a TRACE_* macro from trace_event_common.h when
180f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * tracing and the category of the particular trace are enabled. It is not
181f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * advisable to call this function on its own; it is really only meant to be
182f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * used by the trace macros. The returned handle can be used by
183f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   * UpdateTraceEventDuration to update the duration of COMPLETE events.
184f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   */
185f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual uint64_t AddTraceEvent(
186f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      char phase, const uint8_t* category_enabled_flag, const char* name,
187f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
188f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      const char** arg_names, const uint8_t* arg_types,
189f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      const uint64_t* arg_values,
190f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
191f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      unsigned int flags) {
192f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return AddTraceEvent(phase, category_enabled_flag, name, scope, id, bind_id,
193f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                         num_args, arg_names, arg_types, arg_values, flags);
194f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
195f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
196f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  /**
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * Sets the duration field of a COMPLETE trace event. It must be called with
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   * the handle returned from AddTraceEvent().
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   **/
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        const char* name, uint64_t handle) {}
202f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
203f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  class TraceStateObserver {
204f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch   public:
205f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    virtual ~TraceStateObserver() = default;
206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    virtual void OnTraceEnabled() = 0;
207f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    virtual void OnTraceDisabled() = 0;
208f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  };
209f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
210f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  /** Adds tracing state change observer. */
211f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual void AddTraceStateObserver(TraceStateObserver*) {}
212f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
213f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  /** Removes tracing state change observer. */
214f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual void RemoveTraceStateObserver(TraceStateObserver*) {}
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_V8_PLATFORM_H_
220