// 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_PTRACE_CHECK_H_ #define FLUTTER_RUNTIME_PTRACE_CHECK_H_ #include "flutter/common/settings.h" #include "flutter/fml/build_config.h" namespace flutter { #define TRACING_CHECKS_NECESSARY \ FML_OS_IOS && !TARGET_OS_SIMULATOR && \ (FLUTTER_RUNTIME_MODE == FLUTTER_RUNTIME_MODE_DEBUG) enum class TracingResult { kNotAttempted, kEnabled, kNotNecessary = kEnabled, kDisabled, }; #if TRACING_CHECKS_NECESSARY bool EnableTracingIfNecessaryImpl(const Settings& vm_settings); TracingResult GetTracingResultImpl(); #endif // TRACING_CHECKS_NECESSARY //------------------------------------------------------------------------------ /// @brief Enables tracing in the process so that JIT mode VMs may be /// launched. Explicitly enabling tracing is not required on all /// platforms. On platforms where it is not required, calling this /// method will return true. If tracing is required but cannot be /// enabled, it is the responsibility of the caller to display the /// appropriate error message to the user as subsequent attempts to /// launch the VM in JIT mode will cause process termination. /// /// This method may be called multiple times and will return the /// same result. There are no threading restrictions. /// /// @param[in] vm_settings The settings used to launch the VM. /// /// @return If tracing was enabled. /// inline bool EnableTracingIfNecessary(const Settings& vm_settings) { #if TRACING_CHECKS_NECESSARY return EnableTracingIfNecessaryImpl(vm_settings); #else // TRACING_CHECKS_NECESSARY return true; #endif // TRACING_CHECKS_NECESSARY } //------------------------------------------------------------------------------ /// @brief Returns if a tracing check has been performed and its result. To /// enable tracing, the Settings object used to launch the VM is /// required. Components may want to display messages based on the /// result of a previous tracing check without actually having the /// settings object. This accessor can be used instead. /// /// @return The tracing result. /// inline TracingResult GetTracingResult() { #if TRACING_CHECKS_NECESSARY return GetTracingResultImpl(); #else // TRACING_CHECKS_NECESSARY return TracingResult::kNotNecessary; #endif // TRACING_CHECKS_NECESSARY } } // namespace flutter #endif // FLUTTER_RUNTIME_PTRACE_CHECK_H_