• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_V8_PLATFORM_H_
6 #define V8_V8_PLATFORM_H_
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 #include <memory>
11 #include <string>
12 
13 namespace v8 {
14 
15 class Isolate;
16 
17 /**
18  * A Task represents a unit of work.
19  */
20 class Task {
21  public:
22   virtual ~Task() = default;
23 
24   virtual void Run() = 0;
25 };
26 
27 /**
28  * An IdleTask represents a unit of work to be performed in idle time.
29  * The Run method is invoked with an argument that specifies the deadline in
30  * seconds returned by MonotonicallyIncreasingTime().
31  * The idle task is expected to complete by this deadline.
32  */
33 class IdleTask {
34  public:
35   virtual ~IdleTask() = default;
36   virtual void Run(double deadline_in_seconds) = 0;
37 };
38 
39 /**
40  * The interface represents complex arguments to trace events.
41  */
42 class ConvertableToTraceFormat {
43  public:
44   virtual ~ConvertableToTraceFormat() = default;
45 
46   /**
47    * Append the class info to the provided |out| string. The appended
48    * data must be a valid JSON object. Strings must be properly quoted, and
49    * escaped. There is no processing applied to the content after it is
50    * appended.
51    */
52   virtual void AppendAsTraceFormat(std::string* out) const = 0;
53 };
54 
55 /**
56  * V8 Platform abstraction layer.
57  *
58  * The embedder has to provide an implementation of this interface before
59  * initializing the rest of V8.
60  */
61 class Platform {
62  public:
63   /**
64    * This enum is used to indicate whether a task is potentially long running,
65    * or causes a long wait. The embedder might want to use this hint to decide
66    * whether to execute the task on a dedicated thread.
67    */
68   enum ExpectedRuntime {
69     kShortRunningTask,
70     kLongRunningTask
71   };
72 
73   virtual ~Platform() = default;
74 
75   /**
76    * Gets the number of threads that are used to execute background tasks. Is
77    * used to estimate the number of tasks a work package should be split into.
78    * A return value of 0 means that there are no background threads available.
79    * Note that a value of 0 won't prohibit V8 from posting tasks using
80    * |CallOnBackgroundThread|.
81    */
NumberOfAvailableBackgroundThreads()82   virtual size_t NumberOfAvailableBackgroundThreads() { return 0; }
83 
84   /**
85    * Schedules a task to be invoked on a background thread. |expected_runtime|
86    * indicates that the task will run a long time. The Platform implementation
87    * takes ownership of |task|. There is no guarantee about order of execution
88    * of tasks wrt order of scheduling, nor is there a guarantee about the
89    * thread the task will be run on.
90    */
91   virtual void CallOnBackgroundThread(Task* task,
92                                       ExpectedRuntime expected_runtime) = 0;
93 
94   /**
95    * Schedules a task to be invoked on a foreground thread wrt a specific
96    * |isolate|. Tasks posted for the same isolate should be execute in order of
97    * scheduling. The definition of "foreground" is opaque to V8.
98    */
99   virtual void CallOnForegroundThread(Isolate* isolate, Task* task) = 0;
100 
101   /**
102    * Schedules a task to be invoked on a foreground thread wrt a specific
103    * |isolate| after the given number of seconds |delay_in_seconds|.
104    * Tasks posted for the same isolate should be execute in order of
105    * scheduling. The definition of "foreground" is opaque to V8.
106    */
107   virtual void CallDelayedOnForegroundThread(Isolate* isolate, Task* task,
108                                              double delay_in_seconds) = 0;
109 
110   /**
111    * Schedules a task to be invoked on a foreground thread wrt a specific
112    * |isolate| when the embedder is idle.
113    * Requires that SupportsIdleTasks(isolate) is true.
114    * Idle tasks may be reordered relative to other task types and may be
115    * starved for an arbitrarily long time if no idle time is available.
116    * The definition of "foreground" is opaque to V8.
117    */
CallIdleOnForegroundThread(Isolate * isolate,IdleTask * task)118   virtual void CallIdleOnForegroundThread(Isolate* isolate, IdleTask* task) {
119     // TODO(ulan): Make this function abstract after V8 roll in Chromium.
120   }
121 
122   /**
123    * Returns true if idle tasks are enabled for the given |isolate|.
124    */
IdleTasksEnabled(Isolate * isolate)125   virtual bool IdleTasksEnabled(Isolate* isolate) {
126     // TODO(ulan): Make this function abstract after V8 roll in Chromium.
127     return false;
128   }
129 
130   /**
131    * Monotonically increasing time in seconds from an arbitrary fixed point in
132    * the past. This function is expected to return at least
133    * millisecond-precision values. For this reason,
134    * it is recommended that the fixed point be no further in the past than
135    * the epoch.
136    **/
137   virtual double MonotonicallyIncreasingTime() = 0;
138 
139   /**
140    * Called by TRACE_EVENT* macros, don't call this directly.
141    * The name parameter is a category group for example:
142    * TRACE_EVENT0("v8,parse", "V8.Parse")
143    * The pointer returned points to a value with zero or more of the bits
144    * defined in CategoryGroupEnabledFlags.
145    **/
GetCategoryGroupEnabled(const char * name)146   virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
147     static uint8_t no = 0;
148     return &no;
149   }
150 
151   /**
152    * Gets the category group name of the given category_enabled_flag pointer.
153    * Usually used while serliazing TRACE_EVENTs.
154    **/
GetCategoryGroupName(const uint8_t * category_enabled_flag)155   virtual const char* GetCategoryGroupName(
156       const uint8_t* category_enabled_flag) {
157     static const char dummy[] = "dummy";
158     return dummy;
159   }
160 
161   /**
162    * Adds a trace event to the platform tracing system. This function call is
163    * usually the result of a TRACE_* macro from trace_event_common.h when
164    * tracing and the category of the particular trace are enabled. It is not
165    * advisable to call this function on its own; it is really only meant to be
166    * used by the trace macros. The returned handle can be used by
167    * UpdateTraceEventDuration to update the duration of COMPLETE events.
168    */
AddTraceEvent(char phase,const uint8_t * category_enabled_flag,const char * name,const char * scope,uint64_t id,uint64_t bind_id,int32_t num_args,const char ** arg_names,const uint8_t * arg_types,const uint64_t * arg_values,unsigned int flags)169   virtual uint64_t AddTraceEvent(
170       char phase, const uint8_t* category_enabled_flag, const char* name,
171       const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
172       const char** arg_names, const uint8_t* arg_types,
173       const uint64_t* arg_values, unsigned int flags) {
174     return 0;
175   }
176 
177   /**
178    * Adds a trace event to the platform tracing system. This function call is
179    * usually the result of a TRACE_* macro from trace_event_common.h when
180    * tracing and the category of the particular trace are enabled. It is not
181    * advisable to call this function on its own; it is really only meant to be
182    * used by the trace macros. The returned handle can be used by
183    * UpdateTraceEventDuration to update the duration of COMPLETE events.
184    */
AddTraceEvent(char phase,const uint8_t * category_enabled_flag,const char * name,const char * scope,uint64_t id,uint64_t bind_id,int32_t num_args,const char ** arg_names,const uint8_t * arg_types,const uint64_t * arg_values,std::unique_ptr<ConvertableToTraceFormat> * arg_convertables,unsigned int flags)185   virtual uint64_t AddTraceEvent(
186       char phase, const uint8_t* category_enabled_flag, const char* name,
187       const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
188       const char** arg_names, const uint8_t* arg_types,
189       const uint64_t* arg_values,
190       std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
191       unsigned int flags) {
192     return AddTraceEvent(phase, category_enabled_flag, name, scope, id, bind_id,
193                          num_args, arg_names, arg_types, arg_values, flags);
194   }
195 
196   /**
197    * Sets the duration field of a COMPLETE trace event. It must be called with
198    * the handle returned from AddTraceEvent().
199    **/
UpdateTraceEventDuration(const uint8_t * category_enabled_flag,const char * name,uint64_t handle)200   virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
201                                         const char* name, uint64_t handle) {}
202 
203   class TraceStateObserver {
204    public:
205     virtual ~TraceStateObserver() = default;
206     virtual void OnTraceEnabled() = 0;
207     virtual void OnTraceDisabled() = 0;
208   };
209 
210   /** Adds tracing state change observer. */
AddTraceStateObserver(TraceStateObserver *)211   virtual void AddTraceStateObserver(TraceStateObserver*) {}
212 
213   /** Removes tracing state change observer. */
RemoveTraceStateObserver(TraceStateObserver *)214   virtual void RemoveTraceStateObserver(TraceStateObserver*) {}
215 };
216 
217 }  // namespace v8
218 
219 #endif  // V8_V8_PLATFORM_H_
220