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
779 public:
780 virtual ~Allocator() = default;
781
788 virtual void* Allocate(size_t size) = 0;
789
796 virtual void* AllocateUninitialized(size_t size) = 0;
797
806 virtual void* AllocateUninitializedOrCrash(size_t size) = 0;
807
814 virtual void Free(void* ptr) = 0;
815};
816
826 public:
827 virtual ~ThreadIsolatedAllocator() = default;
828
829 virtual void* Allocate(size_t size) = 0;
830
831 virtual void Free(void* object) = 0;
832
833 enum class Type {
834 kPkey,
835 };
836
837 virtual Type Type() const = 0;
838
842 virtual int Pkey() const { return -1; }
843};
844
848enum class PagePermissions {
849 kNoAccess = 0,
850 kRead = 1,
851 kWrite = 2,
852 kExecute = 4,
857};
858
860 PagePermissions rhs) {
861 return static_cast<PagePermissions>(static_cast<int>(lhs) |
862 static_cast<int>(rhs));
863}
864
866 PagePermissions rhs) {
867 return static_cast<PagePermissions>(static_cast<int>(lhs) &
868 static_cast<int>(rhs));
869}
870
872 lhs = lhs | rhs;
873 return lhs;
874}
875
880inline constexpr bool IsSubset(PagePermissions lhs, PagePermissions rhs) {
881 return (lhs & rhs) == lhs;
882}
883
895 public:
896 using Address = uintptr_t;
897
899 Address base, size_t size,
901 : page_size_(page_size),
902 allocation_granularity_(allocation_granularity),
903 base_(base),
904 size_(size),
905 max_page_permissions_(max_page_permissions) {}
906
907 virtual ~VirtualAddressSpace() = default;
908
916 size_t page_size() const { return page_size_; }
917
926 size_t allocation_granularity() const { return allocation_granularity_; }
927
933 Address base() const { return base_; }
934
940 size_t size() const { return size_; }
941
948 PagePermissions max_page_permissions() const { return max_page_permissions_; }
949
955 bool Contains(Address address) const {
956 return (address >= base()) && (address < base() + size());
957 }
958
965 virtual void SetRandomSeed(int64_t seed) = 0;
966
974
995 static constexpr Address kNoHint = 0;
997 AllocatePages(Address hint, size_t size, size_t alignment,
998 PagePermissions permissions) = 0;
999
1012 virtual void FreePages(Address address, size_t size) = 0;
1013
1032 Address address, size_t size, PagePermissions permissions) = 0;
1033
1051 size_t size) = 0;
1052
1066 virtual void FreeGuardRegion(Address address, size_t size) = 0;
1067
1089 SharedMemoryHandle handle, uint64_t offset) = 0;
1090
1091 // TODO(https://crbug.com/463925491): Remove me once API users change from
1092 // PlatformSharedMemoryHandle to SharedMemoryHandle.
1093 V8_DEPRECATE_SOON("Use AllocateSharedPages() with SharedMemoryHandle")
1095 Address hint, size_t size, PagePermissions permissions,
1096 std::optional<SharedMemoryHandle> handle, uint64_t offset) {
1097 return AllocateSharedPages(hint, size, permissions, *handle, offset);
1098 }
1099
1112 virtual void FreeSharedPages(Address address, size_t size) = 0;
1113
1126
1135 virtual std::optional<MemoryProtectionKeyId> ActiveMemoryProtectionKey() = 0;
1136
1142 virtual bool CanAllocateSubspaces() = 0;
1143
1144 /*
1145 * Allocate a subspace.
1146 *
1147 * The address space of a subspace stays reserved in the parent space for the
1148 * lifetime of the subspace. As such, it is guaranteed that page allocations
1149 * on the parent space cannot end up inside a subspace.
1150 *
1151 * \param hint Hints where the subspace should be allocated. See
1152 * AllocatePages() for more details.
1153 *
1154 * \param size The size in bytes of the subspace. Must be a multiple of the
1155 * allocation_granularity().
1156 *
1157 * \param alignment The alignment of the subspace in bytes. Must be a multiple
1158 * of the allocation_granularity() and should be a power of two.
1159 *
1160 * \param max_page_permissions The maximum permissions that pages allocated in
1161 * the subspace can obtain.
1162 *
1163 * \param key Optional memory protection key for the subspace. If used, the
1164 * returned subspace will use this key for all its memory pages.
1165 *
1166 * \param handle Optional file descriptor for the subspace. If used, the
1167 * returned subspace will use this file descriptor with 0 offset as the
1168 * space's underlying file.
1169 *
1170 * \returns a new subspace or nullptr on failure.
1171 */
1172 virtual std::unique_ptr<VirtualAddressSpace> AllocateSubspace(
1173 Address hint, size_t size, size_t alignment,
1175 std::optional<MemoryProtectionKeyId> key = std::nullopt,
1176 std::optional<SharedMemoryHandle> handle = std::nullopt) = 0;
1177
1178 //
1179 // TODO(v8) maybe refactor the methods below before stabilizing the API. For
1180 // example by combining them into some form of page operation method that
1181 // takes a command enum as parameter.
1182 //
1183
1200 Address address, size_t size, PagePermissions permissions) = 0;
1201
1213 size_t size) {
1214 return true;
1215 }
1227 size_t size) = 0;
1228
1243 virtual bool SetName(const std::string& name) { return false; }
1244
1245 private:
1246 const size_t page_size_;
1247 const size_t allocation_granularity_;
1248 const Address base_;
1249 const size_t size_;
1250 const PagePermissions max_page_permissions_;
1251};
1252
1258 public:
1259 virtual void EnterSection() {}
1260 virtual void LeaveSection() {}
1261};
1262
1270 public:
1271 virtual ~Platform() = default;
1272
1277 virtual PageAllocator* GetPageAllocator() { return nullptr; }
1278
1286 return nullptr;
1287 }
1288
1297 virtual size_t GetZeroSegmentSize() { return 0; }
1298
1307
1316 virtual int NumberOfWorkerThreads() = 0;
1317
1323 std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(Isolate* isolate) {
1325 }
1326
1332 virtual std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
1333 Isolate* isolate, TaskPriority priority) = 0;
1334
1340 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1341 void CallOnWorkerThread(std::unique_ptr<Task> task,
1342 SourceLocation location = SourceLocation::Current()) {
1344 location);
1345 }
1346
1353 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1355 std::unique_ptr<Task> task,
1356 SourceLocation location = SourceLocation::Current()) {
1357 // Embedders may optionally override this to process these tasks in a high
1358 // priority pool.
1360 location);
1361 }
1362
1368 V8_DEPRECATE_SOON("Use PostTaskOnWorkerThread instead.")
1370 std::unique_ptr<Task> task,
1371 SourceLocation location = SourceLocation::Current()) {
1372 // Embedders may optionally override this to process these tasks in a low
1373 // priority pool.
1375 location);
1376 }
1377
1384 V8_DEPRECATE_SOON("Use PostDelayedTaskOnWorkerThread instead.")
1386 std::unique_ptr<Task> task, double delay_in_seconds,
1387 SourceLocation location = SourceLocation::Current()) {
1389 std::move(task), delay_in_seconds,
1390 location);
1391 }
1392
1399 TaskPriority priority, std::unique_ptr<Task> task,
1401 PostTaskOnWorkerThreadImpl(priority, std::move(task), location);
1402 }
1403
1411 TaskPriority priority, std::unique_ptr<Task> task,
1412 double delay_in_seconds,
1414 PostDelayedTaskOnWorkerThreadImpl(priority, std::move(task),
1415 delay_in_seconds, location);
1416 }
1417
1421 virtual bool IdleTasksEnabled(Isolate* isolate) { return false; }
1422
1468 std::unique_ptr<JobHandle> PostJob(
1469 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1471 auto handle = CreateJob(priority, std::move(job_task), location);
1472 handle->NotifyConcurrencyIncrease();
1473 return handle;
1474 }
1475
1491 std::unique_ptr<JobHandle> CreateJob(
1492 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1494 return CreateJobImpl(priority, std::move(job_task), location);
1495 }
1496
1500 virtual std::unique_ptr<ScopedBoostablePriority>
1502 return nullptr;
1503 }
1504
1508 virtual std::unique_ptr<ScopedBlockingCall> CreateBlockingScope(
1509 BlockingType blocking_type) {
1510 return nullptr;
1511 }
1512
1520 virtual double MonotonicallyIncreasingTime() = 0;
1521
1528 return static_cast<int64_t>(floor(CurrentClockTimeMillis()));
1529 }
1530
1536 virtual double CurrentClockTimeMillis() = 0;
1537
1542 return CurrentClockTimeMillis();
1543 }
1544
1545 typedef void (*StackTracePrinter)();
1546
1551 virtual StackTracePrinter GetStackTracePrinter() { return nullptr; }
1552
1557
1562 virtual void DumpWithoutCrashing() {}
1563
1570 static HighAllocationThroughputObserver default_observer;
1571 return &default_observer;
1572 }
1573
1574 protected:
1581
1585 virtual std::unique_ptr<JobHandle> CreateJobImpl(
1586 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1587 const SourceLocation& location) = 0;
1588
1593 std::unique_ptr<Task> task,
1594 const SourceLocation& location) = 0;
1595
1601 TaskPriority priority, std::unique_ptr<Task> task,
1602 double delay_in_seconds, const SourceLocation& location) = 0;
1603};
1604
1605} // namespace v8
1606
1607#endif // V8_V8_PLATFORM_H_
Definition: v8-platform.h:778
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:377
virtual ~ConvertableToTraceFormat()=default
virtual void AppendAsTraceFormat(std::string *out) const =0
Definition: v8-platform.h:1257
virtual void EnterSection()
Definition: v8-platform.h:1259
virtual void LeaveSection()
Definition: v8-platform.h:1260
Definition: v8-platform.h:63
virtual void Run(double deadline_in_seconds)=0
virtual ~IdleTask()=default
Definition: v8-isolate.h:292
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:1269
virtual std::unique_ptr< ScopedBlockingCall > CreateBlockingScope(BlockingType blocking_type)
Definition: v8-platform.h:1508
void PostTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1398
void CallLowPriorityTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1369
std::unique_ptr< JobHandle > CreateJob(TaskPriority priority, std::unique_ptr< JobTask > job_task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1491
static double SystemClockTimeMillis()
void PostDelayedTaskOnWorkerThread(TaskPriority priority, std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1410
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:1501
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:1385
virtual TracingController * GetTracingController()=0
virtual PageAllocator * GetPageAllocator()
Definition: v8-platform.h:1277
virtual int NumberOfWorkerThreads()=0
virtual double MonotonicallyIncreasingTime()=0
virtual HighAllocationThroughputObserver * GetHighAllocationThroughputObserver()
Definition: v8-platform.h:1569
virtual void OnCriticalMemoryPressure()
Definition: v8-platform.h:1306
void CallBlockingTaskOnWorkerThread(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
Definition: v8-platform.h:1354
virtual int64_t CurrentClockTimeMilliseconds()
Definition: v8-platform.h:1527
virtual double CurrentClockTimeMillis()=0
virtual size_t GetZeroSegmentSize()
Definition: v8-platform.h:1297
virtual StackTracePrinter GetStackTracePrinter()
Definition: v8-platform.h:1551
void(* StackTracePrinter)()
Definition: v8-platform.h:1545
virtual ~Platform()=default
virtual double CurrentClockTimeMillisecondsHighResolution()
Definition: v8-platform.h:1541
virtual void DumpWithoutCrashing()
Definition: v8-platform.h:1562
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:1341
virtual bool IdleTasksEnabled(Isolate *isolate)
Definition: v8-platform.h:1421
std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(Isolate *isolate)
Definition: v8-platform.h:1323
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:1468
virtual ThreadIsolatedAllocator * GetThreadIsolatedAllocator()
Definition: v8-platform.h:1285
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:825
virtual int Pkey() const
Definition: v8-platform.h:842
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:833
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:894
virtual bool CanAllocateSubspaces()=0
Address base() const
Definition: v8-platform.h:933
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:995
bool Contains(Address address) const
Definition: v8-platform.h:955
uintptr_t Address
Definition: v8-platform.h:896
virtual bool DiscardSystemPages(Address address, size_t size)
Definition: v8-platform.h:1212
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:1243
VirtualAddressSpace(size_t page_size, size_t allocation_granularity, Address base, size_t size, PagePermissions max_page_permissions)
Definition: v8-platform.h:898
int MemoryProtectionKeyId
Definition: v8-platform.h:1125
size_t size() const
Definition: v8-platform.h:940
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:948
virtual std::optional< MemoryProtectionKeyId > ActiveMemoryProtectionKey()=0
size_t allocation_granularity() const
Definition: v8-platform.h:926
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:916
Definition: libplatform.h:15
TaskPriority
Definition: v8-platform.h:25
PagePermissions & operator|=(PagePermissions &lhs, PagePermissions rhs)
Definition: v8-platform.h:871
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:865
std::optional< SharedMemoryHandle > PlatformSharedMemoryHandle
Definition: v8-platform.h:538
constexpr PagePermissions operator|(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:859
constexpr bool IsSubset(PagePermissions lhs, PagePermissions rhs)
Definition: v8-platform.h:880
PagePermissions
Definition: v8-platform.h:848
#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap)
Definition: v8-platform.h:509
#define V8_EXPORT
Definition: v8config.h:867
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:624
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:681