| Index: runtime/vm/zone.cc
|
| diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
|
| index 8b3cdac905faf210905786168a660c3c15e65329..9bbc8eb6b3ebabc8d4fc8fb39cd2e77035c970f7 100644
|
| --- a/runtime/vm/zone.cc
|
| +++ b/runtime/vm/zone.cc
|
| @@ -28,6 +28,8 @@ class Zone::Segment {
|
| // Allocate or delete individual segments.
|
| static Segment* New(intptr_t size, Segment* next);
|
| static void DeleteSegmentList(Segment* segment);
|
| + static void IncrementMemoryCapacity(uintptr_t size);
|
| + static void DecrementMemoryCapacity(uintptr_t size);
|
|
|
| private:
|
| Segment* next_;
|
| @@ -42,16 +44,28 @@ class Zone::Segment {
|
| };
|
|
|
|
|
| +Zone::Segment* Zone::Segment::New(intptr_t size, Zone::Segment* next) {
|
| + ASSERT(size >= 0);
|
| + Segment* result = reinterpret_cast<Segment*>(malloc(size));
|
| + if (result == NULL) {
|
| + OUT_OF_MEMORY();
|
| + }
|
| + ASSERT(Utils::IsAligned(result->start(), Zone::kAlignment));
|
| +#ifdef DEBUG
|
| + // Zap the entire allocated segment (including the header).
|
| + memset(result, kZapUninitializedByte, size);
|
| +#endif
|
| + result->next_ = next;
|
| + result->size_ = size;
|
| + IncrementMemoryCapacity(size);
|
| + return result;
|
| +}
|
| +
|
| +
|
| void Zone::Segment::DeleteSegmentList(Segment* head) {
|
| Segment* current = head;
|
| - Thread* current_thread = Thread::Current();
|
| while (current != NULL) {
|
| - if (current_thread != NULL) {
|
| - current_thread->DecrementMemoryUsage(current->size());
|
| - } else if (ApiNativeScope::Current() != NULL) {
|
| - // If there is no current thread, we might be inside of a native scope.
|
| - ApiNativeScope::DecrementNativeScopeMemoryUsage(current->size());
|
| - }
|
| + DecrementMemoryCapacity(current->size());
|
| Segment* next = current->next();
|
| #ifdef DEBUG
|
| // Zap the entire current segment (including the header).
|
| @@ -63,29 +77,28 @@ void Zone::Segment::DeleteSegmentList(Segment* head) {
|
| }
|
|
|
|
|
| -Zone::Segment* Zone::Segment::New(intptr_t size, Zone::Segment* next) {
|
| - ASSERT(size >= 0);
|
| - Segment* result = reinterpret_cast<Segment*>(malloc(size));
|
| - if (result == NULL) {
|
| - OUT_OF_MEMORY();
|
| +void Zone::Segment::IncrementMemoryCapacity(uintptr_t size) {
|
| + Thread* current_thread = Thread::Current();
|
| + if (current_thread != NULL) {
|
| + current_thread->IncrementMemoryCapacity(size);
|
| + } else if (ApiNativeScope::Current() != NULL) {
|
| + // If there is no current thread, we might be inside of a native scope.
|
| + ApiNativeScope::IncrementNativeScopeMemoryCapacity(size);
|
| }
|
| - ASSERT(Utils::IsAligned(result->start(), Zone::kAlignment));
|
| -#ifdef DEBUG
|
| - // Zap the entire allocated segment (including the header).
|
| - memset(result, kZapUninitializedByte, size);
|
| -#endif
|
| - result->next_ = next;
|
| - result->size_ = size;
|
| - Thread* current = Thread::Current();
|
| - if (current != NULL) {
|
| - current->IncrementMemoryUsage(size);
|
| +}
|
| +
|
| +
|
| +void Zone::Segment::DecrementMemoryCapacity(uintptr_t size) {
|
| + Thread* current_thread = Thread::Current();
|
| + if (current_thread != NULL) {
|
| + current_thread->DecrementMemoryCapacity(size);
|
| } else if (ApiNativeScope::Current() != NULL) {
|
| // If there is no current thread, we might be inside of a native scope.
|
| - ApiNativeScope::IncrementNativeScopeMemoryUsage(size);
|
| + ApiNativeScope::DecrementNativeScopeMemoryCapacity(size);
|
| }
|
| - return result;
|
| }
|
|
|
| +
|
| // TODO(bkonyi): We need to account for the initial chunk size when a new zone
|
| // is created within a new thread or ApiNativeScope when calculating high
|
| // watermarks or memory consumption.
|
| @@ -98,10 +111,7 @@ Zone::Zone()
|
| handles_(),
|
| previous_(NULL) {
|
| ASSERT(Utils::IsAligned(position_, kAlignment));
|
| - Thread* current = Thread::Current();
|
| - if (current != NULL) {
|
| - current->IncrementMemoryUsage(kInitialChunkSize);
|
| - }
|
| + Segment::IncrementMemoryCapacity(kInitialChunkSize);
|
| #ifdef DEBUG
|
| // Zap the entire initial buffer.
|
| memset(initial_buffer_.pointer(), kZapUninitializedByte,
|
| @@ -114,11 +124,8 @@ Zone::~Zone() {
|
| if (FLAG_trace_zones) {
|
| DumpZoneSizes();
|
| }
|
| - Thread* current = Thread::Current();
|
| - if (current != NULL) {
|
| - current->DecrementMemoryUsage(kInitialChunkSize);
|
| - }
|
| DeleteAll();
|
| + Segment::DecrementMemoryCapacity(kInitialChunkSize);
|
| }
|
|
|
|
|
| @@ -144,8 +151,8 @@ void Zone::DeleteAll() {
|
| }
|
|
|
|
|
| -intptr_t Zone::SizeInBytes() const {
|
| - intptr_t size = 0;
|
| +uintptr_t Zone::SizeInBytes() const {
|
| + uintptr_t size = 0;
|
| for (Segment* s = large_segments_; s != NULL; s = s->next()) {
|
| size += s->size();
|
| }
|
| @@ -160,8 +167,8 @@ intptr_t Zone::SizeInBytes() const {
|
| }
|
|
|
|
|
| -intptr_t Zone::CapacityInBytes() const {
|
| - intptr_t size = 0;
|
| +uintptr_t Zone::CapacityInBytes() const {
|
| + uintptr_t size = 0;
|
| for (Segment* s = large_segments_; s != NULL; s = s->next()) {
|
| size += s->size();
|
| }
|
| @@ -300,19 +307,6 @@ char* Zone::VPrint(const char* format, va_list args) {
|
| }
|
|
|
|
|
| -#ifndef PRODUCT
|
| -// TODO(bkonyi): Currently dead code. See issue #28885.
|
| -void Zone::PrintJSON(JSONStream* stream) const {
|
| - JSONObject jsobj(stream);
|
| - intptr_t capacity = CapacityInBytes();
|
| - intptr_t used_size = SizeInBytes();
|
| - jsobj.AddProperty("type", "_Zone");
|
| - jsobj.AddProperty("capacity", capacity);
|
| - jsobj.AddProperty("used", used_size);
|
| -}
|
| -#endif
|
| -
|
| -
|
| StackZone::StackZone(Thread* thread) : StackResource(thread), zone_() {
|
| if (FLAG_trace_zones) {
|
| OS::PrintErr("*** Starting a new Stack zone 0x%" Px "(0x%" Px ")\n",
|
|
|