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) = 0;
189 virtual void PostNonNestableTaskImpl(std::unique_ptr<Task> task,
190 const SourceLocation& location) {
191 // This must be overridden if `NonNestableTasksEnabled()`.
192 abort();
193 }
194 virtual void PostDelayedTaskImpl(std::unique_ptr<Task> task,
195 double delay_in_seconds,
196 const SourceLocation& location) = 0;
197 virtual void PostNonNestableDelayedTaskImpl(std::unique_ptr<Task> task,
198 double delay_in_seconds,
199 const SourceLocation& location) {
200 // This must be overridden if `NonNestableDelayedTasksEnabled()`.
201 abort();
202 }
203 virtual void PostIdleTaskImpl(std::unique_ptr<IdleTask> task,
204 const SourceLocation& location) {
205 // This must be overridden if `IdleTasksEnabled()`.
206 abort();
207 }
208};
209
215 public:
222 virtual bool ShouldYield() = 0;
223
229 virtual void NotifyConcurrencyIncrease() = 0;
230
236 virtual uint8_t GetTaskId() = 0;
237
242 virtual bool IsJoiningThread() const = 0;
243};
244
250 public:
251 virtual ~JobHandle() = default;
252
258 virtual void NotifyConcurrencyIncrease() = 0;
259
267 virtual void Join() = 0;
268
273 virtual void Cancel() = 0;
274
275 /*
276 * Forces all existing workers to yield ASAP but doesn’t wait for them.
277 * Warning, this is dangerous if the Job's callback is bound to or has access
278 * to state which may be deleted after this call.
279 */
280 virtual void CancelAndDetach() = 0;
281
285 virtual bool IsActive() = 0;
286
292 virtual bool IsValid() = 0;
293
297 virtual bool UpdatePriorityEnabled() const { return false; }
298
302 virtual void UpdatePriority(TaskPriority new_priority) {}
303};
304
308class JobTask {
309 public:
310 virtual ~JobTask() = default;
311
312 virtual void Run(JobDelegate* delegate) = 0;
313
325 virtual size_t GetMaxConcurrency(size_t worker_count) const = 0;
326};
327
328// Allows a thread to temporarily boost another thread's priority to match its
329// own priority. The priority is reset when the object is destroyed, which must
330// happens on the boosted thread.
332 public:
334 virtual ~ScopedBoostablePriority() = default;
337 delete;
338
339 // Boosts the priority of the thread where this ScopedBoostablePriority was
340 // created. Can be called from any thread, but requires proper external
341 // synchronization with the constructor, destructor and any other call to
342 // BoostPriority/Reset(). If called multiple times, only the first call takes
343 // effect.
344 virtual bool BoostPriority() = 0;
345
346 // Resets the priority of the thread where this ScopedBoostablePriority was
347 // created to its original priority.
348 virtual void Reset() = 0;
349};
350
363enum class BlockingType {
364 // The call might block (e.g. file I/O that might hit in memory cache).
365 kMayBlock,
366 // The call will definitely block (e.g. cache already checked and now pinging
367 // server synchronously).
369};
370
379 public:
380 virtual ~ScopedBlockingCall() = default;
381};
382
387 public:
388 virtual ~ConvertableToTraceFormat() = default;
389
396 virtual void AppendAsTraceFormat(std::string* out) const = 0;
397};
398
407 public:
408 virtual ~TracingController() = default;
409
410 // In Perfetto mode, trace events are written using Perfetto's Track Event
411 // API directly without going through the embedder. However, it is still
412 // possible to observe tracing being enabled and disabled.
413#if !defined(V8_USE_PERFETTO)
421 virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
422 static uint8_t no = 0;
423 return &no;
424 }
425
434 virtual uint64_t AddTraceEvent(
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) {
441 return 0;
442 }
444 char phase, const uint8_t* category_enabled_flag, const char* name,
445 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
446 const char** arg_names, const uint8_t* arg_types,
447 const uint64_t* arg_values,
448 std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
449 unsigned int flags, int64_t timestamp) {
450 return 0;
451 }
452
457 virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
458 const char* name, uint64_t handle) {}
459#endif // !defined(V8_USE_PERFETTO)
460
462 public:
463 virtual ~TraceStateObserver() = default;
464 virtual void OnTraceEnabled() = 0;
465 virtual void OnTraceDisabled() = 0;
466 };
467
473
479};
480
481// Opaque type representing a handle to a shared memory region.
483 public:
484 // For the handle itself, we use the underlying type (e.g. unsigned int)
485 // instead of e.g. mach_port_t to avoid pulling in large OS header files into
486 // this header file. Instead, the users of these routines are expected to
487 // include the respective OS headers in addition to this one.
488
489#if V8_OS_DARWIN
490 // A mach_port_t referencing a memory entry object.
491 using PlatformHandle = unsigned int;
492#elif V8_OS_FUCHSIA
493 // A zx_handle_t to a VMO.
494 using PlatformHandle = uint32_t;
495#elif V8_OS_WIN
496 // A Windows HANDLE to a file mapping object.
497 using PlatformHandle = void*;
498#else
499 // A file descriptor.
500 using PlatformHandle = int;
501#endif
502
504 PlatformHandle handle) {
505 return SharedMemoryHandle(handle);
506 }
507
508 PlatformHandle GetPlatformHandle() const { return handle_; }
509
510 private:
511 SharedMemoryHandle() = delete;
512 explicit constexpr SharedMemoryHandle(PlatformHandle handle)
513 : handle_(handle) {}
514
515 PlatformHandle handle_;
516};
517
518#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap) \
519 V8_DEPRECATE_SOON("Use SharedMemoryHandle::FromPlatformHandle instead") \
520 inline SharedMemoryHandle Wrap(SharedMemoryHandle::PlatformHandle handle) { \
521 return SharedMemoryHandle::FromPlatformHandle(handle); \
522 } \
523 V8_DEPRECATE_SOON("Use SharedMemoryHandle::GetPlatformHandle instead") \
524 inline SharedMemoryHandle::PlatformHandle Unwrap( \
525 SharedMemoryHandle handle) { \
526 return handle.GetPlatformHandle(); \
527 }
528
529#if V8_OS_DARWIN
530DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromMachMemoryEntry,
531 MachMemoryEntryFromSharedMemoryHandle)
532#elif V8_OS_FUCHSIA
533DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromVMO,
534 VMOFromSharedMemoryHandle)
535#elif V8_OS_WIN
536DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromFileMapping,
537 FileMappingFromSharedMemoryHandle)
538#else
541#endif
542
543#undef DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS
544
545// TODO(https://crbug.com/463925491): Remove this type alias once Chromium's
546// "gin" V8 binding migrates off it.
547using PlatformSharedMemoryHandle = std::optional<SharedMemoryHandle>;
548V8_DEPRECATE_SOON("Use std::nullopt instead")
549static constexpr PlatformSharedMemoryHandle kInvalidSharedMemoryHandle =
550 std::nullopt;
551
558 public:
559 virtual ~PageAllocator() = default;
560
565 virtual size_t AllocatePageSize() = 0;
566
571 virtual size_t CommitPageSize() = 0;
572
577 virtual void SetRandomMmapSeed(int64_t seed) = 0;
578
583 virtual void* GetRandomMmapAddr() = 0;
584
594 // Set this when reserving memory that will later require kReadWriteExecute
595 // permissions. The resulting behavior is platform-specific, currently
596 // this is used to set the MAP_JIT flag on Apple Silicon.
597 // TODO(jkummerow): Remove this when Wasm has a platform-independent
598 // w^x implementation.
599 // TODO(saelo): Remove this once all JIT pages are allocated through the
600 // VirtualAddressSpace API.
601 kNoAccessWillJitLater
602 };
603
607 class AllocationHint final {
608 public:
609 AllocationHint() = default;
610
612 void* address) const {
613 return AllocationHint(address, may_grow_);
614 }
615
617 return AllocationHint(address_, true);
618 }
619
620 bool MayGrow() const { return may_grow_; }
621 void* Address() const { return address_; }
622
623 private:
624 constexpr AllocationHint(void* address, bool may_grow)
625 : address_(address), may_grow_(may_grow) {}
626
627 void* address_ = nullptr;
628 bool may_grow_ = false;
629 };
630
634 virtual void* AllocatePages(void* address, size_t length, size_t alignment,
635 Permission permissions) = 0;
636
642 virtual void* AllocatePages(size_t length, size_t alignment,
643 Permission permissions, AllocationHint hint) {
644 return AllocatePages(hint.Address(), length, alignment, permissions);
645 }
646
652 virtual bool ResizeAllocationAt(void* address, size_t old_length,
653 size_t new_length, Permission permissions) {
654 return false;
655 }
656
660 virtual bool FreePages(void* address, size_t length) = 0;
661
665 virtual bool ReleasePages(void* address, size_t length,
666 size_t new_length) = 0;
667
671 virtual bool SetPermissions(void* address, size_t length,
672 Permission permissions) = 0;
673
679 virtual bool RecommitPages(void* address, size_t length,
680 Permission permissions) {
681 // TODO(v8:12797): make it pure once it's implemented on Chromium side.
682 return false;
683 }
684
692 virtual bool DiscardSystemPages(void* address, size_t size) { return true; }
693
702 virtual bool DecommitPages(void* address, size_t size) = 0;
703
712 virtual bool SealPages(void* address, size_t length) {
713 // TODO(360048056): make it pure once it's implemented on Chromium side.
714 return false;
715 }
716
722 public:
723 // Implementations are expected to free the shared memory mapping in the
724 // destructor.
725 virtual ~SharedMemoryMapping() = default;
726 virtual void* GetMemory() const = 0;
727 };
728
734 public:
735 // Implementations are expected to free the shared memory in the destructor.
736 virtual ~SharedMemory() = default;
737 virtual std::unique_ptr<SharedMemoryMapping> RemapTo(
738 void* new_address) const = 0;
739 virtual void* GetMemory() const = 0;
740 virtual size_t GetSize() const = 0;
741 };
742
752 virtual bool ReserveForSharedMemoryMapping(void* address, size_t size) {
753 return false;
754 }
755
765 virtual std::unique_ptr<SharedMemory> AllocateSharedPages(
766 size_t length, const void* original_address) {
767 return {};
768 }
769
778 virtual bool CanAllocateSharedPages() { return false; }
779};
780
788 public:
789 virtual ~Allocator() = default;
790
797 virtual void* Allocate(size_t size) = 0;
798
805 virtual void* AllocateUninitialized(size_t size) = 0;
806
815 virtual void* AllocateUninitializedOrCrash(size_t size) = 0;
816
823 virtual void Free(void* ptr) = 0;
824};
825
835 public:
836 virtual ~ThreadIsolatedAllocator() = default;
837
838 virtual void* Allocate(size_t size) = 0;
839
840 virtual void Free(void* object) = 0;
841
842 enum class Type {
843 kPkey,
844 };
845
846 virtual Type Type() const = 0;
847
851 virtual int Pkey() const { return -1; }
852};
853
857enum class PagePermissions {
858 kNoAccess = 0,
859 kRead = 1,
860 kWrite = 2,
861 kExecute = 4,
866};
867
869 PagePermissions rhs) {
870 return static_cast<PagePermissions>(static_cast<int>(lhs) |
871 static_cast<int>(rhs));
872}
873
875 PagePermissions rhs) {
876 return static_cast<PagePermissions>(static_cast<int>(lhs) &
877 static_cast<int>(rhs));
878}
879
881 lhs = lhs | rhs;
882 return lhs;
883}
884
889inline constexpr bool IsSubset(PagePermissions lhs, PagePermissions rhs) {
890 return (lhs & rhs) == lhs;
891}
892
904 public:
905 using Address = uintptr_t;
906
908 Address base, size_t size,
910 : page_size_(page_size),
911 allocation_granularity_(allocation_granularity),
912 base_(base),
913 size_(size),
914 max_page_permissions_(max_page_permissions) {}
915
916 virtual ~VirtualAddressSpace() = default;
917
925 size_t page_size() const { return page_size_; }
926
935 size_t allocation_granularity() const { return allocation_granularity_; }
936
942 Address base() const { return base_; }
943
949 size_t size() const { return size_; }
950
957 PagePermissions max_page_permissions() const { return max_page_permissions_; }
958
964 bool Contains(Address address) const {
965 return (address >= base()) && (address < base() + size());
966 }
967
974 virtual void SetRandomSeed(int64_t seed) = 0;
975
983
1004 static constexpr Address kNoHint = 0;
1006 AllocatePages(Address hint, size_t size, size_t alignment,
1007 PagePermissions permissions) = 0;
1008
1021 virtual void FreePages(Address address, size_t size) = 0;
1022
1041 Address address, size_t size, PagePermissions permissions) = 0;
1042
1060 size_t size) = 0;
1061
1075 virtual void FreeGuardRegion(Address address, size_t size) = 0;
1076
1098 SharedMemoryHandle handle, uint64_t offset) = 0;
1099
1100 // TODO(https://crbug.com/463925491): Remove me once API users change from
1101 // PlatformSharedMemoryHandle to SharedMemoryHandle.
1102 V8_DEPRECATE_SOON("Use AllocateSharedPages() with SharedMemoryHandle")
1104 Address hint, size_t size, PagePermissions permissions,
1105 std::optional<SharedMemoryHandle> handle, uint64_t offset) {
1106 return AllocateSharedPages(hint, size, permissions, *handle, offset);
1107 }
1108
1121 virtual void FreeSharedPages(Address address, size_t size) = 0;
1122
1135
1144 virtual std::optional<MemoryProtectionKeyId> ActiveMemoryProtectionKey() = 0;
1145
1151 virtual bool CanAllocateSubspaces() = 0;
1152
1153 /*
1154 * Allocate a subspace.
1155 *
1156 * The address space of a subspace stays reserved in the parent space for the
1157 * lifetime of the subspace. As such, it is guaranteed that page allocations
1158 * on the parent space cannot end up inside a subspace.
1159 *
1160 * \param hint Hints where the subspace should be allocated. See
1161 * AllocatePages() for more details.
1162 *
1163 * \param size The size in bytes of the subspace. Must be a multiple of the
1164 * allocation_granularity().
1165 *
1166 * \param alignment The alignment of the subspace in bytes. Must be a multiple
1167 * of the allocation_granularity() and should be a power of two.
1168 *
1169 * \param max_page_permissions The maximum permissions that pages allocated in
1170 * the subspace can obtain.
1171 *
1172 * \param key Optional memory protection key for the subspace. If used, the
1173 * returned subspace will use this key for all its memory pages.
1174 *
1175 * \param handle Optional file descriptor for the subspace. If used, the
1176 * returned subspace will use this file descriptor with 0 offset as the
1177 * space's underlying file.
1178 *
1179 * \returns a new subspace or nullptr on failure.
1180 */
1181 virtual std::unique_ptr<VirtualAddressSpace> AllocateSubspace(
1182 Address hint, size_t size, size_t alignment,
1184 std::optional<MemoryProtectionKeyId> key = std::nullopt,
1185 std::optional<SharedMemoryHandle> handle = std::nullopt) = 0;
1186
1187 //
1188 // TODO(v8) maybe refactor the methods below before stabilizing the API. For
1189 // example by combining them into some form of page operation method that
1190 // takes a command enum as parameter.
1191 //
1192
1209 Address address, size_t size, PagePermissions permissions) = 0;
1210
1222 size_t size) {
1223 return true;
1224 }
1236 size_t size) = 0;
1237
1252 virtual bool SetName(const std::string& name) { return false; }
1253
1254 private:
1255 const size_t page_size_;
1256 const size_t allocation_granularity_;
1257 const Address base_;
1258 const size_t size_;
1259 const PagePermissions max_page_permissions_;
1260};
1261
1267 public:
1268 virtual void EnterSection() {}
1269 virtual void LeaveSection() {}
1270};
1271
1279 public:
1280 virtual ~Platform() = default;
1281
1286 virtual PageAllocator* GetPageAllocator() { return nullptr; }
1287
1295 return nullptr;
1296 }
1297
1306 virtual size_t GetZeroSegmentSize() { return 0; }
1307
1316
1325 virtual int NumberOfWorkerThreads() = 0;
1326
1332 std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(Isolate* isolate) {
1334 }
1335
1341 virtual std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
1342 Isolate* isolate, TaskPriority priority) = 0;
1343
1349 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1350 void CallOnWorkerThread(std::unique_ptr<Task> task,
1351 SourceLocation location = SourceLocation::Current()) {
1353 location);
1354 }
1355
1362 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1364 std::unique_ptr<Task> task,
1365 SourceLocation location = SourceLocation::Current()) {
1366 // Embedders may optionally override this to process these tasks in a high
1367 // priority pool.
1369 location);
1370 }
1371
1377 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1379 std::unique_ptr<Task> task,
1380 SourceLocation location = SourceLocation::Current()) {
1381 // Embedders may optionally override this to process these tasks in a low
1382 // priority pool.
1384 location);
1385 }
1386
1393 V8_DEPRECATE_SOON("Use PostDelayedTaskOnWorkerThread instead.")
1395 std::unique_ptr<Task> task, double delay_in_seconds,
1396 SourceLocation location = SourceLocation::Current()) {
1398 std::move(task), delay_in_seconds,
1399 location);
1400 }
1401
1408 TaskPriority priority, std::unique_ptr<Task> task,
1410 PostTaskOnWorkerThreadImpl(priority, std::move(task), location);
1411 }
1412
1420 TaskPriority priority, std::unique_ptr<Task> task,
1421 double delay_in_seconds,
1423 PostDelayedTaskOnWorkerThreadImpl(priority, std::move(task),
1424 delay_in_seconds, location);
1425 }
1426
1430 virtual bool IdleTasksEnabled(Isolate* isolate) { return false; }
1431
1477 std::unique_ptr<JobHandle> PostJob(
1478 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1480 auto handle = CreateJob(priority, std::move(job_task), location);
1481 handle->NotifyConcurrencyIncrease();
1482 return handle;
1483 }
1484
1500 std::unique_ptr<JobHandle> CreateJob(
1501 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1503 return CreateJobImpl(priority, std::move(job_task), location);
1504 }
1505
1509 virtual std::unique_ptr<ScopedBoostablePriority>
1511 return nullptr;
1512 }
1513
1517 virtual std::unique_ptr<ScopedBlockingCall> CreateBlockingScope(
1518 BlockingType blocking_type) {
1519 return nullptr;
1520 }
1521
1529 virtual double MonotonicallyIncreasingTime() = 0;
1530
1537 return static_cast<int64_t>(floor(CurrentClockTimeMillis()));
1538 }
1539
1545 virtual double CurrentClockTimeMillis() = 0;
1546
1551 return CurrentClockTimeMillis();
1552 }
1553
1554 typedef void (*StackTracePrinter)();
1555
1560 virtual StackTracePrinter GetStackTracePrinter() { return nullptr; }
1561
1566
1571 virtual void DumpWithoutCrashing() {}
1572
1579 static HighAllocationThroughputObserver default_observer;
1580 return &default_observer;
1581 }
1582
1583 protected:
1590
1594 virtual std::unique_ptr<JobHandle> CreateJobImpl(
1595 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1596 const SourceLocation& location) = 0;
1597
1602 std::unique_ptr<Task> task,
1603 const SourceLocation& location) = 0;
1604
1610 TaskPriority priority, std::unique_ptr<Task> task,
1611 double delay_in_seconds, const SourceLocation& location) = 0;
1612};
1613
1614} // namespace v8
1615
1616#endif // V8_V8_PLATFORM_H_
Definition: v8-platform.h:787
virtual void * AllocateUninitializedOrCrash(size_t size)=0
virtual ~Allocator()=default
virtual void * AllocateUninitialized(size_t size)=0
virtual void * Allocate(size_t size)=0
virtual void Free(void *ptr)=0
Definition: v8-platform.h:386
virtual ~ConvertableToTraceFormat()=default
virtual void AppendAsTraceFormat(std::string *out) const =0
Definition: v8-platform.h:1266
virtual void EnterSection()
Definition: v8-platform.h:1268
virtual void LeaveSection()
Definition: v8-platform.h:1269
Definition: v8-platform.h:63
virtual void Run(double deadline_in_seconds)=0
virtual ~IdleTask()=default
Definition: v8-isolate.h:298
Definition: v8-platform.h:214
virtual void NotifyConcurrencyIncrease()=0
virtual bool ShouldYield()=0
virtual bool IsJoiningThread() const =0
virtual uint8_t GetTaskId()=0
Definition: v8-platform.h:249
virtual void NotifyConcurrencyIncrease()=0
virtual void CancelAndDetach()=0
virtual bool IsActive()=0
virtual bool UpdatePriorityEnabled() const
Definition: v8-platform.h:297
virtual bool IsValid()=0
virtual void UpdatePriority(TaskPriority new_priority)
Definition: v8-platform.h:302
virtual void Cancel()=0
virtual ~JobHandle()=default
virtual void Join()=0
Definition: v8-platform.h:308
virtual void Run(JobDelegate *delegate)=0
virtual size_t GetMaxConcurrency(size_t worker_count) const =0
virtual ~JobTask()=default
Definition: v8-platform.h:607
bool MayGrow() const
Definition: v8-platform.h:620
void * Address() const
Definition: v8-platform.h:621
constexpr AllocationHint WithAddress(void *address) const
Definition: v8-platform.h:611
constexpr AllocationHint WithMayGrow() const
Definition: v8-platform.h:616
Definition: v8-platform.h:721
virtual void * GetMemory() const =0
Definition: v8-platform.h:733
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:557
virtual void * GetRandomMmapAddr()=0
virtual bool ResizeAllocationAt(void *address, size_t old_length, size_t new_length, Permission permissions)
Definition: v8-platform.h:652
virtual ~PageAllocator()=default
virtual void * AllocatePages(size_t length, size_t alignment, Permission permissions, AllocationHint hint)
Definition: v8-platform.h:642
virtual bool ReleasePages(void *address, size_t length, size_t new_length)=0
Permission
Definition: v8-platform.h:588
@ kReadExecute
Definition: v8-platform.h:593
@ kRead
Definition: v8-platform.h:590
@ kNoAccess
Definition: v8-platform.h:589
@ kReadWrite
Definition: v8-platform.h:591
@ kReadWriteExecute
Definition: v8-platform.h:592
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:778
virtual bool RecommitPages(void *address, size_t length, Permission permissions)
Definition: v8-platform.h:679
virtual bool SetPermissions(void *address, size_t length, Permission permissions)=0
virtual bool SealPages(void *address, size_t length)
Definition: v8-platform.h:712
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:765
virtual bool DiscardSystemPages(void *address, size_t size)
Definition: v8-platform.h:692
virtual size_t CommitPageSize()=0
virtual bool ReserveForSharedMemoryMapping(void *address, size_t size)
Definition: v8-platform.h:752
Definition: v8-platform.h:1278
virtual std::unique_ptr< ScopedBlockingCall > CreateBlockingScope(BlockingType blocking_type)
Definition: v8-platform.h:1517
void PostTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1407
void CallLowPriorityTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1378
std::unique_ptr< JobHandle > CreateJob(TaskPriority priority, std::unique_ptr< JobTask > job_task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1500
static double SystemClockTimeMillis()
void PostDelayedTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1419
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:1510
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:1394
virtual TracingController * GetTracingController()=0
virtual PageAllocator * GetPageAllocator()
Definition: v8-platform.h:1286
virtual int NumberOfWorkerThreads()=0
virtual double MonotonicallyIncreasingTime()=0
virtual HighAllocationThroughputObserver * GetHighAllocationThroughputObserver()
Definition: v8-platform.h:1578
virtual void OnCriticalMemoryPressure()
Definition: v8-platform.h:1315
void CallBlockingTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1363
virtual int64_t CurrentClockTimeMilliseconds()
Definition: v8-platform.h:1536
virtual double CurrentClockTimeMillis()=0
virtual size_t GetZeroSegmentSize()
Definition: v8-platform.h:1306
virtual StackTracePrinter GetStackTracePrinter()
Definition: v8-platform.h:1560
void(* StackTracePrinter)()
Definition: v8-platform.h:1554
virtual ~Platform()=default
virtual double CurrentClockTimeMillisecondsHighResolution()
Definition: v8-platform.h:1550
virtual void DumpWithoutCrashing()
Definition: v8-platform.h:1571
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:1350
virtual bool IdleTasksEnabled(Isolate *isolate)
Definition: v8-platform.h:1430
std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(Isolate *isolate)
Definition: v8-platform.h:1332
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:1477
virtual ThreadIsolatedAllocator * GetThreadIsolatedAllocator()
Definition: v8-platform.h:1294
Definition: v8-platform.h:378
virtual ~ScopedBlockingCall()=default
Definition: v8-platform.h:331
ScopedBoostablePriority(const ScopedBoostablePriority &)=delete
virtual ~ScopedBoostablePriority()=default
virtual bool BoostPriority()=0
ScopedBoostablePriority & operator=(const ScopedBoostablePriority &other)=delete
Definition: v8-platform.h:482
int PlatformHandle
Definition: v8-platform.h:500
static constexpr SharedMemoryHandle FromPlatformHandle(PlatformHandle handle)
Definition: v8-platform.h:503
PlatformHandle GetPlatformHandle() const
Definition: v8-platform.h:508
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 PostTaskImpl(std::unique_ptr< Task > task, const SourceLocation &location)=0
virtual void PostIdleTaskImpl(std::unique_ptr< IdleTask > task, const SourceLocation &location)
Definition: v8-platform.h:203
TaskRunner(const TaskRunner &)=delete
virtual void PostNonNestableTaskImpl(std::unique_ptr< Task > task, const SourceLocation &location)
Definition: v8-platform.h:189
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:197
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
virtual void PostDelayedTaskImpl(std::unique_ptr< Task > task, double delay_in_seconds, const SourceLocation &location)=0
Definition: v8-platform.h:50
virtual void Run()=0
virtual ~Task()=default
Definition: v8-platform.h:834
virtual int Pkey() const
Definition: v8-platform.h:851
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:842
Definition: v8-platform.h:461
Definition: v8-platform.h:406
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:443
virtual const uint8_t * GetCategoryGroupEnabled(const char *name)
Definition: v8-platform.h:421
virtual ~TracingController()=default
virtual void AddTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:472
virtual void RemoveTraceStateObserver(TraceStateObserver *)
Definition: v8-platform.h:478
virtual void UpdateTraceEventDuration(const uint8_t *category_enabled_flag, const char *name, uint64_t handle)
Definition: v8-platform.h:457
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:434
Definition: v8-platform.h:903
virtual bool CanAllocateSubspaces()=0
Address base() const
Definition: v8-platform.h:942
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:1004
bool Contains(Address address) const
Definition: v8-platform.h:964
uintptr_t Address
Definition: v8-platform.h:905
virtual bool DiscardSystemPages(Address address, size_t size)
Definition: v8-platform.h:1221
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:1252
VirtualAddressSpace(size_t page_size, size_t allocation_granularity, Address base, size_t size, PagePermissions max_page_permissions)
Definition: v8-platform.h:907
int MemoryProtectionKeyId
Definition: v8-platform.h:1134
size_t size() const
Definition: v8-platform.h:949
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:957
virtual std::optional< MemoryProtectionKeyId > ActiveMemoryProtectionKey()=0
size_t allocation_granularity() const
Definition: v8-platform.h:935
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:925
Definition: libplatform.h:15
TaskPriority
Definition: v8-platform.h:25
PagePermissions & operator|=(PagePermissions &lhs, PagePermissions rhs)
Definition: v8-platform.h:880
SharedMemoryHandle SharedMemoryHandleFromFileDescriptor(SharedMemoryHandle::PlatformHandle handle)
Definition: v8-platform.h:540
SharedMemoryHandle::PlatformHandle FileDescriptorFromSharedMemoryHandle(SharedMemoryHandle handle)
Definition: v8-platform.h:540
BlockingType
Definition: v8-platform.h:363
constexpr PagePermissions operator&(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:874
std::optional< SharedMemoryHandle > PlatformSharedMemoryHandle
Definition: v8-platform.h:547
constexpr PagePermissions operator|(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:868
constexpr bool IsSubset(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:889
PagePermissions
Definition: v8-platform.h:857
#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap)
Definition: v8-platform.h:518
#define V8_EXPORT
Definition: v8config.h:874
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:631
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:688