18#include "starboard/client_porting/eztime/eztime.h"
19#include "starboard/common/condition_variable.h"
20#include "starboard/common/log.h"
21#include "starboard/common/string.h"
22#include "starboard/common/time.h"
23#include "starboard/configuration.h"
24#include "starboard/configuration_constants.h"
25#include "starboard/time_zone.h"
41 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
42#if GCC_VERSION >= 40600 && !defined(__clang__)
43#if defined(__ARM_PCS_VFP)
49#elif GCC_VERSION < 40500 && !defined(__clang__)
53#if defined(__ARM_PCS_VFP)
55#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
60 "Your version of compiler does not report the FP ABI compiled for." \
61 "Please report it on this issue" \
62 "http://code.google.com/p/v8/issues/detail?id=2140"
77const int kStackSize = 1;
87 const int64_t us_time = starboard::CurrentMonotonicThreadTime();
88 if (us_time == 0)
return -1;
89 *secs = us_time / TimeConstants::kMicroSecondsPerSecond;
90 *usecs = us_time % TimeConstants::kMicroSecondsPerSecond;
101#elif V8_TARGET_ARCH_MIPS
103#elif V8_TARGET_ARCH_S390X
131 prot_flags = PROT_NONE;
134 prot_flags = PROT_READ | PROT_WRITE;
137 SB_LOG(ERROR) <<
"The requested memory allocation access is not"
138 " implemented for Starboard: "
139 <<
static_cast<int>(access);
142 void*
result = mmap(
nullptr, size, prot_flags, MAP_PRIVATE | MAP_ANON, -1, 0);
143 if (
result == MAP_FAILED) {
150void*
OS::Allocate(
void* address,
size_t size,
size_t alignment,
151 MemoryPermission access) {
157 size_t request_size = size + (alignment - page_size);
160 if (
result ==
nullptr)
return nullptr;
163 uint8_t*
base =
static_cast<uint8_t*
>(
result);
164 uint8_t* aligned_base =
reinterpret_cast<uint8_t*
>(
165 RoundUp(
reinterpret_cast<uintptr_t
>(base), alignment));
166 if (aligned_base != base) {
168 size_t prefix_size =
static_cast<size_t>(aligned_base -
base);
169 Free(base, prefix_size);
170 request_size -= prefix_size;
173 if (size != request_size) {
175 size_t suffix_size = request_size -
size;
176 Free(aligned_base + size, suffix_size);
177 request_size -= suffix_size;
181 return static_cast<void*
>(aligned_base);
185void OS::Free(
void* address,
const size_t size) {
199 new_protection = PROT_NONE;
202 new_protection = PROT_READ;
204 new_protection = PROT_READ | PROT_WRITE;
207#if SB_CAN(MAP_EXECUTABLE_MEMORY)
208 new_protection = PROT_READ | PROT_EXEC;
217 return mprotect(address, size, new_protection) == 0;
231void OS::Sleep(TimeDelta interval) { SbThreadSleep(interval.InMicroseconds()); }
233void OS::Abort() { SbSystemBreakIntoDebugger(); }
259 size_t size,
void* initial) {
279FILE*
OS::FOpen(
const char* path,
const char* mode) {
302void OS::Print(
const char* format, ...) {
304 va_start(
args, format);
305 VPrint(format,
args);
309void OS::VPrint(
const char* format, va_list
args) {
310 SbLogRawFormat(format,
args);
313void OS::FPrint(FILE* out,
const char* format, ...) {
315 va_start(
args, format);
316 VPrintError(format,
args);
320void OS::VFPrint(FILE* out,
const char* format, va_list
args) {
321 SbLogRawFormat(format,
args);
324void OS::PrintError(
const char* format, ...) {
326 va_start(
args, format);
327 VPrintError(format,
args);
331void OS::VPrintError(
const char* format, va_list
args) {
333 SbLogRawFormat(format,
args);
336int OS::SNPrintF(
char* str,
int length,
const char* format, ...) {
338 va_start(
args, format);
344int OS::VSNPrintF(
char* str,
int length,
const char* format, va_list
args) {
345 int n = vsnprintf(str, length, format,
args);
348 if (length > 0) str[length - 1] =
'\0';
359void OS::StrNCpy(
char* dest,
int length,
const char* src,
size_t n) {
360 strncpy(dest, src, n);
367class Thread::PlatformData {
372 Mutex thread_creation_mutex_;
377 stack_size_(options.stack_size()),
378 start_semaphore_(nullptr) {
394 thread->NotifyStartedAndRun();
406 SbThreadCreate(
stack_size_, kSbThreadNoPriority, kSbThreadNoAffinity,
414 return SbThreadCreateLocalKey(
nullptr);
418 SbThreadDestroyLocalKey(
key);
422 return SbThreadGetLocalValue(
key);
426 bool result = SbThreadSetLocalValue(
key, value);
436 static const int msPerSecond = 1000;
442 return SbTimeZoneGetName();
449 return SbTimeZoneGetCurrent() * 60.0 * msPerSecond * (-1);
452 int64_t posix_microseconds = starboard::CurrentPosixTime();
453 EzTimeValue value = {
454 posix_microseconds / TimeConstants::kMicroSecondsPerSecond,
455 (int32_t)(posix_microseconds % TimeConstants::kMicroSecondsPerSecond)
457 EzTimeExploded ez_exploded;
459 EzTimeValueExplode(&value, kEzTimeZoneLocal, &ez_exploded, NULL);
460 return ez_exploded.tm_isdst > 0 ? 3600 * msPerSecond : 0;
467 return new StarboardDefaultTimezoneCache();
498 void* addresses[kStackSize];
499 const size_t count = SbSystemGetStack(addresses, kStackSize);
uint8_t data_[MAX_STACK_LENGTH]
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)
static void * GetRandomMmapAddr()
static void SignalCodeMovingGC()
static bool ArmUsingHardFloat()
static static va_list args
static bool HasLazyCommits()
static V8_WARN_UNUSED_RESULT bool DiscardSystemPages(void *address, size_t size)
static size_t AllocatePageSize()
static const char *const LogFileOpenMode
static int GetCurrentThreadIdInternal()
static int GetLastError()
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 int GetCurrentProcessId()
static size_t CommitPageSize()
static void Release(void *address, size_t size)
static V8_WARN_UNUSED_RESULT bool RecommitPages(void *address, size_t size, MemoryPermission access)
static std::vector< SharedLibraryAddress > GetSharedLibraryAddresses()
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 ActivationFrameAlignment()
static V8_WARN_UNUSED_RESULT void * Allocate(void *address, size_t size, size_t alignment, MemoryPermission access)
static TimezoneCache * CreateTimezoneCache()
static double TimeCurrentMillis()
static bool isDirectorySeparator(const char ch)
static void SetRandomMmapSeed(int64_t seed)
friend class MemoryMappedFile
static void Free(void *address, size_t size)
static std::optional< MemoryRange > GetFirstFreeMemoryRangeWithin(Address boundary_start, Address boundary_end, size_t minimum_size, size_t alignment)
static bool Remove(const char *path)
static void AdjustSchedulingParams()
static StackSlot GetStackStart()
static V8_NOINLINE StackSlot GetCurrentStackPosition()
const char * LocalTimezone(double time_ms) override
double LocalTimeOffset(double time_ms, bool is_utc) override
double DaylightSavingsOffset(double time_ms) override
~StarboardDefaultTimezoneCache() override
size_t size() const final
void * memory() const final
~StarboardMemoryMappedFile() final
void Clear(TimeZoneDetection time_zone_detection) override
~StarboardTimezoneCache() override
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 void SetThreadLocal(LocalStorageKey key, void *value)
ZoneVector< RpoNumber > & result
#define LAZY_INSTANCE_INITIALIZER
#define LAZY_MUTEX_INITIALIZER
void * Allocate(void *address, size_t size, OS::MemoryPermission access)
static void * ThreadEntry(void *arg)
static void SetThreadName(const char *name)
int VSNPrintF(Vector< char > str, const char *format, va_list args)
LazyStaticInstance< Mutex, DefaultConstructTrait< Mutex >, ThreadSafeInitOnceTrait >::type LazyMutex
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
constexpr T RoundUp(T x, intptr_t m)
void * AlignedAddress(void *address, size_t alignment)
typename LazyStaticInstance< T, CreateTrait, InitOnceTrait, DestroyTrait >::type type
std::unique_ptr< ValueMirror > key