// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef FLUTTER_RUNTIME_DART_VM_LIFECYCLE_H_ #define FLUTTER_RUNTIME_DART_VM_LIFECYCLE_H_ #include #include "flutter/fml/macros.h" #include "flutter/lib/ui/isolate_name_server/isolate_name_server.h" #include "flutter/runtime/dart_vm.h" #include "flutter/runtime/service_protocol.h" #include "third_party/dart/runtime/include/dart_tools_api.h" namespace flutter { // A strong reference to the Dart VM. There can only be one VM running in the // process at any given time. A reference to the VM may only be obtained via the // |Create| method. In case there is already a running instance of the VM in the // process, a strong reference to that VM is obtained and the arguments to the // |Create| call ignored. If there is no VM already running in the process, a VM // is initialized in a thread safe manner and returned to the caller. The VM // will shutdown only when all callers relinquish their references (by // collecting their instances of this class). // // DartVMRef instances may be created on any thread. class DartVMRef { public: [[nodiscard]] static DartVMRef Create( const Settings& settings, fml::RefPtr vm_snapshot = nullptr, fml::RefPtr isolate_snapshot = nullptr); DartVMRef(const DartVMRef&) = default; DartVMRef(DartVMRef&&); ~DartVMRef(); // This is an inherently racy way to check if a VM instance is running and // should not be used outside of unit-tests where there is a known threading // model. static bool IsInstanceRunning(); static std::shared_ptr GetVMData(); static std::shared_ptr GetServiceProtocol(); static std::shared_ptr GetIsolateNameServer(); explicit operator bool() const { return static_cast(vm_); } DartVM* get() { FML_DCHECK(vm_); return vm_.get(); } const DartVM* get() const { FML_DCHECK(vm_); return vm_.get(); } DartVM* operator->() { FML_DCHECK(vm_); return vm_.get(); } const DartVM* operator->() const { FML_DCHECK(vm_); return vm_.get(); } // NOLINTNEXTLINE(google-runtime-operator) DartVM* operator&() { FML_DCHECK(vm_); return vm_.get(); } private: friend class DartIsolate; std::shared_ptr vm_; explicit DartVMRef(std::shared_ptr vm); // Only used by Dart Isolate to register itself with the VM. static DartVM* GetRunningVM(); }; } // namespace flutter #endif // FLUTTER_RUNTIME_DART_VM_LIFECYCLE_H_