From 3706fb6a3b92265388c8260072a6fa699fe45373 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Jan 2020 13:32:42 -0800 Subject: [PATCH 1/6] Made it so you can specify the old gen heap size. --- common/settings.cc | 1 + common/settings.h | 6 ++++++ runtime/dart_vm.cc | 16 ++++++++++++++++ runtime/dart_vm_unittests.cc | 10 ++++++++++ 4 files changed, 33 insertions(+) diff --git a/common/settings.cc b/common/settings.cc index b1ef2161fa561..c6a0d8a32a2e7 100644 --- a/common/settings.cc +++ b/common/settings.cc @@ -58,6 +58,7 @@ std::string Settings::ToString() const { stream << "assets_path: " << assets_path << std::endl; stream << "frame_rasterized_callback set: " << !!frame_rasterized_callback << std::endl; + stream << "old_gen_heap_size: " << old_gen_heap_size << std::endl; return stream.str(); } diff --git a/common/settings.h b/common/settings.h index 761b7734fbf73..928c1031d6e11 100644 --- a/common/settings.h +++ b/common/settings.h @@ -191,6 +191,12 @@ struct Settings { // the buffer must be as small as possible. std::shared_ptr persistent_isolate_data; + /// Max size of old gen heap size in MB, or 0 for unlimited, -1 for default + /// value. + /// + /// See also: https://github.com/dart-lang/sdk/blob/ca64509108b3e7219c50d6c52877c85ab6a35ff2/runtime/vm/flag_list.h#L150 + int64_t old_gen_heap_size = -1; + std::string ToString() const; }; diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index 234e06f87eff7..7d6af8cc3ab7a 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -111,6 +111,15 @@ static const char* kDartTraceStreamsArgs[] = { "--timeline_streams=Compiler,Dart,Debugger,Embedder,GC,Isolate,VM,API", }; +static std::string DartOldGenHeapSizeArgs(uint64_t heap_size) { + static const int32_t buffer_size = 100; + const char* flag = "--old_gen_heap_size="; + char buffer[buffer_size]; + int result = snprintf(buffer, buffer_size, "%s%lld", flag, heap_size); + FML_DCHECK(result >= 0 && result < buffer_size); + return buffer; +} + constexpr char kFileUriPrefix[] = "file://"; constexpr size_t kFileUriPrefixLength = sizeof(kFileUriPrefix) - 1; @@ -366,6 +375,13 @@ DartVM::DartVM(std::shared_ptr vm_data, PushBackAll(&args, kDartTraceStartupArgs, fml::size(kDartTraceStartupArgs)); } + std::string old_gen_heap_size_args; + if (settings_.old_gen_heap_size >= 0) { + old_gen_heap_size_args = + DartOldGenHeapSizeArgs(settings_.old_gen_heap_size); + args.push_back(old_gen_heap_size_args.c_str()); + } + #if defined(OS_FUCHSIA) PushBackAll(&args, kDartFuchsiaTraceArgs, fml::size(kDartFuchsiaTraceArgs)); PushBackAll(&args, kDartTraceStreamsArgs, fml::size(kDartTraceStreamsArgs)); diff --git a/runtime/dart_vm_unittests.cc b/runtime/dart_vm_unittests.cc index 3b4d169a502d3..26fa4231fdfb7 100644 --- a/runtime/dart_vm_unittests.cc +++ b/runtime/dart_vm_unittests.cc @@ -32,5 +32,15 @@ TEST_F(DartVMTest, SimpleIsolateNameServer) { ASSERT_TRUE(ns->RemoveIsolateNameMapping("foobar")); } +TEST_F(DartVMTest, OldGenHeapSize) { + ASSERT_FALSE(DartVMRef::IsInstanceRunning()); + auto settings = CreateSettingsForFixture(); + settings.old_gen_heap_size = 1024; + auto vm = DartVMRef::Create(settings); + // There is no way to introspect on the heap size so we just assert the vm was + // created. + ASSERT_TRUE(vm); +} + } // namespace testing } // namespace flutter From a1420cd9a322562ce36d8c7dc101dea178c718c6 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Jan 2020 13:49:13 -0800 Subject: [PATCH 2/6] ran formatter --- common/settings.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/settings.h b/common/settings.h index 928c1031d6e11..6db62483f4ca4 100644 --- a/common/settings.h +++ b/common/settings.h @@ -194,7 +194,8 @@ struct Settings { /// Max size of old gen heap size in MB, or 0 for unlimited, -1 for default /// value. /// - /// See also: https://github.com/dart-lang/sdk/blob/ca64509108b3e7219c50d6c52877c85ab6a35ff2/runtime/vm/flag_list.h#L150 + /// See also: + /// https://github.com/dart-lang/sdk/blob/ca64509108b3e7219c50d6c52877c85ab6a35ff2/runtime/vm/flag_list.h#L150 int64_t old_gen_heap_size = -1; std::string ToString() const; From b9f59ab6d25314796dc254a0586ebc34fa9e1b61 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Jan 2020 13:52:05 -0800 Subject: [PATCH 3/6] switched to constexpr --- runtime/dart_vm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index 7d6af8cc3ab7a..9b06b5535204e 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -112,7 +112,7 @@ static const char* kDartTraceStreamsArgs[] = { }; static std::string DartOldGenHeapSizeArgs(uint64_t heap_size) { - static const int32_t buffer_size = 100; + constexpr int32_t buffer_size = 100; const char* flag = "--old_gen_heap_size="; char buffer[buffer_size]; int result = snprintf(buffer, buffer_size, "%s%lld", flag, heap_size); From 49d0f0d5a8b09bb67e9848e1d9b62bb6bb9bd80b Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Jan 2020 13:55:28 -0800 Subject: [PATCH 4/6] fixed snprintf variable --- runtime/dart_vm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index 9b06b5535204e..2e8b7b850b9ca 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -115,7 +115,7 @@ static std::string DartOldGenHeapSizeArgs(uint64_t heap_size) { constexpr int32_t buffer_size = 100; const char* flag = "--old_gen_heap_size="; char buffer[buffer_size]; - int result = snprintf(buffer, buffer_size, "%s%lld", flag, heap_size); + int result = snprintf(buffer, buffer_size, "%s%" PRId64, flag, heap_size); FML_DCHECK(result >= 0 && result < buffer_size); return buffer; } From c75eb3ba67fa016b8bcca2e1b10d9f91e13c0048 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Jan 2020 14:43:23 -0800 Subject: [PATCH 5/6] exposed the flag to embedder --- shell/platform/embedder/embedder.cc | 1 + shell/platform/embedder/embedder.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index 6b45e0b8e88e7..fdbafe1f0c5b1 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -664,6 +664,7 @@ FlutterEngineResult FlutterEngineInitialize(size_t version, settings.icu_data_path = icu_data_path; settings.assets_path = args->assets_path; settings.leak_vm = !SAFE_ACCESS(args, shutdown_dart_vm_when_done, false); + settings.old_gen_heap_size = SAFE_ACCESS(args, dart_old_gen_heap_size, -1); if (!flutter::DartVM::IsRunningPrecompiledCode()) { // Verify the assets path contains Dart 2 kernel assets. diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 796d9bc90a2dd..aefb1e98781fd 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -1114,6 +1114,13 @@ typedef struct { /// absence, platforms views in the scene are ignored and Flutter renders to /// the root surface as normal. const FlutterCompositor* compositor; + + /// Max size of the old gen heap for the Dart VM in MB, or 0 for unlimited, -1 + /// for default value. + /// + /// See also: + /// https://github.com/dart-lang/sdk/blob/ca64509108b3e7219c50d6c52877c85ab6a35ff2/runtime/vm/flag_list.h#L150 + int64_t dart_old_gen_heap_size; } FlutterProjectArgs; //------------------------------------------------------------------------------ From f637990e10b654066b1977dc544cc342514ab28c Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Jan 2020 15:06:11 -0800 Subject: [PATCH 6/6] switched to stringstreams --- runtime/dart_vm.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index 2e8b7b850b9ca..de058443adab1 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -7,6 +7,7 @@ #include #include +#include #include #include "flutter/common/settings.h" @@ -112,12 +113,9 @@ static const char* kDartTraceStreamsArgs[] = { }; static std::string DartOldGenHeapSizeArgs(uint64_t heap_size) { - constexpr int32_t buffer_size = 100; - const char* flag = "--old_gen_heap_size="; - char buffer[buffer_size]; - int result = snprintf(buffer, buffer_size, "%s%" PRId64, flag, heap_size); - FML_DCHECK(result >= 0 && result < buffer_size); - return buffer; + std::ostringstream oss; + oss << "--old_gen_heap_size=" << heap_size; + return oss.str(); } constexpr char kFileUriPrefix[] = "file://";