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:
325 virtual ~ScopedBoostablePriority() = default;
328 delete;
329
330 // Boosts the priority of the thread where this ScopedBoostablePriority was
331 // created. Can be called from any thread, but requires proper external
332 // synchronization with the constructor, destructor and any other call to
333 // BoostPriority/Reset(). If called multiple times, only the first call takes
334 // effect.
335 virtual bool BoostPriority() = 0;
336
337 // Resets the priority of the thread where this ScopedBoostablePriority was
338 // created to its original priority.
339 virtual void Reset() = 0;
340};
341
354enum class BlockingType {
355 // The call might block (e.g. file I/O that might hit in memory cache).
356 kMayBlock,
357 // The call will definitely block (e.g. cache already checked and now pinging
358 // server synchronously).
360};
361
370 public:
371 virtual ~ScopedBlockingCall() = default;
372};
373
378 public:
379 virtual ~ConvertableToTraceFormat() = default;
380
387 virtual void AppendAsTraceFormat(std::string* out) const = 0;
388};
389
398 public:
399 virtual ~TracingController() = default;
400
401 // In Perfetto mode, trace events are written using Perfetto's Track Event
402 // API directly without going through the embedder. However, it is still
403 // possible to observe tracing being enabled and disabled.
404#if !defined(V8_USE_PERFETTO)
412 virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
413 static uint8_t no = 0;
414 return &no;
415 }
416
425 virtual uint64_t AddTraceEvent(
426 char phase, const uint8_t* category_enabled_flag, const char* name,
427 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
428 const char** arg_names, const uint8_t* arg_types,
429 const uint64_t* arg_values,
430 std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
431 unsigned int flags) {
432 return 0;
433 }
435 char phase, const uint8_t* category_enabled_flag, const char* name,
436 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
437 const char** arg_names, const uint8_t* arg_types,
438 const uint64_t* arg_values,
439 std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
440 unsigned int flags, int64_t timestamp) {
441 return 0;
442 }
443
448 virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
449 const char* name, uint64_t handle) {}
450#endif // !defined(V8_USE_PERFETTO)
451
453 public:
454 virtual ~TraceStateObserver() = default;
455 virtual void OnTraceEnabled() = 0;
456 virtual void OnTraceDisabled() = 0;
457 };
458
464
470};
471
472// Opaque type representing a handle to a shared memory region.
474 public:
475 // For the handle itself, we use the underlying type (e.g. unsigned int)
476 // instead of e.g. mach_port_t to avoid pulling in large OS header files into
477 // this header file. Instead, the users of these routines are expected to
478 // include the respective OS headers in addition to this one.
479
480#if V8_OS_DARWIN
481 // A mach_port_t referencing a memory entry object.
482 using PlatformHandle = unsigned int;
483#elif V8_OS_FUCHSIA
484 // A zx_handle_t to a VMO.
485 using PlatformHandle = uint32_t;
486#elif V8_OS_WIN
487 // A Windows HANDLE to a file mapping object.
488 using PlatformHandle = void*;
489#else
490 // A file descriptor.
491 using PlatformHandle = int;
492#endif
493
495 PlatformHandle handle) {
496 return SharedMemoryHandle(handle);
497 }
498
499 PlatformHandle GetPlatformHandle() const { return handle_; }
500
501 private:
502 SharedMemoryHandle() = delete;
503 explicit constexpr SharedMemoryHandle(PlatformHandle handle)
504 : handle_(handle) {}
505
506 PlatformHandle handle_;
507};
508
509#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap) \
510 V8_DEPRECATE_SOON("Use SharedMemoryHandle::FromPlatformHandle instead") \
511 inline SharedMemoryHandle Wrap(SharedMemoryHandle::PlatformHandle handle) { \
512 return SharedMemoryHandle::FromPlatformHandle(handle); \
513 } \
514 V8_DEPRECATE_SOON("Use SharedMemoryHandle::GetPlatformHandle instead") \
515 inline SharedMemoryHandle::PlatformHandle Unwrap( \
516 SharedMemoryHandle handle) { \
517 return handle.GetPlatformHandle(); \
518 }
519
520#if V8_OS_DARWIN
521DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromMachMemoryEntry,
522 MachMemoryEntryFromSharedMemoryHandle)
523#elif V8_OS_FUCHSIA
524DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromVMO,
525 VMOFromSharedMemoryHandle)
526#elif V8_OS_WIN
527DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromFileMapping,
528 FileMappingFromSharedMemoryHandle)
529#else
532#endif
533
534#undef DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS
535
536// TODO(https://crbug.com/463925491): Remove this type alias once Chromium's
537// "gin" V8 binding migrates off it.
538using PlatformSharedMemoryHandle = std::optional<SharedMemoryHandle>;
539V8_DEPRECATE_SOON("Use std::nullopt instead")
540static constexpr PlatformSharedMemoryHandle kInvalidSharedMemoryHandle =
541 std::nullopt;
542
549 public:
550 virtual ~PageAllocator() = default;
551
556 virtual size_t AllocatePageSize() = 0;
557
562 virtual size_t CommitPageSize() = 0;
563
568 virtual void SetRandomMmapSeed(int64_t seed) = 0;
569
574 virtual void* GetRandomMmapAddr() = 0;
575
585 // Set this when reserving memory that will later require kReadWriteExecute
586 // permissions. The resulting behavior is platform-specific, currently
587 // this is used to set the MAP_JIT flag on Apple Silicon.
588 // TODO(jkummerow): Remove this when Wasm has a platform-independent
589 // w^x implementation.
590 // TODO(saelo): Remove this once all JIT pages are allocated through the
591 // VirtualAddressSpace API.
592 kNoAccessWillJitLater
593 };
594
598 class AllocationHint final {
599 public:
600 AllocationHint() = default;
601
603 void* address) const {
604 return AllocationHint(address, may_grow_);
605 }
606
608 return AllocationHint(address_, true);
609 }
610
611 bool MayGrow() const { return may_grow_; }
612 void* Address() const { return address_; }
613
614 private:
615 constexpr AllocationHint(void* address, bool may_grow)
616 : address_(address), may_grow_(may_grow) {}
617
618 void* address_ = nullptr;
619 bool may_grow_ = false;
620 };
621
625 virtual void* AllocatePages(void* address, size_t length, size_t alignment,
626 Permission permissions) = 0;
627
633 virtual void* AllocatePages(size_t length, size_t alignment,
634 Permission permissions, AllocationHint hint) {
635 return AllocatePages(hint.Address(), length, alignment, permissions);
636 }
637
643 virtual bool ResizeAllocationAt(void* address, size_t old_length,
644 size_t new_length, Permission permissions) {
645 return false;
646 }
647
651 virtual bool FreePages(void* address, size_t length) = 0;
652
656 virtual bool ReleasePages(void* address, size_t length,
657 size_t new_length) = 0;
658
662 virtual bool SetPermissions(void* address, size_t length,
663 Permission permissions) = 0;
664
670 virtual bool RecommitPages(void* address, size_t length,
671 Permission permissions) {
672 // TODO(v8:12797): make it pure once it's implemented on Chromium side.
673 return false;
674 }
675
683 virtual bool DiscardSystemPages(void* address, size_t size) { return true; }
684
693 virtual bool DecommitPages(void* address, size_t size) = 0;
694
703 virtual bool SealPages(void* address, size_t length) {
704 // TODO(360048056): make it pure once it's implemented on Chromium side.
705 return false;
706 }
707
713 public:
714 // Implementations are expected to free the shared memory mapping in the
715 // destructor.
716 virtual ~SharedMemoryMapping() = default;
717 virtual void* GetMemory() const = 0;
718 };
719
725 public:
726 // Implementations are expected to free the shared memory in the destructor.
727 virtual ~SharedMemory() = default;
728 virtual std::unique_ptr<SharedMemoryMapping> RemapTo(
729 void* new_address) const = 0;
730 virtual void* GetMemory() const = 0;
731 virtual size_t GetSize() const = 0;
732 };
733
743 virtual bool ReserveForSharedMemoryMapping(void* address, size_t size) {
744 return false;
745 }
746
756 virtual std::unique_ptr<SharedMemory> AllocateSharedPages(
757 size_t length, const void* original_address) {
758 return {};
759 }
760
769 virtual bool CanAllocateSharedPages() { return false; }
770};
771
781 public:
782 virtual ~ThreadIsolatedAllocator() = default;
783
784 virtual void* Allocate(size_t size) = 0;
785
786 virtual void Free(void* object) = 0;
787
788 enum class Type {
789 kPkey,
790 };
791
792 virtual Type Type() const = 0;
793
797 virtual int Pkey() const { return -1; }
798};
799
803enum class PagePermissions {
804 kNoAccess = 0,
805 kRead = 1,
806 kWrite = 2,
807 kExecute = 4,
812};
813
815 PagePermissions rhs) {
816 return static_cast<PagePermissions>(static_cast<int>(lhs) |
817 static_cast<int>(rhs));
818}
819
821 PagePermissions rhs) {
822 return static_cast<PagePermissions>(static_cast<int>(lhs) &
823 static_cast<int>(rhs));
824}
825
827 lhs = lhs | rhs;
828 return lhs;
829}
830
835inline constexpr bool IsSubset(PagePermissions lhs, PagePermissions rhs) {
836 return (lhs & rhs) == lhs;
837}
838
850 public:
851 using Address = uintptr_t;
852
854 Address base, size_t size,
856 : page_size_(page_size),
857 allocation_granularity_(allocation_granularity),
858 base_(base),
859 size_(size),
860 max_page_permissions_(max_page_permissions) {}
861
862 virtual ~VirtualAddressSpace() = default;
863
871 size_t page_size() const { return page_size_; }
872
881 size_t allocation_granularity() const { return allocation_granularity_; }
882
888 Address base() const { return base_; }
889
895 size_t size() const { return size_; }
896
903 PagePermissions max_page_permissions() const { return max_page_permissions_; }
904
910 bool Contains(Address address) const {
911 return (address >= base()) && (address < base() + size());
912 }
913
920 virtual void SetRandomSeed(int64_t seed) = 0;
921
929
950 static constexpr Address kNoHint = 0;
952 AllocatePages(Address hint, size_t size, size_t alignment,
953 PagePermissions permissions) = 0;
954
967 virtual void FreePages(Address address, size_t size) = 0;
968
987 Address address, size_t size, PagePermissions permissions) = 0;
988
1006 size_t size) = 0;
1007
1021 virtual void FreeGuardRegion(Address address, size_t size) = 0;
1022
1044 SharedMemoryHandle handle, uint64_t offset) = 0;
1045
1046 // TODO(https://crbug.com/463925491): Remove me once API users change from
1047 // PlatformSharedMemoryHandle to SharedMemoryHandle.
1048 V8_DEPRECATE_SOON("Use AllocateSharedPages() with SharedMemoryHandle")
1050 Address hint, size_t size, PagePermissions permissions,
1051 std::optional<SharedMemoryHandle> handle, uint64_t offset) {
1052 return AllocateSharedPages(hint, size, permissions, *handle, offset);
1053 }
1054
1067 virtual void FreeSharedPages(Address address, size_t size) = 0;
1068
1081
1090 virtual std::optional<MemoryProtectionKeyId> ActiveMemoryProtectionKey() = 0;
1091
1097 virtual bool CanAllocateSubspaces() = 0;
1098
1099 /*
1100 * Allocate a subspace.
1101 *
1102 * The address space of a subspace stays reserved in the parent space for the
1103 * lifetime of the subspace. As such, it is guaranteed that page allocations
1104 * on the parent space cannot end up inside a subspace.
1105 *
1106 * \param hint Hints where the subspace should be allocated. See
1107 * AllocatePages() for more details.
1108 *
1109 * \param size The size in bytes of the subspace. Must be a multiple of the
1110 * allocation_granularity().
1111 *
1112 * \param alignment The alignment of the subspace in bytes. Must be a multiple
1113 * of the allocation_granularity() and should be a power of two.
1114 *
1115 * \param max_page_permissions The maximum permissions that pages allocated in
1116 * the subspace can obtain.
1117 *
1118 * \param key Optional memory protection key for the subspace. If used, the
1119 * returned subspace will use this key for all its memory pages.
1120 *
1121 * \param handle Optional file descriptor for the subspace. If used, the
1122 * returned subspace will use this file descriptor with 0 offset as the
1123 * space's underlying file.
1124 *
1125 * \returns a new subspace or nullptr on failure.
1126 */
1127 virtual std::unique_ptr<VirtualAddressSpace> AllocateSubspace(
1128 Address hint, size_t size, size_t alignment,
1130 std::optional<MemoryProtectionKeyId> key = std::nullopt,
1131 std::optional<SharedMemoryHandle> handle = std::nullopt) = 0;
1132
1133 //
1134 // TODO(v8) maybe refactor the methods below before stabilizing the API. For
1135 // example by combining them into some form of page operation method that
1136 // takes a command enum as parameter.
1137 //
1138
1155 Address address, size_t size, PagePermissions permissions) = 0;
1156
1168 size_t size) {
1169 return true;
1170 }
1182 size_t size) = 0;
1183
1198 virtual bool SetName(const std::string& name) { return false; }
1199
1200 private:
1201 const size_t page_size_;
1202 const size_t allocation_granularity_;
1203 const Address base_;
1204 const size_t size_;
1205 const PagePermissions max_page_permissions_;
1206};
1207
1213 public:
1214 virtual void EnterSection() {}
1215 virtual void LeaveSection() {}
1216};
1217
1225 public:
1226 virtual ~Platform() = default;
1227
1232 virtual PageAllocator* GetPageAllocator() { return nullptr; }
1233
1241 return nullptr;
1242 }
1243
1252
1261 virtual int NumberOfWorkerThreads() = 0;
1262
1268 std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(Isolate* isolate) {
1270 }
1271
1277 virtual std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
1278 Isolate* isolate, TaskPriority priority) = 0;
1279
1285 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1286 void CallOnWorkerThread(std::unique_ptr<Task> task,
1287 SourceLocation location = SourceLocation::Current()) {
1289 location);
1290 }
1291
1298 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1300 std::unique_ptr<Task> task,
1301 SourceLocation location = SourceLocation::Current()) {
1302 // Embedders may optionally override this to process these tasks in a high
1303 // priority pool.
1305 location);
1306 }
1307
1313 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1315 std::unique_ptr<Task> task,
1316 SourceLocation location = SourceLocation::Current()) {
1317 // Embedders may optionally override this to process these tasks in a low
1318 // priority pool.
1320 location);
1321 }
1322
1329 V8_DEPRECATE_SOON("Use PostDelayedTaskOnWorkerThread instead.")
1331 std::unique_ptr<Task> task, double delay_in_seconds,
1332 SourceLocation location = SourceLocation::Current()) {
1334 std::move(task), delay_in_seconds,
1335 location);
1336 }
1337
1344 TaskPriority priority, std::unique_ptr<Task> task,
1346 PostTaskOnWorkerThreadImpl(priority, std::move(task), location);
1347 }
1348
1356 TaskPriority priority, std::unique_ptr<Task> task,
1357 double delay_in_seconds,
1359 PostDelayedTaskOnWorkerThreadImpl(priority, std::move(task),
1360 delay_in_seconds, location);
1361 }
1362
1366 virtual bool IdleTasksEnabled(Isolate* isolate) { return false; }
1367
1413 std::unique_ptr<JobHandle> PostJob(
1414 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1416 auto handle = CreateJob(priority, std::move(job_task), location);
1417 handle->NotifyConcurrencyIncrease();
1418 return handle;
1419 }
1420
1436 std::unique_ptr<JobHandle> CreateJob(
1437 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1439 return CreateJobImpl(priority, std::move(job_task), location);
1440 }
1441
1445 virtual std::unique_ptr<ScopedBoostablePriority>
1447 return nullptr;
1448 }
1449
1453 virtual std::unique_ptr<ScopedBlockingCall> CreateBlockingScope(
1454 BlockingType blocking_type) {
1455 return nullptr;
1456 }
1457
1465 virtual double MonotonicallyIncreasingTime() = 0;
1466
1473 return static_cast<int64_t>(floor(CurrentClockTimeMillis()));
1474 }
1475
1481 virtual double CurrentClockTimeMillis() = 0;
1482
1487 return CurrentClockTimeMillis();
1488 }
1489
1490 typedef void (*StackTracePrinter)();
1491
1496 virtual StackTracePrinter GetStackTracePrinter() { return nullptr; }
1497
1502
1507 virtual void DumpWithoutCrashing() {}
1508
1515 static HighAllocationThroughputObserver default_observer;
1516 return &default_observer;
1517 }
1518
1519 protected:
1526
1530 virtual std::unique_ptr<JobHandle> CreateJobImpl(
1531 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1532 const SourceLocation& location) = 0;
1533
1538 std::unique_ptr<Task> task,
1539 const SourceLocation& location) = 0;
1540
1546 TaskPriority priority, std::unique_ptr<Task> task,
1547 double delay_in_seconds, const SourceLocation& location) = 0;
1548};
1549
1550} // namespace v8
1551
1552#endif // V8_V8_PLATFORM_H_
Definition: v8-platform.h:377
virtual ~ConvertableToTraceFormat()=default
virtual void AppendAsTraceFormat(std::string *out) const =0
Definition: v8-platform.h:1212
virtual void EnterSection()
Definition: v8-platform.h:1214
virtual void LeaveSection()
Definition: v8-platform.h:1215
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:598
bool MayGrow() const
Definition: v8-platform.h:611
void * Address() const
Definition: v8-platform.h:612
constexpr AllocationHint WithAddress(void *address) const
Definition: v8-platform.h:602
constexpr AllocationHint WithMayGrow() const
Definition: v8-platform.h:607
Definition: v8-platform.h:712
virtual void * GetMemory() const =0
Definition: v8-platform.h:724
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:548
virtual void * GetRandomMmapAddr()=0
virtual bool ResizeAllocationAt(void *address, size_t old_length, size_t new_length, Permission permissions)
Definition: v8-platform.h:643
virtual ~PageAllocator()=default
virtual void * AllocatePages(size_t length, size_t alignment, Permission permissions, AllocationHint hint)
Definition: v8-platform.h:633
virtual bool ReleasePages(void *address, size_t length, size_t new_length)=0
Permission
Definition: v8-platform.h:579
@ kReadExecute
Definition: v8-platform.h:584
@ kRead
Definition: v8-platform.h:581
@ kNoAccess
Definition: v8-platform.h:580
@ kReadWrite
Definition: v8-platform.h:582
@ kReadWriteExecute
Definition: v8-platform.h:583
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:769
virtual bool RecommitPages(void *address, size_t length, Permission permissions)
Definition: v8-platform.h:670
virtual bool SetPermissions(void *address, size_t length, Permission permissions)=0
virtual bool SealPages(void *address, size_t length)
Definition: v8-platform.h:703
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:756
virtual bool DiscardSystemPages(void *address, size_t size)
Definition: v8-platform.h:683
virtual size_t CommitPageSize()=0
virtual bool ReserveForSharedMemoryMapping(void *address, size_t size)
Definition: v8-platform.h:743
Definition: v8-platform.h:1224
virtual std::unique_ptr< ScopedBlockingCall > CreateBlockingScope(BlockingType blocking_type)
Definition: v8-platform.h:1453
void PostTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1343
void CallLowPriorityTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1314
std::unique_ptr< JobHandle > CreateJob(TaskPriority priority, std::unique_ptr< JobTask > job_task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1436
static double SystemClockTimeMillis()
void PostDelayedTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1355
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:1446
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:1330
virtual TracingController * GetTracingController()=0
virtual PageAllocator * GetPageAllocator()
Definition: v8-platform.h:1232
virtual int NumberOfWorkerThreads()=0
virtual double MonotonicallyIncreasingTime()=0
virtual HighAllocationThroughputObserver * GetHighAllocationThroughputObserver()
Definition: v8-platform.h:1514
virtual void OnCriticalMemoryPressure()
Definition: v8-platform.h:1251
void CallBlockingTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1299
virtual int64_t CurrentClockTimeMilliseconds()
Definition: v8-platform.h:1472
virtual double CurrentClockTimeMillis()=0
virtual StackTracePrinter GetStackTracePrinter()
Definition: v8-platform.h:1496
void(* StackTracePrinter)()
Definition: v8-platform.h:1490
virtual ~Platform()=default
virtual double CurrentClockTimeMillisecondsHighResolution()
Definition: v8-platform.h:1486
virtual void DumpWithoutCrashing()
Definition: v8-platform.h:1507
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:1286
virtual bool IdleTasksEnabled(Isolate *isolate)
Definition: v8-platform.h:1366
std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(Isolate *isolate)
Definition: v8-platform.h:1268
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:1413
virtual ThreadIsolatedAllocator * GetThreadIsolatedAllocator()
Definition: v8-platform.h:1240
Definition: v8-platform.h:369
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:473
int PlatformHandle
Definition: v8-platform.h:491
static constexpr SharedMemoryHandle FromPlatformHandle(PlatformHandle handle)
Definition: v8-platform.h:494
PlatformHandle GetPlatformHandle() const
Definition: v8-platform.h:499
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:780
virtual int Pkey() const
Definition: v8-platform.h:797
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:788
Definition: v8-platform.h:452
Definition: v8-platform.h:397
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:434
virtual const uint8_t * GetCategoryGroupEnabled(const char *name)
Definition: v8-platform.h:412
virtual ~TracingController()=default
virtual void AddTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:463
virtual void RemoveTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:469
virtual void UpdateTraceEventDuration(const uint8_t *category_enabled_flag, const char *name, uint64_t handle)
Definition: v8-platform.h:448
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:425
Definition: v8-platform.h:849
virtual bool CanAllocateSubspaces()=0
Address base() const
Definition: v8-platform.h:888
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:950
bool Contains(Address address) const
Definition: v8-platform.h:910
uintptr_t Address
Definition: v8-platform.h:851
virtual bool DiscardSystemPages(Address address, size_t size)
Definition: v8-platform.h:1167
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
virtual bool SetName(const std::string &name)
Definition: v8-platform.h:1198
VirtualAddressSpace(size_t page_size, size_t allocation_granularity, Address base, size_t size, PagePermissions max_page_permissions)
Definition: v8-platform.h:853
int MemoryProtectionKeyId
Definition: v8-platform.h:1080
size_t size() const
Definition: v8-platform.h:895
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:903
virtual std::optional< MemoryProtectionKeyId > ActiveMemoryProtectionKey()=0
size_t allocation_granularity() const
Definition: v8-platform.h:881
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:871
Definition: libplatform.h:15
TaskPriority
Definition: v8-platform.h:25
PagePermissions & operator|=(PagePermissions &lhs, PagePermissions rhs)
Definition: v8-platform.h:826
SharedMemoryHandle SharedMemoryHandleFromFileDescriptor(SharedMemoryHandle::PlatformHandle handle)
Definition: v8-platform.h:531
SharedMemoryHandle::PlatformHandle FileDescriptorFromSharedMemoryHandle(SharedMemoryHandle handle)
Definition: v8-platform.h:531
BlockingType
Definition: v8-platform.h:354
constexpr PagePermissions operator&(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:820
std::optional< SharedMemoryHandle > PlatformSharedMemoryHandle
Definition: v8-platform.h:538
constexpr PagePermissions operator|(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:814
constexpr bool IsSubset(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:835
PagePermissions
Definition: v8-platform.h:803
#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap)
Definition: v8-platform.h:509
#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