From 4ef84b9240035eccdeb8d15a5fed2643f49332e5 Mon Sep 17 00:00:00 2001 From: "svenpanne@chromium.org" Date: Tue, 10 Sep 2013 10:57:00 +0000 Subject: [PATCH] Add a ResourceConstraint for the embedder to specify that V8 is running on a memory constrained device. This enables us to specialize certain operations such that we limit memory usage on low-memory devices, without reducing performance on devices which are not memory constrained. BUG=chromium:280984 R=svenpanne@chromium.org Review URL: https://codereview.chromium.org/23464022 Patch from Ross McIlroy . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16608 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- include/v8.h | 9 +++++++++ src/api.cc | 7 ++++++- src/isolate.h | 8 ++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/v8.h b/include/v8.h index 7315b2a..9e9ea8a 100644 --- a/include/v8.h +++ b/include/v8.h @@ -3763,11 +3763,20 @@ class V8_EXPORT ResourceConstraints { uint32_t* stack_limit() const { return stack_limit_; } // Sets an address beyond which the VM's stack may not grow. void set_stack_limit(uint32_t* value) { stack_limit_ = value; } + Maybe is_memory_constrained() const { return is_memory_constrained_; } + // If set to true, V8 will limit it's memory usage, at the potential cost of + // lower performance. Note, this option is a tentative addition to the API + // and may be removed or modified without warning. + void set_memory_constrained(bool value) { + is_memory_constrained_ = Maybe(value); + } + private: int max_young_space_size_; int max_old_space_size_; int max_executable_size_; uint32_t* stack_limit_; + Maybe is_memory_constrained_; }; diff --git a/src/api.cc b/src/api.cc index 16beb3e..bf27217 100644 --- a/src/api.cc +++ b/src/api.cc @@ -624,7 +624,8 @@ ResourceConstraints::ResourceConstraints() : max_young_space_size_(0), max_old_space_size_(0), max_executable_size_(0), - stack_limit_(NULL) { } + stack_limit_(NULL), + is_memory_constrained_() { } bool SetResourceConstraints(ResourceConstraints* constraints) { @@ -645,6 +646,10 @@ bool SetResourceConstraints(ResourceConstraints* constraints) { uintptr_t limit = reinterpret_cast(constraints->stack_limit()); isolate->stack_guard()->SetStackLimit(limit); } + if (constraints->is_memory_constrained().has_value) { + isolate->set_is_memory_constrained( + constraints->is_memory_constrained().value); + } return true; } diff --git a/src/isolate.h b/src/isolate.h index f0854e5..1debf4b 100644 --- a/src/isolate.h +++ b/src/isolate.h @@ -1128,6 +1128,13 @@ class Isolate { // Given an address occupied by a live code object, return that object. Object* FindCodeObject(Address a); + bool is_memory_constrained() const { + return is_memory_constrained_; + } + void set_is_memory_constrained(bool value) { + is_memory_constrained_ = value; + } + private: Isolate(); @@ -1299,6 +1306,7 @@ class Isolate { DateCache* date_cache_; unibrow::Mapping interp_canonicalize_mapping_; CodeStubInterfaceDescriptor* code_stub_interface_descriptors_; + bool is_memory_constrained_; // True if fatal error has been signaled for this isolate. bool has_fatal_error_; -- 2.7.4