Index: src/platform.h |
diff --git a/src/platform.h b/src/platform.h |
index 848966ee598fea7677969161576a2322ba8d604f..ee8fb92910be295b2dc68c711be979adf7388ec6 100644 |
--- a/src/platform.h |
+++ b/src/platform.h |
@@ -219,6 +219,30 @@ class OS { |
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/writable, 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 is_executable); |
+ static void Free(void* address, const size_t size); |
+ |
+ // This is the granularity at which the ProtectCode(...) call can set page |
+ // permissions. |
+ static intptr_t CommitPageSize(); |
+ |
+ // Mark code segments non-writable. |
+ static void ProtectCode(void* address, const size_t size); |
+ |
+ // Assign memory as a guard page so that access will cause an exception. |
+ static void Guard(void* address, const size_t size); |
+ |
+ // Generate a random address to be used for hinting mmap(). |
+ static void* GetRandomMmapAddr(); |
+ |
+ // Get the Alignment guaranteed by Allocate(). |
+ static size_t AllocateAlignment(); |
+ |
// Sleep for a number of milliseconds. |
static void Sleep(const int milliseconds); |
@@ -279,6 +303,10 @@ class OS { |
// positions indicated by the members of the CpuFeature enum from globals.h |
static uint64_t CpuFeaturesImpliedByPlatform(); |
+ // Maximum size of the virtual memory. 0 means there is no artificial |
+ // limit. |
+ static intptr_t MaxVirtualMemory(); |
+ |
// Returns the double constant NAN |
static double nan_value(); |
@@ -358,6 +386,99 @@ class OS { |
DISALLOW_IMPLICIT_CONSTRUCTORS(OS); |
}; |
+// Represents and controls an area of reserved memory. |
+// Control of the reserved memory can be assigned to another VirtualMemory |
+// object by assignment or copy-contructing. This removes the reserved memory |
+// from the original object. |
+class VirtualMemory { |
+ public: |
+ // Empty VirtualMemory object, controlling no reserved memory. |
+ VirtualMemory(); |
+ |
+ // Reserves virtual memory with size. |
+ explicit VirtualMemory(size_t size); |
+ |
+ // Reserves virtual memory containing an area of the given size that |
+ // is aligned per alignment. This may not be at the position returned |
+ // by address(). |
+ VirtualMemory(size_t size, size_t alignment); |
+ |
+ // Releases the reserved memory, if any, controlled by this VirtualMemory |
+ // object. |
+ ~VirtualMemory(); |
+ |
+ // Returns whether the memory has been reserved. |
+ bool IsReserved(); |
+ |
+ // Initialize or resets an embedded VirtualMemory object. |
+ void Reset(); |
+ |
+ // Returns the start address of the reserved memory. |
+ // If the memory was reserved with an alignment, this address is not |
+ // necessarily aligned. The user might need to round it up to a multiple of |
+ // the alignment to get the start of the aligned block. |
+ void* address() { |
+ ASSERT(IsReserved()); |
+ return address_; |
+ } |
+ |
+ // Returns the size of the reserved memory. The returned value is only |
+ // meaningful when IsReserved() returns true. |
+ // If the memory was reserved with an alignment, this size may be larger |
+ // than the requested size. |
+ size_t size() { return size_; } |
+ |
+ // Commits real memory. Returns whether the operation succeeded. |
+ bool Commit(void* address, size_t size, bool is_executable); |
+ |
+ // Uncommit real memory. Returns whether the operation succeeded. |
+ bool Uncommit(void* address, size_t size); |
+ |
+ // Creates a single guard page at the given address. |
+ bool Guard(void* address); |
+ |
+ void Release() { |
+ ASSERT(IsReserved()); |
+ // Notice: Order is important here. The VirtualMemory object might live |
+ // inside the allocated region. |
+ void* address = address_; |
+ size_t size = size_; |
+ Reset(); |
+ bool result = ReleaseRegion(address, size); |
+ USE(result); |
+ ASSERT(result); |
+ } |
+ |
+ // Assign control of the reserved region to a different VirtualMemory object. |
+ // The old object is no longer functional (IsReserved() returns false). |
+ void TakeControl(VirtualMemory* from) { |
+ ASSERT(!IsReserved()); |
+ address_ = from->address_; |
+ size_ = from->size_; |
+ from->Reset(); |
+ } |
+ |
+ static void* ReserveRegion(size_t size); |
+ |
+ static bool CommitRegion(void* base, size_t size, bool is_executable); |
+ |
+ static bool UncommitRegion(void* base, size_t size); |
+ |
+ // Must be called with a base pointer that has been returned by ReserveRegion |
+ // and the same size it was reserved with. |
+ static bool ReleaseRegion(void* base, size_t size); |
+ |
+ // Returns true if OS performs lazy commits, i.e. the memory allocation call |
+ // defers actual physical memory allocation till the first memory access. |
+ // Otherwise returns false. |
+ static bool HasLazyCommits(); |
+ |
+ private: |
+ void* address_; // Start address of the virtual memory. |
+ size_t size_; // Size of the virtual memory. |
+}; |
+ |
+ |
// ---------------------------------------------------------------------------- |
// Thread |
// |