diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc index cf66709e1f1..d66238ac37c 100644 --- a/runtime/vm/dart_api_impl.cc +++ b/runtime/vm/dart_api_impl.cc @@ -1060,7 +1060,7 @@ DART_EXPORT bool Dart_IsVMFlagSet(const char* flag_name) { #if !defined(PRODUCT) #define VM_METRIC_API(type, variable, name, unit) \ DART_EXPORT int64_t Dart_VM##variable##Metric() { \ - return vm_metric_##variable.value(); \ + return vm_metric_##variable.Value(); \ } VM_METRIC_LIST(VM_METRIC_API); #undef VM_METRIC_API @@ -1071,7 +1071,7 @@ VM_METRIC_LIST(VM_METRIC_API); FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); \ } \ Isolate* iso = reinterpret_cast(isolate); \ - return iso->Get##variable##Metric()->value(); \ + return iso->Get##variable##Metric()->Value(); \ } ISOLATE_METRIC_LIST(ISOLATE_METRIC_API); #undef ISOLATE_METRIC_API diff --git a/runtime/vm/metrics.h b/runtime/vm/metrics.h index b54fc12746d..36d9e4bdcbf 100644 --- a/runtime/vm/metrics.h +++ b/runtime/vm/metrics.h @@ -88,7 +88,6 @@ class Metric { static Metric* vm_head() { return vm_list_head_; } - protected: // Override to get a callback when value is serialized to JSON. // Use this for metrics that produce their value on demand. virtual int64_t Value() const { return value(); } @@ -131,52 +130,52 @@ class MinMetric : public Metric { }; class MetricHeapOldUsed : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricHeapOldCapacity : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricHeapOldExternal : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricHeapNewUsed : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricHeapNewCapacity : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricHeapNewExternal : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricIsolateCount : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricCurrentRSS : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricPeakRSS : public Metric { - protected: + public: virtual int64_t Value() const; }; class MetricHeapUsed : public Metric { - protected: + public: virtual int64_t Value() const; }; diff --git a/runtime/vm/metrics_test.cc b/runtime/vm/metrics_test.cc index 4482a6d0faf..aceb5a71a22 100644 --- a/runtime/vm/metrics_test.cc +++ b/runtime/vm/metrics_test.cc @@ -4,6 +4,9 @@ #include "platform/assert.h" +#include "include/dart_api.h" +#include "include/dart_tools_api.h" + #include "vm/dart_api_impl.h" #include "vm/dart_api_state.h" #include "vm/globals.h" @@ -73,6 +76,42 @@ VM_UNIT_TEST_CASE(Metric_OnDemand) { Dart_ShutdownIsolate(); } +ISOLATE_UNIT_TEST_CASE(Metric_EmbedderAPI) { + { + TransitionVMToNative transition(Thread::Current()); + + const char* kScript = "void main() {}"; + Dart_Handle api_lib = TestCase::LoadTestScript( + kScript, /*resolver=*/nullptr, RESOLVED_USER_TEST_URI); + EXPECT_VALID(api_lib); + } + + // Ensure we've done new/old GCs to ensure max metrics are initialized. + String::New("", Heap::kNew); + Isolate::Current()->heap()->new_space()->Scavenge(); + Isolate::Current()->heap()->CollectAllGarbage(Heap::kLowMemory); + + // Ensure we've something live in new space. + String::New("", Heap::kNew); + + { + TransitionVMToNative transition(Thread::Current()); + + Dart_Isolate isolate = Dart_CurrentIsolate(); + EXPECT(Dart_VMIsolateCountMetric() > 0); + EXPECT(Dart_IsolateHeapOldUsedMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapOldUsedMaxMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapOldCapacityMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapOldCapacityMaxMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapNewUsedMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapNewUsedMaxMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapNewCapacityMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapNewCapacityMaxMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapGlobalUsedMetric(isolate) > 0); + EXPECT(Dart_IsolateHeapGlobalUsedMaxMetric(isolate) > 0); + } +} + #endif // !PRODUCT } // namespace dart