Index: runtime/vm/dart_api_state.h |
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h |
index 3ca4f728b0da255ed68ab03ba171bb7cbb50a1b6..7946ef8ea5bfcc50162865e52d0b0efcb7e5ee69 100644 |
--- a/runtime/vm/dart_api_state.h |
+++ b/runtime/vm/dart_api_state.h |
@@ -674,11 +674,18 @@ class ApiNativeScope { |
ASSERT(Current() == NULL); |
OSThread::SetThreadLocal(Api::api_native_key_, |
reinterpret_cast<uword>(this)); |
+ // We manually increment the memory usage counter since there is memory |
+ // initially allocated within the zone on creation. |
+ IncrementNativeScopeMemoryUsage(zone_.GetZone()->CapacityInBytes()); |
} |
~ApiNativeScope() { |
ASSERT(Current() == this); |
OSThread::SetThreadLocal(Api::api_native_key_, 0); |
+ // We must also manually decrement the memory usage counter since the native |
+ // is still holding it's initial memory and ~Zone() won't be able to |
+ // determine which memory usage counter to decrement. |
+ DecrementNativeScopeMemoryUsage(zone_.GetZone()->CapacityInBytes()); |
} |
static inline ApiNativeScope* Current() { |
@@ -686,6 +693,16 @@ class ApiNativeScope { |
OSThread::GetThreadLocal(Api::api_native_key_)); |
} |
+ static intptr_t current_memory_usage() { return current_memory_usage_; } |
+ |
+ static void IncrementNativeScopeMemoryUsage(intptr_t size) { |
+ AtomicOperations::IncrementBy(¤t_memory_usage_, size); |
+ } |
+ |
+ static void DecrementNativeScopeMemoryUsage(intptr_t size) { |
+ AtomicOperations::DecrementBy(¤t_memory_usage_, size); |
+ } |
+ |
Zone* zone() { |
Zone* result = zone_.GetZone(); |
ASSERT(result->handles()->CountScopedHandles() == 0); |
@@ -694,6 +711,9 @@ class ApiNativeScope { |
} |
private: |
+ // The current total memory usage within ApiNativeScopes. |
+ static intptr_t current_memory_usage_; |
+ |
ApiZone zone_; |
}; |