V8  latest master commit
V8 is Google's open source JavaScript engine
v8-platform.h
Go to the documentation of this file.
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 <stdlib.h> // For abort.
11 #include <memory>
12 #include <string>
13 
14 #include "v8config.h" // NOLINT(build/include_directory)
15 
16 namespace v8 {
17 
18 class Isolate;
19 
20 // Valid priorities supported by the task scheduling infrastructure.
21 enum class TaskPriority : uint8_t {
40 };
41 
45 class Task {
46  public:
47  virtual ~Task() = default;
48 
49  virtual void Run() = 0;
50 };
51 
58 class IdleTask {
59  public:
60  virtual ~IdleTask() = default;
61  virtual void Run(double deadline_in_seconds) = 0;
62 };
63 
70 class TaskRunner {
71  public:
76  virtual void PostTask(std::unique_ptr<Task> task) = 0;
77 
85  virtual void PostNonNestableTask(std::unique_ptr<Task> task) {}
86 
92  virtual void PostDelayedTask(std::unique_ptr<Task> task,
93  double delay_in_seconds) = 0;
94 
103  virtual void PostNonNestableDelayedTask(std::unique_ptr<Task> task,
104  double delay_in_seconds) {}
105 
114  virtual void PostIdleTask(std::unique_ptr<IdleTask> task) = 0;
115 
119  virtual bool IdleTasksEnabled() = 0;
120 
124  virtual bool NonNestableTasksEnabled() const { return false; }
125 
129  virtual bool NonNestableDelayedTasksEnabled() const { return false; }
130 
131  TaskRunner() = default;
132  virtual ~TaskRunner() = default;
133 
134  TaskRunner(const TaskRunner&) = delete;
135  TaskRunner& operator=(const TaskRunner&) = delete;
136 };
137 
142 class JobDelegate {
143  public:
149  virtual bool ShouldYield() = 0;
150 
156  virtual void NotifyConcurrencyIncrease() = 0;
157 };
158 
163 class JobHandle {
164  public:
165  virtual ~JobHandle() = default;
166 
172  virtual void NotifyConcurrencyIncrease() = 0;
173 
181  virtual void Join() = 0;
182 
187  virtual void Cancel() = 0;
188 
193  virtual bool IsRunning() = 0;
194 };
195 
199 class JobTask {
200  public:
201  virtual ~JobTask() = default;
202 
203  virtual void Run(JobDelegate* delegate) = 0;
204 
211  virtual size_t GetMaxConcurrency() const = 0;
212 };
213 
218  public:
219  virtual ~ConvertableToTraceFormat() = default;
220 
227  virtual void AppendAsTraceFormat(std::string* out) const = 0;
228 };
229 
236  public:
237  virtual ~TracingController() = default;
238 
239  // In Perfetto mode, trace events are written using Perfetto's Track Event
240  // API directly without going through the embedder. However, it is still
241  // possible to observe tracing being enabled and disabled.
242 #if !defined(V8_USE_PERFETTO)
243 
250  virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
251  static uint8_t no = 0;
252  return &no;
253  }
254 
263  virtual uint64_t AddTraceEvent(
264  char phase, const uint8_t* category_enabled_flag, const char* name,
265  const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
266  const char** arg_names, const uint8_t* arg_types,
267  const uint64_t* arg_values,
268  std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
269  unsigned int flags) {
270  return 0;
271  }
272  virtual uint64_t AddTraceEventWithTimestamp(
273  char phase, const uint8_t* category_enabled_flag, const char* name,
274  const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
275  const char** arg_names, const uint8_t* arg_types,
276  const uint64_t* arg_values,
277  std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
278  unsigned int flags, int64_t timestamp) {
279  return 0;
280  }
281 
286  virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
287  const char* name, uint64_t handle) {}
288 #endif // !defined(V8_USE_PERFETTO)
289 
291  public:
292  virtual ~TraceStateObserver() = default;
293  virtual void OnTraceEnabled() = 0;
294  virtual void OnTraceDisabled() = 0;
295  };
296 
299 
302 };
303 
310  public:
311  virtual ~PageAllocator() = default;
312 
317  virtual size_t AllocatePageSize() = 0;
318 
323  virtual size_t CommitPageSize() = 0;
324 
329  virtual void SetRandomMmapSeed(int64_t seed) = 0;
330 
335  virtual void* GetRandomMmapAddr() = 0;
336 
340  enum Permission {
344  // TODO(hpayer): Remove this flag. Memory should never be rwx.
347  };
348 
352  virtual void* AllocatePages(void* address, size_t length, size_t alignment,
353  Permission permissions) = 0;
354 
358  virtual bool FreePages(void* address, size_t length) = 0;
359 
363  virtual bool ReleasePages(void* address, size_t length,
364  size_t new_length) = 0;
365 
369  virtual bool SetPermissions(void* address, size_t length,
370  Permission permissions) = 0;
371 
377  virtual bool DiscardSystemPages(void* address, size_t size) { return true; }
378 };
379 
386 class Platform {
387  public:
388  virtual ~Platform() = default;
389 
394  // TODO(bbudge) Make this abstract after all embedders implement this.
395  return nullptr;
396  }
397 
405  virtual void OnCriticalMemoryPressure() {
406  // TODO(bbudge) Remove this when embedders override the following method.
407  // See crbug.com/634547.
408  }
409 
419  virtual bool OnCriticalMemoryPressure(size_t length) { return false; }
420 
428  virtual int NumberOfWorkerThreads() = 0;
429 
435  virtual std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
436  Isolate* isolate) = 0;
437 
441  virtual void CallOnWorkerThread(std::unique_ptr<Task> task) = 0;
442 
447  virtual void CallBlockingTaskOnWorkerThread(std::unique_ptr<Task> task) {
448  // Embedders may optionally override this to process these tasks in a high
449  // priority pool.
450  CallOnWorkerThread(std::move(task));
451  }
452 
456  virtual void CallLowPriorityTaskOnWorkerThread(std::unique_ptr<Task> task) {
457  // Embedders may optionally override this to process these tasks in a low
458  // priority pool.
459  CallOnWorkerThread(std::move(task));
460  }
461 
466  virtual void CallDelayedOnWorkerThread(std::unique_ptr<Task> task,
467  double delay_in_seconds) = 0;
468 
472  virtual bool IdleTasksEnabled(Isolate* isolate) { return false; }
473 
527  virtual std::unique_ptr<JobHandle> PostJob(
528  TaskPriority priority, std::unique_ptr<JobTask> job_task) {
529  return nullptr;
530  }
531 
539  virtual double MonotonicallyIncreasingTime() = 0;
540 
545  virtual double CurrentClockTimeMillis() = 0;
546 
547  typedef void (*StackTracePrinter)();
548 
553  virtual StackTracePrinter GetStackTracePrinter() { return nullptr; }
554 
559 
564  virtual void DumpWithoutCrashing() {}
565 
566  protected:
572  V8_EXPORT static double SystemClockTimeMillis();
573 };
574 
575 } // namespace v8
576 
577 #endif // V8_V8_PLATFORM_H_
v8::PageAllocator::SetRandomMmapSeed
virtual void SetRandomMmapSeed(int64_t seed)=0
v8::PageAllocator::kNoAccess
@ kNoAccess
Definition: v8-platform.h:341
v8::JobDelegate::ShouldYield
virtual bool ShouldYield()=0
v8::TaskPriority::kUserBlocking
@ kUserBlocking
v8::JobTask::Run
virtual void Run(JobDelegate *delegate)=0
v8::IdleTask
Definition: v8-platform.h:58
v8::JobHandle::~JobHandle
virtual ~JobHandle()=default
v8::TracingController::~TracingController
virtual ~TracingController()=default
v8::TaskRunner::PostNonNestableDelayedTask
virtual void PostNonNestableDelayedTask(std::unique_ptr< Task > task, double delay_in_seconds)
Definition: v8-platform.h:103
v8::PageAllocator
Definition: v8-platform.h:309
v8::Platform::CurrentClockTimeMillis
virtual double CurrentClockTimeMillis()=0
v8::TaskRunner::~TaskRunner
virtual ~TaskRunner()=default
v8::PageAllocator::kReadWrite
@ kReadWrite
Definition: v8-platform.h:343
v8::Platform::GetTracingController
virtual TracingController * GetTracingController()=0
v8::TaskRunner::PostDelayedTask
virtual void PostDelayedTask(std::unique_ptr< Task > task, double delay_in_seconds)=0
v8::PageAllocator::SetPermissions
virtual bool SetPermissions(void *address, size_t length, Permission permissions)=0
v8::JobTask::~JobTask
virtual ~JobTask()=default
v8::PageAllocator::ReleasePages
virtual bool ReleasePages(void *address, size_t length, size_t new_length)=0
v8::Platform::GetStackTracePrinter
virtual StackTracePrinter GetStackTracePrinter()
Definition: v8-platform.h:553
v8::Platform::GetPageAllocator
virtual PageAllocator * GetPageAllocator()
Definition: v8-platform.h:393
v8::PageAllocator::CommitPageSize
virtual size_t CommitPageSize()=0
v8::JobHandle::NotifyConcurrencyIncrease
virtual void NotifyConcurrencyIncrease()=0
v8::PageAllocator::AllocatePages
virtual void * AllocatePages(void *address, size_t length, size_t alignment, Permission permissions)=0
v8::TaskRunner::PostIdleTask
virtual void PostIdleTask(std::unique_ptr< IdleTask > task)=0
v8::Platform::SystemClockTimeMillis
static V8_EXPORT double SystemClockTimeMillis()
v8::TracingController::TraceStateObserver
Definition: v8-platform.h:290
v8::Task::~Task
virtual ~Task()=default
v8::TaskPriority::kBestEffort
@ kBestEffort
v8::JobHandle::Join
virtual void Join()=0
v8::TaskRunner::operator=
TaskRunner & operator=(const TaskRunner &)=delete
v8::TracingController::TraceStateObserver::~TraceStateObserver
virtual ~TraceStateObserver()=default
v8::TaskPriority
TaskPriority
Definition: v8-platform.h:21
v8::TaskRunner::TaskRunner
TaskRunner()=default
v8::JobHandle::IsRunning
virtual bool IsRunning()=0
v8config.h
V8_EXPORT
#define V8_EXPORT
Definition: v8config.h:467
v8::TracingController::AddTraceEvent
virtual uint64_t 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)
Definition: v8-platform.h:263
v8::JobDelegate::NotifyConcurrencyIncrease
virtual void NotifyConcurrencyIncrease()=0
v8::TracingController
Definition: v8-platform.h:235
v8::TaskRunner::NonNestableDelayedTasksEnabled
virtual bool NonNestableDelayedTasksEnabled() const
Definition: v8-platform.h:129
v8::TracingController::TraceStateObserver::OnTraceDisabled
virtual void OnTraceDisabled()=0
v8::PageAllocator::GetRandomMmapAddr
virtual void * GetRandomMmapAddr()=0
v8::TaskRunner::NonNestableTasksEnabled
virtual bool NonNestableTasksEnabled() const
Definition: v8-platform.h:124
v8::Isolate
Definition: v8.h:8129
v8::Platform::IdleTasksEnabled
virtual bool IdleTasksEnabled(Isolate *isolate)
Definition: v8-platform.h:472
v8::TaskPriority::kUserVisible
@ kUserVisible
v8::Platform::OnCriticalMemoryPressure
virtual bool OnCriticalMemoryPressure(size_t length)
Definition: v8-platform.h:419
v8::Platform::~Platform
virtual ~Platform()=default
v8::TaskRunner::PostTask
virtual void PostTask(std::unique_ptr< Task > task)=0
v8::PageAllocator::kRead
@ kRead
Definition: v8-platform.h:342
v8::JobTask
Definition: v8-platform.h:199
v8::PageAllocator::kReadExecute
@ kReadExecute
Definition: v8-platform.h:346
v8::TracingController::TraceStateObserver::OnTraceEnabled
virtual void OnTraceEnabled()=0
v8::Platform::CallOnWorkerThread
virtual void CallOnWorkerThread(std::unique_ptr< Task > task)=0
v8
Definition: libplatform.h:15
v8::Platform::CallLowPriorityTaskOnWorkerThread
virtual void CallLowPriorityTaskOnWorkerThread(std::unique_ptr< Task > task)
Definition: v8-platform.h:456
v8::PageAllocator::Permission
Permission
Definition: v8-platform.h:340
v8::PageAllocator::~PageAllocator
virtual ~PageAllocator()=default
v8::ConvertableToTraceFormat::AppendAsTraceFormat
virtual void AppendAsTraceFormat(std::string *out) const =0
v8::IdleTask::~IdleTask
virtual ~IdleTask()=default
v8::TaskRunner::IdleTasksEnabled
virtual bool IdleTasksEnabled()=0
v8::Platform::MonotonicallyIncreasingTime
virtual double MonotonicallyIncreasingTime()=0
v8::TracingController::AddTraceStateObserver
virtual void AddTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:298
v8::TaskRunner::PostNonNestableTask
virtual void PostNonNestableTask(std::unique_ptr< Task > task)
Definition: v8-platform.h:85
v8::JobHandle
Definition: v8-platform.h:163
v8::TracingController::RemoveTraceStateObserver
virtual void RemoveTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:301
v8::Platform
Definition: v8-platform.h:386
v8::Task
Definition: v8-platform.h:45
v8::Platform::CallDelayedOnWorkerThread
virtual void CallDelayedOnWorkerThread(std::unique_ptr< Task > task, double delay_in_seconds)=0
v8::JobTask::GetMaxConcurrency
virtual size_t GetMaxConcurrency() const =0
v8::Platform::PostJob
virtual std::unique_ptr< JobHandle > PostJob(TaskPriority priority, std::unique_ptr< JobTask > job_task)
Definition: v8-platform.h:527
v8::ConvertableToTraceFormat
Definition: v8-platform.h:217
v8::Platform::GetForegroundTaskRunner
virtual std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(Isolate *isolate)=0
v8::JobHandle::Cancel
virtual void Cancel()=0
v8::TaskRunner
Definition: v8-platform.h:70
v8::PageAllocator::AllocatePageSize
virtual size_t AllocatePageSize()=0
v8::PageAllocator::DiscardSystemPages
virtual bool DiscardSystemPages(void *address, size_t size)
Definition: v8-platform.h:377
v8::TracingController::AddTraceEventWithTimestamp
virtual uint64_t AddTraceEventWithTimestamp(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, int64_t timestamp)
Definition: v8-platform.h:272
v8::Task::Run
virtual void Run()=0
v8::JobDelegate
Definition: v8-platform.h:142
v8::Platform::StackTracePrinter
void(* StackTracePrinter)()
Definition: v8-platform.h:547
v8::Platform::DumpWithoutCrashing
virtual void DumpWithoutCrashing()
Definition: v8-platform.h:564
v8::TracingController::GetCategoryGroupEnabled
virtual const uint8_t * GetCategoryGroupEnabled(const char *name)
Definition: v8-platform.h:250
v8::PageAllocator::FreePages
virtual bool FreePages(void *address, size_t length)=0
v8::Platform::NumberOfWorkerThreads
virtual int NumberOfWorkerThreads()=0
v8::TracingController::UpdateTraceEventDuration
virtual void UpdateTraceEventDuration(const uint8_t *category_enabled_flag, const char *name, uint64_t handle)
Definition: v8-platform.h:286
v8::Platform::CallBlockingTaskOnWorkerThread
virtual void CallBlockingTaskOnWorkerThread(std::unique_ptr< Task > task)
Definition: v8-platform.h:447
v8::ConvertableToTraceFormat::~ConvertableToTraceFormat
virtual ~ConvertableToTraceFormat()=default
v8::Platform::OnCriticalMemoryPressure
virtual void OnCriticalMemoryPressure()
Definition: v8-platform.h:405
v8::IdleTask::Run
virtual void Run(double deadline_in_seconds)=0
v8::PageAllocator::kReadWriteExecute
@ kReadWriteExecute
Definition: v8-platform.h:345