📄 platform.h.svn-base
字号:
// Copyright 2006-2008 the V8 project authors. All rights reserved.// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met://// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following// disclaimer in the documentation and/or other materials provided// with the distribution.// * Neither the name of Google Inc. nor the names of its// contributors may be used to endorse or promote products derived// from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.// This module contains the platform-specific code. This make the rest of the// code less dependent on operating system, compilers and runtime libraries.// This module does specifically not deal with differences between different// processor architecture.// The platform classes have the same definition for all platforms. The// implementation for a particular platform is put in platform_<os>.cc.// The build system then uses the implementation for the target platform.//// This design has been choosen because it is simple and fast. Alternatively,// the platform dependent classes could have been implemented using abstract// superclasses with virtual methods and having specializations for each// platform. This design was rejected because it was more complicated and// slower. It would require factory methods for selecting the right// implementation and the overhead of virtual methods for performance// sensitive like mutex locking/unlocking.#ifndef V8_PLATFORM_H_#define V8_PLATFORM_H_#ifdef WIN32enum { FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL};#define INFINITY HUGE_VALnamespace v8 { namespace internal {int isfinite(double x);} }int isnan(double x);int isinf(double x);int isless(double x, double y);int isgreater(double x, double y);int fpclassify(double x);int signbit(double x);int random();int strcasecmp(const char* s1, const char* s2);int strncasecmp(const char* s1, const char* s2, int n);#else// Unfortunately, the INFINITY macro cannot be used with the '-pedantic'// warning flag and certain versions of GCC due to a bug:// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11931// For now, we use the more involved template-based version from <limits>, but// only when compiling with GCC versions affected by the bug (2.96.x - 4.0.x)// __GNUC_PREREQ is not defined in GCC for Mac OS X, so we define our own macro#if defined(__GNUC__)#define __GNUC_VERSION__ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100)#endif#if __GNUC_VERSION__ >= 29600 && __GNUC_VERSION__ < 40100#include <limits>#undef INFINITY#define INFINITY std::numeric_limits<double>::infinity()#endif#endif // WIN32namespace v8 { namespace internal {double ceiling(double x);// ----------------------------------------------------------------------------// OS//// This class has static methods for the different platform specific// functions. Add methods here to cope with differences between the// supported platforms.class OS { public: // Initializes the platform OS support. Called once at VM startup. static void Setup(); // Returns the accumulated user time for thread. This routine // can be used for profiling. The implementation should // strive for high-precision timer resolution, preferable // micro-second resolution. static int GetUserTime(uint32_t* secs, uint32_t* usecs); // Get a tick counter normalized to one tick per microsecond. // Used for calculating time intervals. static int64_t Ticks(); // Returns current time as the number of milliseconds since // 00:00:00 UTC, January 1, 1970. static double TimeCurrentMillis(); // Returns a string identifying the current time zone. The // timestamp is used for determining if DST is in effect. static char* LocalTimezone(double time); // Returns the local time offset in milliseconds east of UTC without // taking daylight savings time into account. static double LocalTimeOffset(); // Returns the daylight savings offset for the given time. static double DaylightSavingsOffset(double time); static FILE* FOpen(const char* path, const char* mode); // Print output to console. This is mostly used for debugging output. // On platforms that has standard terminal output, the output // should go to stdout. static void Print(const char* format, ...); static void VPrint(const char* format, va_list args); // Print error output to console. This is mostly used for error message // output. On platforms that has standard terminal output, the output // should go to stderr. static void PrintError(const char* format, ...); static void VPrintError(const char* format, va_list args); // Allocate/Free memory used by JS heap. Pages are readable/writeable, but // they are not guaranteed to be executable unless 'executable' is true. // Returns the address of allocated memory, or NULL if failed. static void* Allocate(const size_t requested, size_t* allocated, bool executable); static void Free(void* buf, const size_t length); // Get the Alignment guaranteed by Allocate(). static size_t AllocateAlignment(); // Returns an indication of whether a pointer is in a space that // has been allocated by Allocate(). This method may conservatively // always return false, but giving more accurate information may // improve the robustness of the stack dump code in the presence of // heap corruption. static bool IsOutsideAllocatedSpace(void* pointer); // Sleep for a number of miliseconds. static void Sleep(const int miliseconds); // Abort the current process. static void Abort(); // Debug break. static void DebugBreak(); // Walk the stack. static const int kStackWalkError = -1; static const int kStackWalkMaxNameLen = 256; static const int kStackWalkMaxTextLen = 256; struct StackFrame { void* address; char text[kStackWalkMaxTextLen]; }; static int StackWalk(StackFrame* frames, int frames_size); // Factory method for creating platform dependent Mutex. // Please use delete to reclaim the storage for the returned Mutex. static Mutex* CreateMutex(); // Factory method for creating platform dependent Semaphore. // Please use delete to reclaim the storage for the returned Semaphore. static Semaphore* CreateSemaphore(int count); class MemoryMappedFile { public: static MemoryMappedFile* create(const char* name, int size, void* initial); virtual ~MemoryMappedFile() { } virtual void* memory() = 0; }; // Safe formatting print. Ensures that str is always null-terminated. // Returns the number of chars written, or -1 if output was truncated. static int SNPrintF(Vector<char> str, const char* format, ...); static int VSNPrintF(Vector<char> str, const char* format, va_list args); static void StrNCpy(Vector<char> dest, const char* src, size_t n); static void WcsCpy(Vector<wchar_t> dest, const wchar_t* src); static char* StrDup(const char* str); // Support for profiler. Can do nothing, in which case ticks // occuring in shared libraries will not be properly accounted // for. static void LogSharedLibraryAddresses(); // Returns the double constant NAN static double nan_value(); // Returns the activation frame alignment constraint or zero if // the platform doesn't care. Guaranteed to be a power of two. static int ActivationFrameAlignment(); private: static const int msPerSecond = 1000; DISALLOW_IMPLICIT_CONSTRUCTORS(OS);};class VirtualMemory { public: // Reserves virtual memory with size. explicit VirtualMemory(size_t size); ~VirtualMemory(); // Returns whether the memory has been reserved. bool IsReserved(); // Returns the start address of the reserved memory. void* address() { ASSERT(IsReserved()); return address_; }; // Returns the size of the reserved memory. size_t size() { return size_; } // Commits real memory. Returns whether the operation succeeded. bool Commit(void* address, size_t size, bool executable); // Uncommit real memory. Returns whether the operation succeeded. bool Uncommit(void* address, size_t size); private: void* address_; // Start address of the virtual memory. size_t size_; // Size of the virtual memory.};// ----------------------------------------------------------------------------// ThreadHandle//// A ThreadHandle represents a thread identifier for a thread. The ThreadHandle// does not own the underlying os handle. Thread handles can be used for// refering to threads and testing equality.class ThreadHandle { public: enum Kind { SELF, INVALID }; explicit ThreadHandle(Kind kind); // Destructor. ~ThreadHandle(); // Test for thread running. bool IsSelf() const; // Test for valid thread handle. bool IsValid() const; // Get platform-specific data. class PlatformData; PlatformData* thread_handle_data() { return data_; } // Initialize the handle to kind void Initialize(Kind kind); private: PlatformData* data_; // Captures platform dependent data.};// ----------------------------------------------------------------------------// Thread//// Thread objects are used for creating and running threads. When the start()// method is called the new thread starts running the run() method in the new// thread. The Thread object should not be deallocated before the thread has// terminated.class Thread: public ThreadHandle { public: // Opaque data type for thread-local storage keys. enum LocalStorageKey {}; // Create new thread. Thread(); virtual ~Thread(); // Start new thread by calling the Run() method in the new thread. void Start(); // Wait until thread terminates. void Join(); // Abstract method for run handler. virtual void Run() = 0; // Thread-local storage. static LocalStorageKey CreateThreadLocalKey(); static void DeleteThreadLocalKey(LocalStorageKey key); static void* GetThreadLocal(LocalStorageKey key); static void SetThreadLocal(LocalStorageKey key, void* value); // A hint to the scheduler to let another thread run. static void YieldCPU(); private: class PlatformData; PlatformData* data_; DISALLOW_COPY_AND_ASSIGN(Thread);};// ----------------------------------------------------------------------------// Mutex//// Mutexes are used for serializing access to non-reentrant sections of code.// The implementations of mutex should allow for nested/recursive locking.class Mutex { public: virtual ~Mutex() {} // Locks the given mutex. If the mutex is currently unlocked, it becomes // locked and owned by the calling thread, and immediately. If the mutex // is already locked by another thread, suspends the calling thread until // the mutex is unlocked. virtual int Lock() = 0; // Unlocks the given mutex. The mutex is assumed to be locked and owned by // the calling thread on entrance. virtual int Unlock() = 0;};// ----------------------------------------------------------------------------// ScopedLock//// Stack-allocated ScopedLocks provide block-scoped locking and unlocking// of a mutex.class ScopedLock { public: explicit ScopedLock(Mutex* mutex): mutex_(mutex) { mutex_->Lock(); } ~ScopedLock() { mutex_->Unlock(); } private: Mutex* mutex_; DISALLOW_COPY_AND_ASSIGN(ScopedLock);};// ----------------------------------------------------------------------------// Semaphore//// A semaphore object is a synchronization object that maintains a count. The// count is decremented each time a thread completes a wait for the semaphore// object and incremented each time a thread signals the semaphore. When the// count reaches zero, threads waiting for the semaphore blocks until the// count becomes non-zero.class Semaphore { public: virtual ~Semaphore() {} // Suspends the calling thread until the counter is non zero // and then decrements the semaphore counter. virtual void Wait() = 0; // Increments the semaphore counter. virtual void Signal() = 0;};#ifdef ENABLE_LOGGING_AND_PROFILING// ----------------------------------------------------------------------------// Sampler//// A sampler periodically samples the state of the VM and optionally// (if used for profiling) the program counter and stack pointer for// the thread that created it.// TickSample captures the information collected for each sample.class TickSample { public: TickSample() : pc(0), sp(0), state(OTHER) {} unsigned int pc; // Instruction pointer. unsigned int sp; // Stack pointer. StateTag state; // The state of the VM.};class Sampler { public: // Initialize sampler. explicit Sampler(int interval, bool profiling); virtual ~Sampler(); // This method is called for each sampling period with the current // program counter. virtual void Tick(TickSample* sample) = 0; // Start and stop sampler. void Start(); void Stop(); // Is the sampler used for profiling. inline bool IsProfiling() { return profiling_; } class PlatformData; protected: inline bool IsActive() { return active_; } private: int interval_; bool profiling_; bool active_; PlatformData* data_; // Platform specific data. DISALLOW_IMPLICIT_CONSTRUCTORS(Sampler);};#endif // ENABLE_LOGGING_AND_PROFILING} } // namespace v8::internal#endif // V8_PLATFORM_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -