14#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__)
15#include <pthread_np.h>
26#if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
27 defined(__NetBSD__) || defined(__OpenBSD__)
28#include <sys/sysctl.h>
31#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT)
33#include <android/log.h>
48#ifdef V8_FAST_TLS_SUPPORTED
52#if V8_OS_DARWIN || V8_OS_LINUX
58#include <malloc/malloc.h>
60#include <sys/malloc.h>
69#if defined(V8_OS_FUCHSIA)
70#include <zircon/process.h>
72#include <sys/resource.h>
75#if !defined(_AIX) && !defined(V8_OS_FUCHSIA) && !V8_OS_ZOS
76#include <sys/syscall.h>
79#if V8_OS_FREEBSD || V8_OS_DARWIN || V8_OS_OPENBSD || V8_OS_SOLARIS
80#define MAP_ANONYMOUS MAP_ANON
83#if defined(V8_OS_SOLARIS)
84#if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE > 2) || defined(__EXTENSIONS__)
85extern "C" int madvise(caddr_t,
size_t,
int);
87extern int madvise(caddr_t,
size_t,
int);
92#define MADV_FREE MADV_DONTNEED
95#if defined(V8_LIBC_GLIBC)
96extern "C" void* __libc_stack_end;
108const pthread_t
kNoThread =
static_cast<pthread_t
>(0);
111const char* g_gc_fake_mmap =
nullptr;
114 GetPlatformRandomNumberGenerator)
117#if !V8_OS_FUCHSIA && !V8_OS_ZOS
122const int kMmapFd = VM_MAKE_TAG(255);
124const int kMmapFd = -1;
127#if defined(V8_TARGET_OS_MACOS) && V8_HOST_ARCH_ARM64
131constexpr int kAppleArmPageSize = 1 << 14;
134const int kMmapFdOffset = 0;
136enum class PageType { kShared, kPrivate };
139 PageType page_type) {
140 int flags = MAP_ANONYMOUS;
141 flags |= (page_type == PageType::kShared) ? MAP_SHARED : MAP_PRIVATE;
144#if !V8_OS_AIX && !V8_OS_FREEBSD && !V8_OS_QNX
145 flags |= MAP_NORESERVE;
165 PageType page_type) {
167 int flags = GetFlagsForMemoryPermission(access, page_type);
168 void*
result = mmap(hint, size, prot, flags, kMmapFd, kMmapFdOffset);
169 if (
result == MAP_FAILED)
return nullptr;
171#if V8_OS_LINUX && V8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION
173 madvise(
result, size, MADV_DONTFORK);
177 if (
result !=
nullptr && size >= kHugePageSize) {
178 const uintptr_t huge_start =
180 const uintptr_t huge_end =
182 if (huge_end > huge_start) {
185 madvise(
reinterpret_cast<void*
>(huge_start), huge_end - huge_start,
208 return PROT_READ | PROT_WRITE;
210 return PROT_READ | PROT_WRITE | PROT_EXEC;
212 return PROT_READ | PROT_EXEC;
217#if V8_OS_LINUX || V8_OS_FREEBSD
230 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
231#if GCC_VERSION >= 40600 && !defined(__clang__)
232#if defined(__ARM_PCS_VFP)
238#elif GCC_VERSION < 40500 && !defined(__clang__)
242#if defined(__ARM_PCS_VFP)
244#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
249 "Your version of compiler does not report the FP ABI compiled for." \
250 "Please report it on this issue" \
251 "http://code.google.com/p/v8/issues/detail?id=2140"
262 const char*
const gc_fake_mmap) {
264 g_gc_fake_mmap = gc_fake_mmap;
276#if V8_TARGET_ARCH_ARM
280#elif V8_TARGET_ARCH_MIPS
282#elif V8_TARGET_ARCH_S390X
296#if defined(V8_TARGET_OS_MACOS) && V8_HOST_ARCH_ARM64
297 return kAppleArmPageSize;
299 static size_t page_size =
static_cast<size_t>(sysconf(_SC_PAGESIZE));
314 GetPlatformRandomNumberGenerator()->SetSeed(seed);
323 GetPlatformRandomNumberGenerator()->NextBytes(&raw_addr,
sizeof(raw_addr));
325#if V8_HOST_ARCH_ARM64
326#if defined(V8_TARGET_OS_MACOS)
333#if defined(V8_USE_ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \
334 defined(THREAD_SANITIZER) || defined(LEAK_SANITIZER)
339 raw_addr &= 0x007fffff0000ULL;
340 raw_addr += 0x7e8000000000ULL;
342#if V8_TARGET_ARCH_X64
346 raw_addr &= uint64_t{0x3FFFFFFFF000};
347#elif V8_TARGET_ARCH_ARM64
348#if defined(V8_TARGET_OS_LINUX) || defined(V8_TARGET_OS_ANDROID)
351 raw_addr &= uint64_t{0x3FFFFFF000};
354 raw_addr &= uint64_t{0x3FFFFFFFF000};
356#elif V8_TARGET_ARCH_PPC64
360 raw_addr &= uint64_t{0x3FFFF000};
362 raw_addr += uint64_t{0x400000000000};
365 raw_addr &= uint64_t{0x3FFFFFFF0000};
367#elif V8_TARGET_ARCH_S390X
371 raw_addr &= uint64_t{0xFFFFFFF000};
372#elif V8_TARGET_ARCH_MIPS64
375 raw_addr &= uint64_t{0xFFFFFF0000};
376#elif V8_TARGET_ARCH_RISCV64
379 raw_addr &= uint64_t{0xFFFFFF0000};
380#elif V8_TARGET_ARCH_RISCV32
383 raw_addr &= 0x3FFFF000;
384#elif V8_TARGET_ARCH_LOONG64
387 raw_addr &= uint64_t{0x3FFFFF0000};
389 raw_addr &= 0x3FFFF000;
401 raw_addr += 0x80000000;
405 raw_addr += 0x90000000;
410 raw_addr += 0x20000000;
414 return reinterpret_cast<void*
>(raw_addr);
418#if !V8_OS_CYGWIN && !V8_OS_FUCHSIA
421void*
OS::Allocate(
void* hint,
size_t size,
size_t alignment,
422 MemoryPermission access) {
428 size_t request_size = size + (alignment - page_size);
431 if (
result ==
nullptr)
return nullptr;
434 uint8_t*
base =
static_cast<uint8_t*
>(
result);
435 uint8_t* aligned_base =
reinterpret_cast<uint8_t*
>(
436 RoundUp(
reinterpret_cast<uintptr_t
>(base), alignment));
437 if (aligned_base != base) {
439 size_t prefix_size =
static_cast<size_t>(aligned_base -
base);
440 Free(base, prefix_size);
441 request_size -= prefix_size;
444 if (size != request_size) {
446 size_t suffix_size = request_size -
size;
447 Free(aligned_base + size, suffix_size);
448 request_size -= suffix_size;
452 return static_cast<void*
>(aligned_base);
462void OS::Free(
void* address,
size_t size) {
469#if !defined(V8_OS_DARWIN)
476 void*
result = mmap(hint, size, prot, MAP_SHARED, fd,
offset);
477 if (
result == MAP_FAILED)
return nullptr;
501 int ret = mprotect(address, size, prot);
507 if (ret != 0)
CHECK_EQ(ENOMEM, errno);
511#if defined(V8_OS_DARWIN)
513 ret = madvise(address, size, MADV_FREE_REUSABLE);
529#if defined(V8_OS_DARWIN)
531 madvise(address, size, MADV_FREE_REUSE);
543 if (mprotect(address, size, PROT_READ) != 0) {
544 FATAL(
"Failed to protect data memory at %p +%zu; error %d\n", address, size,
554#if defined(V8_OS_DARWIN)
555 while (madvise(address, size, MADV_FREE_REUSE) == -1 && errno == EAGAIN) {
567#if defined(V8_OS_DARWIN)
573 ret = madvise(address, size, MADV_FREE_REUSABLE);
574 }
while (ret != 0 && errno == EAGAIN);
577 ret = madvise(address, size, MADV_DONTNEED);
579#elif defined(_AIX) || defined(V8_OS_SOLARIS)
580 int ret = madvise(
reinterpret_cast<caddr_t
>(address), size,
MADV_FREE);
581 if (ret != 0 && errno == ENOSYS) {
584 if (ret != 0 && errno == EINVAL) {
585 ret = madvise(
reinterpret_cast<caddr_t
>(address), size, MADV_DONTNEED);
588 int ret = madvise(address, size, MADV_DONTNEED);
608 void* ret = mmap(address, size, PROT_NONE,
609 MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
623#ifdef V8_ENABLE_MEMORY_SEALING
624#if V8_OS_LINUX && defined(__NR_mseal)
625 long ret = syscall(__NR_mseal, address, size, 0);
640 void* hint,
size_t size,
size_t alignment,
641 MemoryPermission max_permission) {
648 void* reservation =
Allocate(hint, size, alignment, permission);
652 reservation =
Allocate(hint, size, alignment, permission);
655 if (!reservation)
return {};
662 Free(reservation.base(), reservation.size());
666#if !defined(V8_OS_DARWIN)
671#if V8_OS_LINUX && !V8_OS_ANDROID
673 using memfd_create_t = int (*)(
const char*,
unsigned int);
674 memfd_create_t memfd_create =
675 reinterpret_cast<memfd_create_t
>(dlsym(RTLD_DEFAULT,
"memfd_create"));
678 fd = memfd_create(
"V8MemFDForTesting", 0);
681 char filename[] =
"/tmp/v8_tmp_file_for_testing_XXXXXX";
704#if V8_OS_AIX || V8_OS_LINUX || V8_OS_DARWIN
714const char* OS::GetGCFakeMMapFile() {
715 return g_gc_fake_mmap;
720 usleep(
static_cast<useconds_t
>(interval.InMicroseconds()));
743#elif V8_HOST_ARCH_ARM64
745#elif V8_HOST_ARCH_MIPS
747#elif V8_HOST_ARCH_MIPS64
749#elif V8_HOST_ARCH_LOONG64
751#elif V8_HOST_ARCH_PPC64
753#elif V8_HOST_ARCH_IA32
755#elif V8_HOST_ARCH_X64
759#elif V8_HOST_ARCH_S390X
761 asm volatile(
".word 0x0001");
762#elif V8_HOST_ARCH_RISCV64
764#elif V8_HOST_ARCH_RISCV32
767#error Unsupported host architecture.
777 void* memory() const final {
return memory_; }
793 if (stat(name, &statbuf) == 0 && !S_ISDIR(statbuf.st_mode)) {
794 if (FILE* file = fopen(name, fopen_mode)) {
795 if (fseek(file, 0, SEEK_END) == 0) {
796 long size = ftell(file);
799 int prot = PROT_READ;
800 int flags = MAP_PRIVATE;
807 if (memory != MAP_FAILED) {
820 size_t size,
void* initial) {
821 if (FILE* file = fopen(name,
"w+")) {
823 size_t result = fwrite(initial, 1, size, file);
824 if (
result == size && !ferror(file)) {
826 PROT_READ | PROT_WRITE, MAP_SHARED, fileno(file), 0);
827 if (memory != MAP_FAILED) {
844 return static_cast<int>(getpid());
848#if V8_OS_DARWIN || (V8_OS_ANDROID && defined(__APPLE__))
849 return static_cast<int>(pthread_mach_thread_np(pthread_self()));
851 return static_cast<int>(syscall(__NR_gettid));
853 return static_cast<int>(gettid());
855 return static_cast<int>(thread_self());
857 return static_cast<int>(zx_thread_self());
859 return static_cast<int>(pthread_self());
863 return static_cast<int>(
reinterpret_cast<intptr_t
>(pthread_self()));
879#if !defined(V8_OS_FUCHSIA)
883 if (getrusage(RUSAGE_SELF, &usage) < 0)
return -1;
884 *secs =
static_cast<uint32_t
>(usage.ru_utime.tv_sec);
885 *usecs =
static_cast<uint32_t
>(usage.ru_utime.tv_usec);
891#if defined(V8_OS_FUCHSIA)
894#elif defined(V8_OS_ZOS)
899 if (getrusage(RUSAGE_SELF, &usage) < 0)
return -1;
901#if defined(V8_OS_MACOS) || defined(V8_OS_IOS)
902 constexpr int KB = 1024;
904 return static_cast<int>(usage.ru_maxrss /
KB);
907 return static_cast<int>(usage.ru_maxrss);
917 if (std::isnan(time))
return std::numeric_limits<double>::quiet_NaN();
918 time_t tv =
static_cast<time_t
>(std::floor(time/
msPerSecond));
920 struct tm* t = localtime_r(&tv, &tm);
921 if (
nullptr == t)
return std::numeric_limits<double>::quiet_NaN();
936 FILE* file = fopen(path, mode);
937 if (file ==
nullptr)
return nullptr;
938 struct stat file_stat;
939 if (fstat(fileno(file), &file_stat) != 0) {
943 bool is_regular_file = ((file_stat.st_mode & S_IFREG) != 0);
944 if (is_regular_file)
return file;
951 return (remove(path) == 0);
967void OS::Print(
const char* format, ...) {
969 va_start(
args, format);
970 VPrint(format,
args);
975void OS::VPrint(
const char* format, va_list
args) {
976#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT)
977 __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format,
args);
979 vprintf(format,
args);
984void OS::FPrint(FILE* out,
const char* format, ...) {
986 va_start(
args, format);
987 VFPrint(out, format,
args);
992void OS::VFPrint(FILE* out,
const char* format, va_list
args) {
993#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT)
995 __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format,
args);
999 vfprintf(out, format,
args);
1003void OS::PrintError(
const char* format, ...) {
1005 va_start(
args, format);
1006 VPrintError(format,
args);
1012void OS::VPrintError(
const char* format, va_list
args) {
1013#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT)
1014 __android_log_vprint(ANDROID_LOG_ERROR, LOG_TAG, format,
args);
1016 vfprintf(stderr, format,
args);
1021int OS::SNPrintF(
char* str,
int length,
const char* format, ...) {
1023 va_start(
args, format);
1030int OS::VSNPrintF(
char* str,
1034 int n = vsnprintf(str, length, format,
args);
1038 str[length - 1] =
'\0';
1051 strncpy(dest, src, n);
1058#if !V8_OS_CYGWIN && !V8_OS_FUCHSIA
1060std::optional<AddressSpaceReservation>
1063 DCHECK(Contains(address, size));
1080 DCHECK(Contains(address, size));
1091 DCHECK(Contains(address, size));
1096#if !defined(V8_OS_ZOS)
1098#if !defined(V8_OS_DARWIN)
1103 DCHECK(Contains(address, size));
1106 return mmap(address, size, prot, MAP_SHARED | MAP_FIXED, fd,
offset) !=
1112 DCHECK(Contains(address, size));
1113 return mmap(address, size, PROT_NONE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE,
1120 DCHECK(Contains(address, size));
1126 DCHECK(Contains(address, size));
1131 DCHECK(Contains(address, size));
1136 DCHECK(Contains(address, size));
1146class Thread::PlatformData {
1156 stack_size_(options.stack_size()),
1158 start_semaphore_(nullptr) {
1159 const int min_stack_size =
static_cast<int>(PTHREAD_STACK_MIN);
1170#if V8_OS_DRAGONFLYBSD || V8_OS_FREEBSD || V8_OS_OPENBSD
1171 pthread_set_name_np(pthread_self(), name);
1174 pthread_setname_np(pthread_self(),
"%s", name);
1178 int (*dynamic_pthread_setname_np)(
const char*);
1179 *
reinterpret_cast<void**
>(&dynamic_pthread_setname_np) =
1180 dlsym(RTLD_DEFAULT,
"pthread_setname_np");
1181 if (dynamic_pthread_setname_np ==
nullptr)
return;
1184 static const int kMaxNameLength = 63;
1186 dynamic_pthread_setname_np(name);
1187#elif defined(PR_SET_NAME)
1189 reinterpret_cast<unsigned long>(name),
1199 {
MutexGuard lock_guard(&thread->data()->thread_creation_mutex_); }
1202 switch (thread->priority()) {
1204 pthread_set_qos_class_self_np(QOS_CLASS_BACKGROUND, 0);
1207 pthread_set_qos_class_self_np(QOS_CLASS_USER_INITIATED, -1);
1210 pthread_set_qos_class_self_np(QOS_CLASS_USER_INITIATED, 0);
1215#elif V8_OS_LINUX || V8_OS_ZOS
1216 switch (thread->priority()) {
1218 setpriority(PRIO_PROCESS, 0, 10);
1221 setpriority(PRIO_PROCESS, 0, 1);
1224 setpriority(PRIO_PROCESS, 0, 0);
1231 thread->NotifyStartedAndRun();
1243 pthread_attr_t attr;
1244 memset(&attr, 0,
sizeof(attr));
1245 result = pthread_attr_init(&attr);
1246 if (
result != 0)
return false;
1248 if (stack_size == 0) {
1251 stack_size = 1 * 1024 * 1024;
1254 stack_size = 2 * 1024 * 1024;
1257 if (stack_size > 0) {
1258 result = pthread_attr_setstacksize(&attr, stack_size);
1259 if (
result != 0)
return pthread_attr_destroy(&attr),
false;
1265 return pthread_attr_destroy(&attr),
false;
1268 result = pthread_attr_destroy(&attr);
1280 intptr_t ptr_key =
reinterpret_cast<intptr_t
>(pthread_key);
1291 intptr_t ptr_key =
static_cast<intptr_t
>(local_key);
1292 return reinterpret_cast<pthread_key_t
>(ptr_key);
1294 return static_cast<pthread_key_t
>(local_key);
1298#if defined(V8_FAST_TLS_SUPPORTED) && defined(DEBUG)
1301 void* expected =
reinterpret_cast<void*
>(0x1234CAFE);
1304 if (expected != actual) {
1305 FATAL(
"V8 failed to initialize fast TLS on current kernel");
1314 int result = pthread_key_create(&
key,
nullptr);
1318#if defined(V8_FAST_TLS_SUPPORTED) && defined(DEBUG)
1319 CheckFastTls(local_key);
1326 int result = pthread_key_delete(pthread_key);
1334 return pthread_getspecific(pthread_key);
1340 int result = pthread_setspecific(pthread_key, value);
1348#if !defined(V8_OS_FREEBSD) && !defined(V8_OS_DARWIN) && !defined(_AIX) && \
1349 !defined(V8_OS_SOLARIS)
1353bool MainThreadIsCurrentThread() {
1357 static int main_thread_id = -1;
1358 if (main_thread_id == -1) {
1369 return __get_stack_start();
1372 int error = pthread_stackseg_np(pthread_self(), &stack);
1374 DCHECK(MainThreadIsCurrentThread());
1377 void* stack_start =
reinterpret_cast<uint8_t*
>(stack.ss_sp) + stack.ss_size;
1380 pthread_attr_t attr;
1381 int error = pthread_getattr_np(pthread_self(), &attr);
1383 DCHECK(MainThreadIsCurrentThread());
1384#if defined(V8_LIBC_GLIBC)
1388 return __libc_stack_end;
1395 error = pthread_attr_getstack(&attr, &base, &size);
1397 pthread_attr_destroy(&attr);
1398 void* stack_start =
reinterpret_cast<uint8_t*
>(
base) + size;
1399#if defined(V8_LIBC_GLIBC)
1403 if ((base <= __libc_stack_end) && (__libc_stack_end <= stack_start)) {
1404 DCHECK(MainThreadIsCurrentThread());
1405 return __libc_stack_end;
1417 return __builtin_frame_address(0);
uint8_t data_[MAX_STACK_LENGTH]
V8_WARN_UNUSED_RESULT bool DiscardSystemPages(void *address, size_t size)
V8_WARN_UNUSED_RESULT bool Allocate(void *address, size_t size, OS::MemoryPermission access)
V8_WARN_UNUSED_RESULT bool RecommitPages(void *address, size_t size, OS::MemoryPermission access)
V8_WARN_UNUSED_RESULT bool Free(void *address, size_t size)
V8_WARN_UNUSED_RESULT bool SetPermissions(void *address, size_t size, OS::MemoryPermission access)
V8_WARN_UNUSED_RESULT bool DecommitPages(void *address, size_t size)
V8_WARN_UNUSED_RESULT bool FreeShared(void *address, size_t size)
V8_WARN_UNUSED_RESULT std::optional< AddressSpaceReservation > CreateSubReservation(void *address, size_t size, OS::MemoryPermission max_permission)
V8_WARN_UNUSED_RESULT bool AllocateShared(void *address, size_t size, OS::MemoryPermission access, PlatformSharedMemoryHandle handle, uint64_t offset)
static V8_WARN_UNUSED_RESULT bool FreeSubReservation(AddressSpaceReservation reservation)
static MemoryMappedFile * create(const char *name, size_t size, void *initial)
static MemoryMappedFile * open(const char *name, FileMode mode=FileMode::kReadWrite)
static void Sleep(TimeDelta interval)
friend class PosixMemoryMappedFile
static V8_WARN_UNUSED_RESULT void * AllocateShared(size_t size, MemoryPermission access)
static void * GetRandomMmapAddr()
static V8_WARN_UNUSED_RESULT bool SealPages(void *address, size_t size)
static bool ArmUsingHardFloat()
static static va_list args
static bool HasLazyCommits()
static V8_WARN_UNUSED_RESULT bool CanReserveAddressSpace()
static V8_WARN_UNUSED_RESULT bool DiscardSystemPages(void *address, size_t size)
static size_t AllocatePageSize()
static void ExitProcess(int exit_code)
static void SetDataReadOnly(void *address, size_t size)
static bool IsHardwareEnforcedShadowStacksEnabled()
static void FreeAddressSpaceReservation(AddressSpaceReservation reservation)
static const char *const LogFileOpenMode
static int GetCurrentThreadIdInternal()
static int GetLastError()
static PlatformSharedMemoryHandle CreateSharedMemoryHandleForTesting(size_t size)
static void FreeShared(void *address, size_t size)
static V8_WARN_UNUSED_RESULT bool SetPermissions(void *address, size_t size, MemoryPermission access)
static FILE * OpenTemporaryFile()
static FILE * FOpen(const char *path, const char *mode)
static void Initialize(AbortMode abort_mode, const char *const gc_fake_mmap)
static V8_WARN_UNUSED_RESULT bool DecommitPages(void *address, size_t size)
static int GetCurrentProcessId()
static size_t CommitPageSize()
static int GetPeakMemoryUsageKb()
static void Release(void *address, size_t size)
static V8_WARN_UNUSED_RESULT bool RecommitPages(void *address, size_t size, MemoryPermission access)
static char DirectorySeparator()
static void StrNCpy(char *dest, int length, const char *src, size_t n)
static int GetUserTime(uint32_t *secs, uint32_t *usecs)
static int GetCurrentThreadId()
static int ActivationFrameAlignment()
static V8_WARN_UNUSED_RESULT void * Allocate(void *address, size_t size, size_t alignment, MemoryPermission access)
static void DestroySharedMemoryHandle(PlatformSharedMemoryHandle handle)
static double TimeCurrentMillis()
static bool isDirectorySeparator(const char ch)
static void SetRandomMmapSeed(int64_t seed)
static V8_WARN_UNUSED_RESULT std::optional< AddressSpaceReservation > CreateAddressSpaceReservation(void *hint, size_t size, size_t alignment, MemoryPermission max_permission)
static const int msPerSecond
friend class AddressSpaceReservation
static void Free(void *address, size_t size)
static bool Remove(const char *path)
size_t size() const final
~PosixMemoryMappedFile() final
PosixMemoryMappedFile(FILE *file, void *memory, size_t size)
double DaylightSavingsOffset(double time_ms) override
static V8_NOINLINE StackSlot GetCurrentStackPosition()
static Stack::StackSlot ObtainCurrentThreadStackStart()
Thread(const Options &options)
V8_WARN_UNUSED_RESULT bool Start()
static void DeleteThreadLocalKey(LocalStorageKey key)
static LocalStorageKey CreateThreadLocalKey()
static void * GetThreadLocal(LocalStorageKey key)
void set_name(const char *name)
char name_[kMaxThreadNameLength]
static const int kMaxThreadNameLength
static void * GetExistingThreadLocal(LocalStorageKey key)
static void SetThreadLocal(LocalStorageKey key, void *value)
refactor address components for immediate indexing make OptimizeMaglevOnNextCall optimize to turbofan instead of maglev filter for tracing turbofan compilation trace turbo cfg trace TurboFan s graph trimmer trace TurboFan s control equivalence trace TurboFan s register allocator trace stack load store counters for optimized code in run fuzzing &&concurrent_recompilation trace_turbo trace_turbo_scheduled trace_turbo_stack_accesses verify TurboFan machine graph of code stubs enable FixedArray bounds checks print TurboFan statistics of wasm compilations maximum cumulative size of bytecode considered for inlining scale factor of bytecode size used to calculate the inlining budget * KB
other heap size flags(e.g. initial_heap_size) take precedence") DEFINE_SIZE_T( max_shared_heap_size
ZoneVector< RpoNumber > & result
ZoneStack< RpoNumber > & stack
#define DEFINE_LAZY_LEAKY_OBJECT_GETTER(T, FunctionName,...)
#define LAZY_MUTEX_INITIALIZER
int GetProtectionFromMemoryPermission(OS::MemoryPermission access)
@ kExitWithFailureAndIgnoreDcheckFailures
@ kExitWithSuccessAndIgnoreDcheckFailures
void * Allocate(void *address, size_t size, OS::MemoryPermission access)
static pthread_key_t LocalKeyToPthreadKey(Thread::LocalStorageKey local_key)
static void * ThreadEntry(void *arg)
static Thread::LocalStorageKey PthreadKeyToLocalKey(pthread_key_t pthread_key)
void PosixInitializeCommon(AbortMode abort_mode, const char *const gc_fake_mmap)
static const pthread_t kNoThread
static void SetThreadName(const char *name)
int VSNPrintF(Vector< char > str, const char *format, va_list args)
LazyStaticInstance< Mutex, DefaultConstructTrait< Mutex >, ThreadSafeInitOnceTrait >::type LazyMutex
int FileDescriptorFromSharedMemoryHandle(PlatformSharedMemoryHandle handle)
PlatformSharedMemoryHandle SharedMemoryHandleFromFileDescriptor(int fd)
static constexpr PlatformSharedMemoryHandle kInvalidSharedMemoryHandle
intptr_t PlatformSharedMemoryHandle
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DISABLE_CFI_ICALL
constexpr T RoundUp(T x, intptr_t m)
void * AlignedAddress(void *address, size_t alignment)
constexpr T RoundDown(T x, intptr_t m)
#define V8_UNLIKELY(condition)
std::unique_ptr< ValueMirror > key