| 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_;
|
| };
|
|
|
|
|