/* * Copyright 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ART_RUNTIME_JIT_JIT_OPTIONS_H_ #define ART_RUNTIME_JIT_JIT_OPTIONS_H_ #include "base/macros.h" #include "base/runtime_debug.h" #include "profile_saver_options.h" namespace art HIDDEN { struct RuntimeArgumentMap; namespace jit { // At what priority to schedule jit threads. 9 is the lowest foreground priority on device. // See android/os/Process.java. static constexpr int kJitPoolThreadPthreadDefaultPriority = 9; // At what priority to schedule jit zygote threads compiling profiles in the background. // 19 is the lowest background priority on device. // See android/os/Process.java. static constexpr int kJitZygotePoolThreadPthreadDefaultPriority = 19; class JitOptions { public: DECLARE_RUNTIME_DEBUG_FLAG(kSlowMode); static JitOptions* CreateFromRuntimeArguments(const RuntimeArgumentMap& options); uint16_t GetOptimizeThreshold() const { return optimize_threshold_; } uint16_t GetWarmupThreshold() const { return warmup_threshold_; } uint16_t GetPriorityThreadWeight() const { return priority_thread_weight_; } uint16_t GetInvokeTransitionWeight() const { return invoke_transition_weight_; } size_t GetCodeCacheInitialCapacity() const { return code_cache_initial_capacity_; } size_t GetCodeCacheMaxCapacity() const { return code_cache_max_capacity_; } bool DumpJitInfoOnShutdown() const { return dump_info_on_shutdown_; } const ProfileSaverOptions& GetProfileSaverOptions() const { return profile_saver_options_; } bool GetSaveProfilingInfo() const { return profile_saver_options_.IsEnabled(); } int GetThreadPoolPthreadPriority() const { return thread_pool_pthread_priority_; } int GetZygoteThreadPoolPthreadPriority() const { return zygote_thread_pool_pthread_priority_; } bool UseJitCompilation() const { return use_jit_compilation_; } bool UseProfiledJitCompilation() const { return use_profiled_jit_compilation_; } void SetUseJitCompilation(bool b) { use_jit_compilation_ = b; } void SetSaveProfilingInfo(bool save_profiling_info) { profile_saver_options_.SetEnabled(save_profiling_info); } void SetWaitForJitNotificationsToSaveProfile(bool value) { profile_saver_options_.SetWaitForJitNotificationsToSave(value); } void SetJitAtFirstUse() { use_jit_compilation_ = true; optimize_threshold_ = 0; } void SetUseBaselineCompiler() { use_baseline_compiler_ = true; } bool UseBaselineCompiler() const { return use_baseline_compiler_; } private: // We add the sample in batches of size kJitSamplesBatchSize. // This method rounds the threshold so that it is multiple of the batch size. static uint32_t RoundUpThreshold(uint32_t threshold); bool use_jit_compilation_; bool use_profiled_jit_compilation_; bool use_baseline_compiler_; size_t code_cache_initial_capacity_; size_t code_cache_max_capacity_; uint32_t optimize_threshold_; uint32_t warmup_threshold_; uint16_t priority_thread_weight_; uint16_t invoke_transition_weight_; bool dump_info_on_shutdown_; int thread_pool_pthread_priority_; int zygote_thread_pool_pthread_priority_; ProfileSaverOptions profile_saver_options_; JitOptions() : use_jit_compilation_(false), use_profiled_jit_compilation_(false), use_baseline_compiler_(false), code_cache_initial_capacity_(0), code_cache_max_capacity_(0), optimize_threshold_(0), warmup_threshold_(0), priority_thread_weight_(0), invoke_transition_weight_(0), dump_info_on_shutdown_(false), thread_pool_pthread_priority_(kJitPoolThreadPthreadDefaultPriority), zygote_thread_pool_pthread_priority_(kJitZygotePoolThreadPthreadDefaultPriority) {} DISALLOW_COPY_AND_ASSIGN(JitOptions); }; } // namespace jit } // namespace art #endif // ART_RUNTIME_JIT_JIT_OPTIONS_H_