Loading...
Searching...
No Matches
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 <math.h>
9#include <stddef.h>
10#include <stdint.h>
11#include <stdlib.h> // For abort.
12
13#include <memory>
14#include <optional>
15#include <string>
16
17#include "v8-source-location.h" // NOLINT(build/include_directory)
18#include "v8config.h" // NOLINT(build/include_directory)
19
20namespace v8 {
21
22class Isolate;
23
24// Valid priorities supported by the task scheduling infrastructure.
25enum class TaskPriority : uint8_t {
45};
46
50class Task {
51 public:
52 virtual ~Task() = default;
53
54 virtual void Run() = 0;
55};
56
63class IdleTask {
64 public:
65 virtual ~IdleTask() = default;
66 virtual void Run(double deadline_in_seconds) = 0;
67};
68
76 public:
83 void PostTask(std::unique_ptr<Task> task,
85 PostTaskImpl(std::move(task), location);
86 }
87
106 std::unique_ptr<Task> task,
108 PostNonNestableTaskImpl(std::move(task), location);
109 }
110
118 void PostDelayedTask(std::unique_ptr<Task> task, double delay_in_seconds,
120 PostDelayedTaskImpl(std::move(task), delay_in_seconds, location);
121 }
122
142 std::unique_ptr<Task> task, double delay_in_seconds,
144 PostNonNestableDelayedTaskImpl(std::move(task), delay_in_seconds, location);
145 }
146
157 void PostIdleTask(std::unique_ptr<IdleTask> task,
159 PostIdleTaskImpl(std::move(task), location);
160 }
161
165 virtual bool IdleTasksEnabled() = 0;
166
170 virtual bool NonNestableTasksEnabled() const { return false; }
171
175 virtual bool NonNestableDelayedTasksEnabled() const { return false; }
176
177 TaskRunner() = default;
178 virtual ~TaskRunner() = default;
179
180 TaskRunner(const TaskRunner&) = delete;
181 TaskRunner& operator=(const TaskRunner&) = delete;
182
183 protected:
187 virtual void PostTaskImpl(std::unique_ptr<Task> task,
188 const SourceLocation& location) {}
189 virtual void PostNonNestableTaskImpl(std::unique_ptr<Task> task,
190 const SourceLocation& location) {}
191 virtual void PostDelayedTaskImpl(std::unique_ptr<Task> task,
192 double delay_in_seconds,
193 const SourceLocation& location) {}
194 virtual void PostNonNestableDelayedTaskImpl(std::unique_ptr<Task> task,
195 double delay_in_seconds,
196 const SourceLocation& location) {}
197 virtual void PostIdleTaskImpl(std::unique_ptr<IdleTask> task,
198 const SourceLocation& location) {}
199};
200
206 public:
213 virtual bool ShouldYield() = 0;
214
220 virtual void NotifyConcurrencyIncrease() = 0;
221
227 virtual uint8_t GetTaskId() = 0;
228
233 virtual bool IsJoiningThread() const = 0;
234};
235
241 public:
242 virtual ~JobHandle() = default;
243
249 virtual void NotifyConcurrencyIncrease() = 0;
250
258 virtual void Join() = 0;
259
264 virtual void Cancel() = 0;
265
266 /*
267 * Forces all existing workers to yield ASAP but doesn’t wait for them.
268 * Warning, this is dangerous if the Job's callback is bound to or has access
269 * to state which may be deleted after this call.
270 */
271 virtual void CancelAndDetach() = 0;
272
276 virtual bool IsActive() = 0;
277
283 virtual bool IsValid() = 0;
284
288 virtual bool UpdatePriorityEnabled() const { return false; }
289
293 virtual void UpdatePriority(TaskPriority new_priority) {}
294};
295
299class JobTask {
300 public:
301 virtual ~JobTask() = default;
302
303 virtual void Run(JobDelegate* delegate) = 0;
304
316 virtual size_t GetMaxConcurrency(size_t worker_count) const = 0;
317};
318
319// Allows a thread to temporarily boost another thread's priority to match its
320// own priority. The priority is reset when the object is destroyed, which must
321// happens on the boosted thread.
323 public:
324 virtual ~ScopedBoostablePriority() = default;
327 delete;
328
329 // Boosts the priority of the thread where this ScopedBoostablePriority was
330 // created. Can be called from any thread, but requires proper external
331 // synchronization with the constructor, destructor and any other call to
332 // BoostPriority/Reset(). If called multiple times, only the first call takes
333 // effect.
334 virtual bool BoostPriority() = 0;
335
336 // Resets the priority of the thread where this ScopedBoostablePriority was
337 // created to its original priority.
338 virtual void Reset() = 0;
339};
340
353enum class BlockingType {
354 // The call might block (e.g. file I/O that might hit in memory cache).
355 kMayBlock,
356 // The call will definitely block (e.g. cache already checked and now pinging
357 // server synchronously).
359};
360
369 public:
370 virtual ~ScopedBlockingCall() = default;
371};
372
377 public:
378 virtual ~ConvertableToTraceFormat() = default;
379
386 virtual void AppendAsTraceFormat(std::string* out) const = 0;
387};
388
397 public:
398 virtual ~TracingController() = default;
399
400 // In Perfetto mode, trace events are written using Perfetto's Track Event
401 // API directly without going through the embedder. However, it is still
402 // possible to observe tracing being enabled and disabled.
403#if !defined(V8_USE_PERFETTO)
411 virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
412 static uint8_t no = 0;
413 return &no;
414 }
415
424 virtual uint64_t AddTraceEvent(
425 char phase, const uint8_t* category_enabled_flag, const char* name,
426 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
427 const char** arg_names, const uint8_t* arg_types,
428 const uint64_t* arg_values,
429 std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
430 unsigned int flags) {
431 return 0;
432 }
434 char phase, const uint8_t* category_enabled_flag, const char* name,
435 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
436 const char** arg_names, const uint8_t* arg_types,
437 const uint64_t* arg_values,
438 std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
439 unsigned int flags, int64_t timestamp) {
440 return 0;
441 }
442
447 virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
448 const char* name, uint64_t handle) {}
449#endif // !defined(V8_USE_PERFETTO)
450
452 public:
453 virtual ~TraceStateObserver() = default;
454 virtual void OnTraceEnabled() = 0;
455 virtual void OnTraceDisabled() = 0;
456 };
457
463
469};
470
471// Opaque type representing a handle to a shared memory region.
473 public:
474 // For the handle itself, we use the underlying type (e.g. unsigned int)
475 // instead of e.g. mach_port_t to avoid pulling in large OS header files into
476 // this header file. Instead, the users of these routines are expected to
477 // include the respective OS headers in addition to this one.
478
479#if V8_OS_DARWIN
480 // A mach_port_t referencing a memory entry object.
481 using PlatformHandle = unsigned int;
482#elif V8_OS_FUCHSIA
483 // A zx_handle_t to a VMO.
484 using PlatformHandle = uint32_t;
485#elif V8_OS_WIN
486 // A Windows HANDLE to a file mapping object.
487 using PlatformHandle = void*;
488#else
489 // A file descriptor.
490 using PlatformHandle = int;
491#endif
492
494 PlatformHandle handle) {
495 return SharedMemoryHandle(handle);
496 }
497
498 PlatformHandle GetPlatformHandle() const { return handle_; }
499
500 private:
501 SharedMemoryHandle() = delete;
502 explicit constexpr SharedMemoryHandle(PlatformHandle handle)
503 : handle_(handle) {}
504
505 PlatformHandle handle_;
506};
507
508#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap) \
509 V8_DEPRECATE_SOON("Use SharedMemoryHandle::FromPlatformHandle instead") \
510 inline SharedMemoryHandle Wrap(SharedMemoryHandle::PlatformHandle handle) { \
511 return SharedMemoryHandle::FromPlatformHandle(handle); \
512 } \
513 V8_DEPRECATE_SOON("Use SharedMemoryHandle::GetPlatformHandle instead") \
514 inline SharedMemoryHandle::PlatformHandle Unwrap( \
515 SharedMemoryHandle handle) { \
516 return handle.GetPlatformHandle(); \
517 }
518
519#if V8_OS_DARWIN
520DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromMachMemoryEntry,
521 MachMemoryEntryFromSharedMemoryHandle)
522#elif V8_OS_FUCHSIA
523DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromVMO,
524 VMOFromSharedMemoryHandle)
525#elif V8_OS_WIN
526DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromFileMapping,
527 FileMappingFromSharedMemoryHandle)
528#else
531#endif
532
533#undef DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS
534
535// TODO(https://crbug.com/463925491): Remove this type alias once Chromium's
536// "gin" V8 binding migrates off it.
537using PlatformSharedMemoryHandle = std::optional<SharedMemoryHandle>;
538V8_DEPRECATE_SOON("Use std::nullopt instead")
539static constexpr PlatformSharedMemoryHandle kInvalidSharedMemoryHandle =
540 std::nullopt;
541
548 public:
549 virtual ~PageAllocator() = default;
550
555 virtual size_t AllocatePageSize() = 0;
556
561 virtual size_t CommitPageSize() = 0;
562
567 virtual void SetRandomMmapSeed(int64_t seed) = 0;
568
573 virtual void* GetRandomMmapAddr() = 0;
574
584 // Set this when reserving memory that will later require kReadWriteExecute
585 // permissions. The resulting behavior is platform-specific, currently
586 // this is used to set the MAP_JIT flag on Apple Silicon.
587 // TODO(jkummerow): Remove this when Wasm has a platform-independent
588 // w^x implementation.
589 // TODO(saelo): Remove this once all JIT pages are allocated through the
590 // VirtualAddressSpace API.
591 kNoAccessWillJitLater
592 };
593
597 class AllocationHint final {
598 public:
599 AllocationHint() = default;
600
602 void* address) const {
603 return AllocationHint(address, may_grow_);
604 }
605
607 return AllocationHint(address_, true);
608 }
609
610 bool MayGrow() const { return may_grow_; }
611 void* Address() const { return address_; }
612
613 private:
614 constexpr AllocationHint(void* address, bool may_grow)
615 : address_(address), may_grow_(may_grow) {}
616
617 void* address_ = nullptr;
618 bool may_grow_ = false;
619 };
620
624 virtual void* AllocatePages(void* address, size_t length, size_t alignment,
625 Permission permissions) = 0;
626
632 virtual void* AllocatePages(size_t length, size_t alignment,
633 Permission permissions, AllocationHint hint) {
634 return AllocatePages(hint.Address(), length, alignment, permissions);
635 }
636
642 virtual bool ResizeAllocationAt(void* address, size_t old_length,
643 size_t new_length, Permission permissions) {
644 return false;
645 }
646
650 virtual bool FreePages(void* address, size_t length) = 0;
651
655 virtual bool ReleasePages(void* address, size_t length,
656 size_t new_length) = 0;
657
661 virtual bool SetPermissions(void* address, size_t length,
662 Permission permissions) = 0;
663
669 virtual bool RecommitPages(void* address, size_t length,
670 Permission permissions) {
671 // TODO(v8:12797): make it pure once it's implemented on Chromium side.
672 return false;
673 }
674
682 virtual bool DiscardSystemPages(void* address, size_t size) { return true; }
683
692 virtual bool DecommitPages(void* address, size_t size) = 0;
693
702 virtual bool SealPages(void* address, size_t length) {
703 // TODO(360048056): make it pure once it's implemented on Chromium side.
704 return false;
705 }
706
712 public:
713 // Implementations are expected to free the shared memory mapping in the
714 // destructor.
715 virtual ~SharedMemoryMapping() = default;
716 virtual void* GetMemory() const = 0;
717 };
718
724 public:
725 // Implementations are expected to free the shared memory in the destructor.
726 virtual ~SharedMemory() = default;
727 virtual std::unique_ptr<SharedMemoryMapping> RemapTo(
728 void* new_address) const = 0;
729 virtual void* GetMemory() const = 0;
730 virtual size_t GetSize() const = 0;
731 };
732
742 virtual bool ReserveForSharedMemoryMapping(void* address, size_t size) {
743 return false;
744 }
745
755 virtual std::unique_ptr<SharedMemory> AllocateSharedPages(
756 size_t length, const void* original_address) {
757 return {};
758 }
759
768 virtual bool CanAllocateSharedPages() { return false; }
769};
770
780 public:
781 virtual ~ThreadIsolatedAllocator() = default;
782
783 virtual void* Allocate(size_t size) = 0;
784
785 virtual void Free(void* object) = 0;
786
787 enum class Type {
788 kPkey,
789 };
790
791 virtual Type Type() const = 0;
792
796 virtual int Pkey() const { return -1; }
797};
798
802enum class PagePermissions {
803 kNoAccess,
804 kRead,
808};
809
821 public:
822 using Address = uintptr_t;
823
825 Address base, size_t size,
827 : page_size_(page_size),
828 allocation_granularity_(allocation_granularity),
829 base_(base),
830 size_(size),
831 max_page_permissions_(max_page_permissions) {}
832
833 virtual ~VirtualAddressSpace() = default;
834
842 size_t page_size() const { return page_size_; }
843
852 size_t allocation_granularity() const { return allocation_granularity_; }
853
859 Address base() const { return base_; }
860
866 size_t size() const { return size_; }
867
874 PagePermissions max_page_permissions() const { return max_page_permissions_; }
875
881 bool Contains(Address address) const {
882 return (address >= base()) && (address < base() + size());
883 }
884
891 virtual void SetRandomSeed(int64_t seed) = 0;
892
900
921 static constexpr Address kNoHint = 0;
923 AllocatePages(Address hint, size_t size, size_t alignment,
924 PagePermissions permissions) = 0;
925
938 virtual void FreePages(Address address, size_t size) = 0;
939
958 Address address, size_t size, PagePermissions permissions) = 0;
959
977 size_t size) = 0;
978
992 virtual void FreeGuardRegion(Address address, size_t size) = 0;
993
1015 SharedMemoryHandle handle, uint64_t offset) = 0;
1016
1017 // TODO(https://crbug.com/463925491): Remove me once API users change from
1018 // PlatformSharedMemoryHandle to SharedMemoryHandle.
1019 V8_DEPRECATE_SOON("Use AllocateSharedPages() with SharedMemoryHandle")
1021 Address hint, size_t size, PagePermissions permissions,
1022 std::optional<SharedMemoryHandle> handle, uint64_t offset) {
1023 return AllocateSharedPages(hint, size, permissions, *handle, offset);
1024 }
1025
1038 virtual void FreeSharedPages(Address address, size_t size) = 0;
1039
1052
1061 virtual std::optional<MemoryProtectionKeyId> ActiveMemoryProtectionKey() = 0;
1062
1068 virtual bool CanAllocateSubspaces() = 0;
1069
1070 /*
1071 * Allocate a subspace.
1072 *
1073 * The address space of a subspace stays reserved in the parent space for the
1074 * lifetime of the subspace. As such, it is guaranteed that page allocations
1075 * on the parent space cannot end up inside a subspace.
1076 *
1077 * \param hint Hints where the subspace should be allocated. See
1078 * AllocatePages() for more details.
1079 *
1080 * \param size The size in bytes of the subspace. Must be a multiple of the
1081 * allocation_granularity().
1082 *
1083 * \param alignment The alignment of the subspace in bytes. Must be a multiple
1084 * of the allocation_granularity() and should be a power of two.
1085 *
1086 * \param max_page_permissions The maximum permissions that pages allocated in
1087 * the subspace can obtain.
1088 *
1089 * \param key Optional memory protection key for the subspace. If used, the
1090 * returned subspace will use this key for all its memory pages.
1091 *
1092 * \param handle Optional file descriptor for the subspace. If used, the
1093 * returned subspace will use this file descriptor with 0 offset as the
1094 * space's underlying file.
1095 *
1096 * \returns a new subspace or nullptr on failure.
1097 */
1098 virtual std::unique_ptr<VirtualAddressSpace> AllocateSubspace(
1099 Address hint, size_t size, size_t alignment,
1101 std::optional<MemoryProtectionKeyId> key = std::nullopt,
1102 std::optional<SharedMemoryHandle> handle = std::nullopt) = 0;
1103
1104 //
1105 // TODO(v8) maybe refactor the methods below before stabilizing the API. For
1106 // example by combining them into some form of page operation method that
1107 // takes a command enum as parameter.
1108 //
1109
1126 Address address, size_t size, PagePermissions permissions) = 0;
1127
1139 size_t size) {
1140 return true;
1141 }
1153 size_t size) = 0;
1154
1155 private:
1156 const size_t page_size_;
1157 const size_t allocation_granularity_;
1158 const Address base_;
1159 const size_t size_;
1160 const PagePermissions max_page_permissions_;
1161};
1162
1168 public:
1169 virtual void EnterSection() {}
1170 virtual void LeaveSection() {}
1171};
1172
1180 public:
1181 virtual ~Platform() = default;
1182
1187 virtual PageAllocator* GetPageAllocator() { return nullptr; }
1188
1196 return nullptr;
1197 }
1198
1207
1216 virtual int NumberOfWorkerThreads() = 0;
1217
1223 std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(Isolate* isolate) {
1225 }
1226
1232 virtual std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
1233 Isolate* isolate, TaskPriority priority) = 0;
1234
1240 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1241 void CallOnWorkerThread(std::unique_ptr<Task> task,
1242 SourceLocation location = SourceLocation::Current()) {
1244 location);
1245 }
1246
1253 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1255 std::unique_ptr<Task> task,
1256 SourceLocation location = SourceLocation::Current()) {
1257 // Embedders may optionally override this to process these tasks in a high
1258 // priority pool.
1260 location);
1261 }
1262
1268 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1270 std::unique_ptr<Task> task,
1271 SourceLocation location = SourceLocation::Current()) {
1272 // Embedders may optionally override this to process these tasks in a low
1273 // priority pool.
1275 location);
1276 }
1277
1284 V8_DEPRECATE_SOON("Use PostDelayedTaskOnWorkerThread instead.")
1286 std::unique_ptr<Task> task, double delay_in_seconds,
1287 SourceLocation location = SourceLocation::Current()) {
1289 std::move(task), delay_in_seconds,
1290 location);
1291 }
1292
1299 TaskPriority priority, std::unique_ptr<Task> task,
1301 PostTaskOnWorkerThreadImpl(priority, std::move(task), location);
1302 }
1303
1311 TaskPriority priority, std::unique_ptr<Task> task,
1312 double delay_in_seconds,
1314 PostDelayedTaskOnWorkerThreadImpl(priority, std::move(task),
1315 delay_in_seconds, location);
1316 }
1317
1321 virtual bool IdleTasksEnabled(Isolate* isolate) { return false; }
1322
1368 std::unique_ptr<JobHandle> PostJob(
1369 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1371 auto handle = CreateJob(priority, std::move(job_task), location);
1372 handle->NotifyConcurrencyIncrease();
1373 return handle;
1374 }
1375
1391 std::unique_ptr<JobHandle> CreateJob(
1392 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1394 return CreateJobImpl(priority, std::move(job_task), location);
1395 }
1396
1400 virtual std::unique_ptr<ScopedBoostablePriority>
1402 return nullptr;
1403 }
1404
1408 virtual std::unique_ptr<ScopedBlockingCall> CreateBlockingScope(
1409 BlockingType blocking_type) {
1410 return nullptr;
1411 }
1412
1420 virtual double MonotonicallyIncreasingTime() = 0;
1421
1428 return static_cast<int64_t>(floor(CurrentClockTimeMillis()));
1429 }
1430
1436 virtual double CurrentClockTimeMillis() = 0;
1437
1442 return CurrentClockTimeMillis();
1443 }
1444
1445 typedef void (*StackTracePrinter)();
1446
1451 virtual StackTracePrinter GetStackTracePrinter() { return nullptr; }
1452
1457
1462 virtual void DumpWithoutCrashing() {}
1463
1470 static HighAllocationThroughputObserver default_observer;
1471 return &default_observer;
1472 }
1473
1474 protected:
1481
1485 virtual std::unique_ptr<JobHandle> CreateJobImpl(
1486 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1487 const SourceLocation& location) = 0;
1488
1493 std::unique_ptr<Task> task,
1494 const SourceLocation& location) = 0;
1495
1501 TaskPriority priority, std::unique_ptr<Task> task,
1502 double delay_in_seconds, const SourceLocation& location) = 0;
1503};
1504
1505} // namespace v8
1506
1507#endif // V8_V8_PLATFORM_H_
Definition: v8-platform.h:376
virtual ~ConvertableToTraceFormat()=default
virtual void AppendAsTraceFormat(std::string *out) const =0
Definition: v8-platform.h:1167
virtual void EnterSection()
Definition: v8-platform.h:1169
virtual void LeaveSection()
Definition: v8-platform.h:1170
Definition: v8-platform.h:63
virtual void Run(double deadline_in_seconds)=0
virtual ~IdleTask()=default
Definition: v8-isolate.h:291
Definition: v8-platform.h:205
virtual void NotifyConcurrencyIncrease()=0
virtual bool ShouldYield()=0
virtual bool IsJoiningThread() const =0
virtual uint8_t GetTaskId()=0
Definition: v8-platform.h:240
virtual void NotifyConcurrencyIncrease()=0
virtual void CancelAndDetach()=0
virtual bool IsActive()=0
virtual bool UpdatePriorityEnabled() const
Definition: v8-platform.h:288
virtual bool IsValid()=0
virtual void UpdatePriority(TaskPriority new_priority)
Definition: v8-platform.h:293
virtual void Cancel()=0
virtual ~JobHandle()=default
virtual void Join()=0
Definition: v8-platform.h:299
virtual void Run(JobDelegate *delegate)=0
virtual size_t GetMaxConcurrency(size_t worker_count) const =0
virtual ~JobTask()=default
Definition: v8-platform.h:597
bool MayGrow() const
Definition: v8-platform.h:610
void * Address() const
Definition: v8-platform.h:611
constexpr AllocationHint WithAddress(void *address) const
Definition: v8-platform.h:601
constexpr AllocationHint WithMayGrow() const
Definition: v8-platform.h:606
Definition: v8-platform.h:711
virtual void * GetMemory() const =0
Definition: v8-platform.h:723
virtual std::unique_ptr< SharedMemoryMapping > RemapTo(void *new_address) const =0
virtual void * GetMemory() const =0
virtual size_t GetSize() const =0
virtual ~SharedMemory()=default
Definition: v8-platform.h:547
virtual void * GetRandomMmapAddr()=0
virtual bool ResizeAllocationAt(void *address, size_t old_length, size_t new_length, Permission permissions)
Definition: v8-platform.h:642
virtual ~PageAllocator()=default
virtual void * AllocatePages(size_t length, size_t alignment, Permission permissions, AllocationHint hint)
Definition: v8-platform.h:632
virtual bool ReleasePages(void *address, size_t length, size_t new_length)=0
Permission
Definition: v8-platform.h:578
@ kReadExecute
Definition: v8-platform.h:583
@ kRead
Definition: v8-platform.h:580
@ kNoAccess
Definition: v8-platform.h:579
@ kReadWrite
Definition: v8-platform.h:581
@ kReadWriteExecute
Definition: v8-platform.h:582
virtual bool DecommitPages(void *address, size_t size)=0
virtual size_t AllocatePageSize()=0
virtual void SetRandomMmapSeed(int64_t seed)=0
virtual void * AllocatePages(void *address, size_t length, size_t alignment, Permission permissions)=0
virtual bool CanAllocateSharedPages()
Definition: v8-platform.h:768
virtual bool RecommitPages(void *address, size_t length, Permission permissions)
Definition: v8-platform.h:669
virtual bool SetPermissions(void *address, size_t length, Permission permissions)=0
virtual bool SealPages(void *address, size_t length)
Definition: v8-platform.h:702
virtual bool FreePages(void *address, size_t length)=0
virtual std::unique_ptr< SharedMemory > AllocateSharedPages(size_t length, const void *original_address)
Definition: v8-platform.h:755
virtual bool DiscardSystemPages(void *address, size_t size)
Definition: v8-platform.h:682
virtual size_t CommitPageSize()=0
virtual bool ReserveForSharedMemoryMapping(void *address, size_t size)
Definition: v8-platform.h:742
Definition: v8-platform.h:1179
virtual std::unique_ptr< ScopedBlockingCall > CreateBlockingScope(BlockingType blocking_type)
Definition: v8-platform.h:1408
void PostTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1298
void CallLowPriorityTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1269
std::unique_ptr< JobHandle > CreateJob(TaskPriority priority, std::unique_ptr< JobTask > job_task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1391
static double SystemClockTimeMillis()
void PostDelayedTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1310
virtual void PostDelayedTaskOnWorkerThreadImpl(TaskPriority priority, std::unique_ptr< Task > task, double delay_in_seconds, const SourceLocation &location)=0
virtual std::unique_ptr< ScopedBoostablePriority > CreateBoostablePriorityScope()
Definition: v8-platform.h:1401
virtual std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(Isolate *isolate, TaskPriority priority)=0
void CallDelayedOnWorkerThread(std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1285
virtual TracingController * GetTracingController()=0
virtual PageAllocator * GetPageAllocator()
Definition: v8-platform.h:1187
virtual int NumberOfWorkerThreads()=0
virtual double MonotonicallyIncreasingTime()=0
virtual HighAllocationThroughputObserver * GetHighAllocationThroughputObserver()
Definition: v8-platform.h:1469
virtual void OnCriticalMemoryPressure()
Definition: v8-platform.h:1206
void CallBlockingTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1254
virtual int64_t CurrentClockTimeMilliseconds()
Definition: v8-platform.h:1427
virtual double CurrentClockTimeMillis()=0
virtual StackTracePrinter GetStackTracePrinter()
Definition: v8-platform.h:1451
void(* StackTracePrinter)()
Definition: v8-platform.h:1445
virtual ~Platform()=default
virtual double CurrentClockTimeMillisecondsHighResolution()
Definition: v8-platform.h:1441
virtual void DumpWithoutCrashing()
Definition: v8-platform.h:1462
virtual void PostTaskOnWorkerThreadImpl(TaskPriority priority, std::unique_ptr< Task > task, const SourceLocation &location)=0
void CallOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1241
virtual bool IdleTasksEnabled(Isolate *isolate)
Definition: v8-platform.h:1321
std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(Isolate *isolate)
Definition: v8-platform.h:1223
virtual std::unique_ptr< JobHandle > CreateJobImpl(TaskPriority priority, std::unique_ptr< JobTask > job_task, const SourceLocation &location)=0
std::unique_ptr< JobHandle > PostJob(TaskPriority priority, std::unique_ptr< JobTask > job_task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1368
virtual ThreadIsolatedAllocator * GetThreadIsolatedAllocator()
Definition: v8-platform.h:1195
Definition: v8-platform.h:368
virtual ~ScopedBlockingCall()=default
Definition: v8-platform.h:322
ScopedBoostablePriority(const ScopedBoostablePriority &)=delete
virtual ~ScopedBoostablePriority()=default
virtual bool BoostPriority()=0
ScopedBoostablePriority & operator=(const ScopedBoostablePriority &other)=delete
Definition: v8-platform.h:472
int PlatformHandle
Definition: v8-platform.h:490
static constexpr SharedMemoryHandle FromPlatformHandle(PlatformHandle handle)
Definition: v8-platform.h:493
PlatformHandle GetPlatformHandle() const
Definition: v8-platform.h:498
Definition: v8-source-location.h:22
static constexpr SourceLocation Current(const std::source_location &loc=std::source_location::current())
Definition: v8-source-location.h:28
Definition: v8-platform.h:75
void PostNonNestableDelayedTask(std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:141
TaskRunner & operator=(const TaskRunner &)=delete
virtual void PostIdleTaskImpl(std::unique_ptr< IdleTask > task, const SourceLocation &location)
Definition: v8-platform.h:197
TaskRunner(const TaskRunner &)=delete
virtual void PostNonNestableTaskImpl(std::unique_ptr< Task > task, const SourceLocation &location)
Definition: v8-platform.h:189
virtual void PostTaskImpl(std::unique_ptr< Task > task, const SourceLocation &location)
Definition: v8-platform.h:187
virtual void PostDelayedTaskImpl(std::unique_ptr< Task > task, double delay_in_seconds, const SourceLocation &location)
Definition: v8-platform.h:191
virtual bool NonNestableDelayedTasksEnabled() const
Definition: v8-platform.h:175
TaskRunner()=default
void PostIdleTask(std::unique_ptr< IdleTask > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:157
virtual bool NonNestableTasksEnabled() const
Definition: v8-platform.h:170
void PostTask(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:83
virtual ~TaskRunner()=default
virtual void PostNonNestableDelayedTaskImpl(std::unique_ptr< Task > task, double delay_in_seconds, const SourceLocation &location)
Definition: v8-platform.h:194
virtual bool IdleTasksEnabled()=0
void PostNonNestableTask(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:105
void PostDelayedTask(std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:118
Definition: v8-platform.h:50
virtual void Run()=0
virtual ~Task()=default
Definition: v8-platform.h:779
virtual int Pkey() const
Definition: v8-platform.h:796
virtual void * Allocate(size_t size)=0
virtual void Free(void *object)=0
virtual ~ThreadIsolatedAllocator()=default
virtual Type Type() const =0
Type
Definition: v8-platform.h:787
Definition: v8-platform.h:451
Definition: v8-platform.h:396
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:433
virtual const uint8_t * GetCategoryGroupEnabled(const char *name)
Definition: v8-platform.h:411
virtual ~TracingController()=default
virtual void AddTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:462
virtual void RemoveTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:468
virtual void UpdateTraceEventDuration(const uint8_t *category_enabled_flag, const char *name, uint64_t handle)
Definition: v8-platform.h:447
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:424
Definition: v8-platform.h:820
virtual bool CanAllocateSubspaces()=0
Address base() const
Definition: v8-platform.h:859
virtual void FreePages(Address address, size_t size)=0
virtual std::unique_ptr< VirtualAddressSpace > AllocateSubspace(Address hint, size_t size, size_t alignment, PagePermissions max_page_permissions, std::optional< MemoryProtectionKeyId > key=std::nullopt, std::optional< SharedMemoryHandle > handle=std::nullopt)=0
virtual void SetRandomSeed(int64_t seed)=0
static constexpr Address kNoHint
Definition: v8-platform.h:921
bool Contains(Address address) const
Definition: v8-platform.h:881
uintptr_t Address
Definition: v8-platform.h:822
virtual bool DiscardSystemPages(Address address, size_t size)
Definition: v8-platform.h:1138
virtual void FreeSharedPages(Address address, size_t size)=0
virtual void FreeGuardRegion(Address address, size_t size)=0
virtual bool SetPagePermissions(Address address, size_t size, PagePermissions permissions)=0
VirtualAddressSpace(size_t page_size, size_t allocation_granularity, Address base, size_t size, PagePermissions max_page_permissions)
Definition: v8-platform.h:824
int MemoryProtectionKeyId
Definition: v8-platform.h:1051
size_t size() const
Definition: v8-platform.h:866
virtual bool AllocateGuardRegion(Address address, size_t size)=0
virtual Address AllocateSharedPages(Address hint, size_t size, PagePermissions permissions, SharedMemoryHandle handle, uint64_t offset)=0
PagePermissions max_page_permissions() const
Definition: v8-platform.h:874
virtual std::optional< MemoryProtectionKeyId > ActiveMemoryProtectionKey()=0
size_t allocation_granularity() const
Definition: v8-platform.h:852
virtual Address RandomPageAddress()=0
virtual bool RecommitPages(Address address, size_t size, PagePermissions permissions)=0
virtual ~VirtualAddressSpace()=default
virtual bool DecommitPages(Address address, size_t size)=0
virtual Address AllocatePages(Address hint, size_t size, size_t alignment, PagePermissions permissions)=0
size_t page_size() const
Definition: v8-platform.h:842
Definition: libplatform.h:15
TaskPriority
Definition: v8-platform.h:25
SharedMemoryHandle SharedMemoryHandleFromFileDescriptor(SharedMemoryHandle::PlatformHandle handle)
Definition: v8-platform.h:530
SharedMemoryHandle::PlatformHandle FileDescriptorFromSharedMemoryHandle(SharedMemoryHandle handle)
Definition: v8-platform.h:530
BlockingType
Definition: v8-platform.h:353
std::optional< SharedMemoryHandle > PlatformSharedMemoryHandle
Definition: v8-platform.h:537
PagePermissions
Definition: v8-platform.h:802
#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap)
Definition: v8-platform.h:508
#define V8_EXPORT
Definition: v8config.h:855
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:622
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:679