5#ifndef V8_V8_PLATFORM_H_
6#define V8_V8_PLATFORM_H_
27
28
29
30
33
34
35
36
39
40
41
42
48
49
54 virtual void Run() = 0;
58
59
60
61
62
66 virtual void Run(
double deadline_in_seconds) = 0;
70
71
72
73
74
78
79
80
81
82
84 SourceLocation location = SourceLocation::Current()) {
85 PostTaskImpl(std::move(task), location);
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
106 std::unique_ptr<Task> task,
107 SourceLocation location = SourceLocation::Current()) {
108 PostNonNestableTaskImpl(std::move(task), location);
112
113
114
115
116
117
119 SourceLocation location = SourceLocation::Current()) {
120 PostDelayedTaskImpl(std::move(task), delay_in_seconds, location);
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
142 std::unique_ptr<Task> task,
double delay_in_seconds,
143 SourceLocation location = SourceLocation::Current()) {
144 PostNonNestableDelayedTaskImpl(std::move(task), delay_in_seconds, location);
148
149
150
151
152
153
154
155
156
158 SourceLocation location = SourceLocation::Current()) {
159 PostIdleTaskImpl(std::move(task), location);
163
164
168
169
173
174
185
186
188 const SourceLocation& location) {}
190 const SourceLocation& location) {}
192 double delay_in_seconds,
193 const SourceLocation& location) {}
195 double delay_in_seconds,
196 const SourceLocation& location) {}
198 const SourceLocation& location) {}
202
203
204
208
209
210
211
212
216
217
218
219
223
224
225
226
230
231
232
237
238
239
245
246
247
248
252
253
254
255
256
257
261
262
263
267
268
269
270
274
275
279
280
281
282
286
287
291
292
297
298
306
307
308
309
310
311
312
313
314
315
320
321
322
323
324
325
328
329
330
340
341
342
343
344
345
352
353
359
360
361
362
363
368
369
370
371
372
373
381#if !defined(V8_USE_PERFETTO)
383
384
385
386
387
388
390 static uint8_t no = 0;
395
396
397
398
399
400
401
403 char phase,
const uint8_t* category_enabled_flag,
const char* name,
404 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
405 const char** arg_names,
const uint8_t* arg_types,
406 const uint64_t* arg_values,
407 std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
408 unsigned int flags) {
412 char phase,
const uint8_t* category_enabled_flag,
const char* name,
413 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
414 const char** arg_names,
const uint8_t* arg_types,
415 const uint64_t* arg_values,
416 std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
417 unsigned int flags, int64_t timestamp) {
422
423
424
426 const char* name, uint64_t handle) {}
437
438
439
443
444
445
450
451
452
453
459
460
461
465
466
467
471
472
473
477
478
479
483
484
502
503
504 class AllocationHint
final {
509 void* address)
const {
510 return AllocationHint(address, may_grow_);
514 return AllocationHint(address_,
true);
521 constexpr AllocationHint(
void* address,
bool may_grow)
522 : address_(address), may_grow_(may_grow) {}
524 void* address_ =
nullptr;
525 bool may_grow_ =
false;
529
530
535
536
537
538
540 Permission permissions, AllocationHint hint) {
541 return AllocatePages(hint.Address(), length, alignment, permissions);
545
546
547
548
555
556
557 virtual bool FreePages(
void* address, size_t length) = 0;
560
561
563 size_t new_length) = 0;
566
567
572
573
574
575
583
584
585
586
587
588
592
593
594
595
596
597
598
602
603
604
605
606
607
608
615
616
617
627
628
629
635 void* new_address)
const = 0;
641
642
643
644
645
646
647
648
654
655
656
657
658
659
660
661
663 size_t length,
const void* original_address) {
668
669
670
671
672
673
674
679
680
681
682
683
684
685
692 virtual void Free(
void* object) = 0;
701
702
703 virtual int Pkey()
const {
return -1; }
707using PlatformSharedMemoryHandle = intptr_t;
708static constexpr PlatformSharedMemoryHandle kInvalidSharedMemoryHandle = -1;
725 return static_cast<
unsigned int>(
handle);
744 return reinterpret_cast<
void*>(
handle);
749 return static_cast<PlatformSharedMemoryHandle>(fd);
752 PlatformSharedMemoryHandle handle) {
753 return static_cast<
int>(handle);
758
759
769
770
771
772
773
774
775
776
777
780 using Address = uintptr_t;
783 Address base, size_t size,
789 max_page_permissions_(max_page_permissions) {}
794
795
796
797
798
799
803
804
805
806
807
808
809
813
814
815
816
817 Address
base()
const {
return base_; }
820
821
822
823
827
828
829
830
831
835
836
837
838
840 return (address >= base()) && (address < base() + size());
844
845
846
847
848
852
853
854
855
856
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
885
886
887
888
889
890
891
892
893
894
895
896 virtual void FreePages(Address address, size_t size) = 0;
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
938
939
940
941
942
943
944
945
946
947
948
949
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
973 PlatformSharedMemoryHandle handle, uint64_t offset) = 0;
976
977
978
979
980
981
982
983
984
985
986
990
991
992
993
994
995
996
997
998
999
1000 using MemoryProtectionKeyId =
int;
1003
1004
1005
1006
1007
1008
1009
1013
1014
1015
1016
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1044 Address hint, size_t size, size_t alignment,
1046 std::optional<MemoryProtectionKeyId> key = std::nullopt) = 0;
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1073
1074
1075
1076
1077
1078
1079
1080
1081
1087
1088
1089
1090
1091
1092
1093
1094
1095
1100 const size_t page_size_;
1101 const size_t allocation_granularity_;
1102 const Address base_;
1108
1109
1110
1118
1119
1120
1121
1122
1128
1129
1130
1134
1135
1136
1137
1138
1144
1145
1146
1147
1148
1149
1153
1154
1155
1156
1157
1158
1159
1163
1164
1165
1166
1172
1173
1174
1175
1180
1181
1182
1183
1186 SourceLocation location = SourceLocation::Current()) {
1187 PostTaskOnWorkerThreadImpl(TaskPriority::kUserVisible, std::move(task),
1192
1193
1194
1195
1196
1199 std::unique_ptr<Task> task,
1200 SourceLocation location = SourceLocation::Current()) {
1203 PostTaskOnWorkerThreadImpl(TaskPriority::kUserBlocking, std::move(task),
1208
1209
1210
1211
1214 std::unique_ptr<Task> task,
1215 SourceLocation location = SourceLocation::Current()) {
1218 PostTaskOnWorkerThreadImpl(TaskPriority::kBestEffort, std::move(task),
1223
1224
1225
1226
1227
1230 std::unique_ptr<Task> task,
double delay_in_seconds,
1231 SourceLocation location = SourceLocation::Current()) {
1232 PostDelayedTaskOnWorkerThreadImpl(TaskPriority::kUserVisible,
1233 std::move(task), delay_in_seconds,
1238
1239
1240
1241
1244 SourceLocation location = SourceLocation::Current()) {
1245 PostTaskOnWorkerThreadImpl(priority, std::move(task), location);
1249
1250
1251
1252
1253
1256 double delay_in_seconds,
1257 SourceLocation location = SourceLocation::Current()) {
1258 PostDelayedTaskOnWorkerThreadImpl(priority, std::move(task),
1259 delay_in_seconds, location);
1263
1264
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1313 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1314 SourceLocation location = SourceLocation::Current()) {
1315 auto handle = CreateJob(priority, std::move(job_task), location);
1316 handle->NotifyConcurrencyIncrease();
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1336 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1337 SourceLocation location = SourceLocation::Current()) {
1338 return CreateJobImpl(priority, std::move(job_task), location);
1342
1343
1350
1351
1352
1353
1354
1355
1359
1360
1361
1362
1368
1369
1370
1371
1375
1376
1384
1385
1386
1390
1391
1395
1396
1397
1401
1402
1403
1407 return &default_observer;
1412
1413
1414
1415
1419
1420
1422 TaskPriority priority, std::unique_ptr<JobTask> job_task,
1423 const SourceLocation& location) = 0;
1426
1427
1429 std::unique_ptr<Task> task,
1430 const SourceLocation& location) = 0;
1433
1434
1435
1438 double delay_in_seconds,
const SourceLocation& location) = 0;
virtual void LeaveSection()
virtual void EnterSection()
virtual ~IdleTask()=default
virtual void Run(double deadline_in_seconds)=0
virtual bool IsJoiningThread() const =0
virtual uint8_t GetTaskId()=0
virtual bool ShouldYield()=0
virtual void NotifyConcurrencyIncrease()=0
virtual void UpdatePriority(TaskPriority new_priority)
virtual bool UpdatePriorityEnabled() const
virtual void CancelAndDetach()=0
virtual bool IsActive()=0
virtual void NotifyConcurrencyIncrease()=0
virtual ~JobHandle()=default
virtual size_t GetMaxConcurrency(size_t worker_count) const =0
virtual void Run(JobDelegate *delegate)=0
virtual ~JobTask()=default
V8_WARN_UNUSED_RESULT constexpr AllocationHint WithMayGrow() const
V8_WARN_UNUSED_RESULT constexpr AllocationHint WithAddress(void *address) const
virtual std::unique_ptr< SharedMemoryMapping > RemapTo(void *new_address) const =0
virtual size_t GetSize() const =0
virtual void * GetMemory() const =0
virtual ~SharedMemory()=default
virtual ~SharedMemoryMapping()=default
virtual void * GetMemory() const =0
virtual bool SealPages(void *address, size_t length)
virtual std::unique_ptr< SharedMemory > AllocateSharedPages(size_t length, const void *original_address)
virtual bool SetPermissions(void *address, size_t length, Permission permissions)=0
virtual bool CanAllocateSharedPages()
virtual bool DecommitPages(void *address, size_t size)=0
virtual bool ResizeAllocationAt(void *address, size_t old_length, size_t new_length, Permission permissions)
virtual void * AllocatePages(void *address, size_t length, size_t alignment, Permission permissions)=0
virtual bool RecommitPages(void *address, size_t length, Permission permissions)
virtual void * AllocatePages(size_t length, size_t alignment, Permission permissions, AllocationHint hint)
virtual void * GetRandomMmapAddr()=0
virtual size_t CommitPageSize()=0
virtual bool DiscardSystemPages(void *address, size_t size)
virtual bool ReserveForSharedMemoryMapping(void *address, size_t size)
virtual bool ReleasePages(void *address, size_t length, size_t new_length)=0
virtual void SetRandomMmapSeed(int64_t seed)=0
virtual ~PageAllocator()=default
virtual size_t AllocatePageSize()=0
virtual bool FreePages(void *address, size_t length)=0
virtual ~ScopedBlockingCall()=default
virtual bool NonNestableTasksEnabled() const
virtual void PostIdleTaskImpl(std::unique_ptr< IdleTask > task, const SourceLocation &location)
void PostNonNestableDelayedTask(std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
void PostNonNestableTask(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
virtual void PostNonNestableDelayedTaskImpl(std::unique_ptr< Task > task, double delay_in_seconds, const SourceLocation &location)
virtual void PostNonNestableTaskImpl(std::unique_ptr< Task > task, const SourceLocation &location)
void PostIdleTask(std::unique_ptr< IdleTask > task, SourceLocation location=SourceLocation::Current())
virtual void PostTaskImpl(std::unique_ptr< Task > task, const SourceLocation &location)
TaskRunner(const TaskRunner &)=delete
virtual bool NonNestableDelayedTasksEnabled() const
virtual void PostDelayedTaskImpl(std::unique_ptr< Task > task, double delay_in_seconds, const SourceLocation &location)
virtual bool IdleTasksEnabled()=0
virtual ~TaskRunner()=default
TaskRunner & operator=(const TaskRunner &)=delete
void PostDelayedTask(std::unique_ptr< Task > task, double delay_in_seconds, SourceLocation location=SourceLocation::Current())
void PostTask(std::unique_ptr< Task > task, SourceLocation location=SourceLocation::Current())
virtual ~ThreadIsolatedAllocator()=default
virtual void Free(void *object)=0
virtual void * Allocate(size_t size)=0
virtual void OnTraceDisabled()=0
virtual ~TraceStateObserver()=default
virtual void OnTraceEnabled()=0
virtual const uint8_t * GetCategoryGroupEnabled(const char *name)
virtual void AddTraceStateObserver(TraceStateObserver *)
virtual ~TracingController()=default
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)
virtual void UpdateTraceEventDuration(const uint8_t *category_enabled_flag, const char *name, uint64_t handle)
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)
virtual void RemoveTraceStateObserver(TraceStateObserver *)
bool Contains(Address address) const
virtual V8_WARN_UNUSED_RESULT bool DiscardSystemPages(Address address, size_t size)
static constexpr Address kNoHint
VirtualAddressSpace(size_t page_size, size_t allocation_granularity, Address base, size_t size, PagePermissions max_page_permissions)
virtual void SetRandomSeed(int64_t seed)=0
virtual V8_WARN_UNUSED_RESULT bool SetPagePermissions(Address address, size_t size, PagePermissions permissions)=0
size_t allocation_granularity() const
virtual V8_WARN_UNUSED_RESULT Address AllocateSharedPages(Address hint, size_t size, PagePermissions permissions, PlatformSharedMemoryHandle handle, uint64_t offset)=0
virtual void FreeGuardRegion(Address address, size_t size)=0
virtual V8_WARN_UNUSED_RESULT bool DecommitPages(Address address, size_t size)=0
virtual ~VirtualAddressSpace()=default
virtual V8_WARN_UNUSED_RESULT bool RecommitPages(Address address, size_t size, PagePermissions permissions)=0
virtual void FreeSharedPages(Address address, size_t size)=0
virtual V8_WARN_UNUSED_RESULT Address AllocatePages(Address hint, size_t size, size_t alignment, PagePermissions permissions)=0
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)=0
virtual bool CanAllocateSubspaces()=0
virtual Address RandomPageAddress()=0
PagePermissions max_page_permissions() const
virtual std::optional< MemoryProtectionKeyId > ActiveMemoryProtectionKey()=0
virtual V8_WARN_UNUSED_RESULT bool AllocateGuardRegion(Address address, size_t size)=0
PlatformSharedMemoryHandle SharedMemoryHandleFromFileDescriptor(int fd)
int FileDescriptorFromSharedMemoryHandle(PlatformSharedMemoryHandle handle)
#define V8_DEPRECATE_SOON(message)
#define V8_WARN_UNUSED_RESULT