1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 * * See the License for the specific language governing permissions and
10 * limitations under the License.
11 */
12
13#ifndef ART_RUNTIME_JIT_PROFILE_SAVER_OPTIONS_H_
14#define ART_RUNTIME_JIT_PROFILE_SAVER_OPTIONS_H_
15
16#include <ostream>
17#include <string>
18
19namespace art {
20
21struct ProfileSaverOptions {
22 public:
23  static constexpr uint32_t kMinSavePeriodMs = 40 * 1000;  // 40 seconds
24  static constexpr uint32_t kSaveResolvedClassesDelayMs = 5 * 1000;  // 5 seconds
25  // Minimum number of JIT samples during launch to mark a method as hot in the profile.
26  static constexpr uint32_t kHotStartupMethodSamples = 1;
27  static constexpr uint32_t kHotStartupMethodSamplesLowRam = 256;
28  static constexpr uint32_t kMinMethodsToSave = 10;
29  static constexpr uint32_t kMinClassesToSave = 10;
30  static constexpr uint32_t kMinNotificationBeforeWake = 10;
31  static constexpr uint32_t kMaxNotificationBeforeWake = 50;
32  static constexpr uint32_t kHotStartupMethodSamplesNotSet = std::numeric_limits<uint32_t>::max();
33
34  ProfileSaverOptions() :
35    enabled_(false),
36    min_save_period_ms_(kMinSavePeriodMs),
37    save_resolved_classes_delay_ms_(kSaveResolvedClassesDelayMs),
38    hot_startup_method_samples_(kHotStartupMethodSamplesNotSet),
39    min_methods_to_save_(kMinMethodsToSave),
40    min_classes_to_save_(kMinClassesToSave),
41    min_notification_before_wake_(kMinNotificationBeforeWake),
42    max_notification_before_wake_(kMaxNotificationBeforeWake),
43    profile_path_(""),
44    profile_boot_class_path_(false),
45    profile_aot_code_(false),
46    wait_for_jit_notifications_to_save_(true) {}
47
48  ProfileSaverOptions(
49      bool enabled,
50      uint32_t min_save_period_ms,
51      uint32_t save_resolved_classes_delay_ms,
52      uint32_t hot_startup_method_samples,
53      uint32_t min_methods_to_save,
54      uint32_t min_classes_to_save,
55      uint32_t min_notification_before_wake,
56      uint32_t max_notification_before_wake,
57      const std::string& profile_path,
58      bool profile_boot_class_path,
59      bool profile_aot_code = false,
60      bool wait_for_jit_notifications_to_save = true)
61  : enabled_(enabled),
62    min_save_period_ms_(min_save_period_ms),
63    save_resolved_classes_delay_ms_(save_resolved_classes_delay_ms),
64    hot_startup_method_samples_(hot_startup_method_samples),
65    min_methods_to_save_(min_methods_to_save),
66    min_classes_to_save_(min_classes_to_save),
67    min_notification_before_wake_(min_notification_before_wake),
68    max_notification_before_wake_(max_notification_before_wake),
69    profile_path_(profile_path),
70    profile_boot_class_path_(profile_boot_class_path),
71    profile_aot_code_(profile_aot_code),
72    wait_for_jit_notifications_to_save_(wait_for_jit_notifications_to_save) {}
73
74  bool IsEnabled() const {
75    return enabled_;
76  }
77  void SetEnabled(bool enabled) {
78    enabled_ = enabled;
79  }
80
81  uint32_t GetMinSavePeriodMs() const {
82    return min_save_period_ms_;
83  }
84  uint32_t GetSaveResolvedClassesDelayMs() const {
85    return save_resolved_classes_delay_ms_;
86  }
87  uint32_t GetHotStartupMethodSamples(bool is_low_ram) const {
88    uint32_t ret = hot_startup_method_samples_;
89    if (ret == kHotStartupMethodSamplesNotSet) {
90      ret = is_low_ram ? kHotStartupMethodSamplesLowRam : kHotStartupMethodSamples;
91    }
92    return ret;
93  }
94  uint32_t GetMinMethodsToSave() const {
95    return min_methods_to_save_;
96  }
97  uint32_t GetMinClassesToSave() const {
98    return min_classes_to_save_;
99  }
100  uint32_t GetMinNotificationBeforeWake() const {
101    return min_notification_before_wake_;
102  }
103  uint32_t GetMaxNotificationBeforeWake() const {
104    return max_notification_before_wake_;
105  }
106  std::string GetProfilePath() const {
107    return profile_path_;
108  }
109  bool GetProfileBootClassPath() const {
110    return profile_boot_class_path_;
111  }
112  bool GetProfileAOTCode() const {
113    return profile_aot_code_;
114  }
115  void SetProfileAOTCode(bool value) {
116    profile_aot_code_ = value;
117  }
118  bool GetWaitForJitNotificationsToSave() const {
119    return wait_for_jit_notifications_to_save_;
120  }
121  void SetWaitForJitNotificationsToSave(bool value) {
122    wait_for_jit_notifications_to_save_ = value;
123  }
124
125  friend std::ostream & operator<<(std::ostream &os, const ProfileSaverOptions& pso) {
126    os << "enabled_" << pso.enabled_
127        << ", min_save_period_ms_" << pso.min_save_period_ms_
128        << ", save_resolved_classes_delay_ms_" << pso.save_resolved_classes_delay_ms_
129        << ", hot_startup_method_samples_" << pso.hot_startup_method_samples_
130        << ", min_methods_to_save_" << pso.min_methods_to_save_
131        << ", min_classes_to_save_" << pso.min_classes_to_save_
132        << ", min_notification_before_wake_" << pso.min_notification_before_wake_
133        << ", max_notification_before_wake_" << pso.max_notification_before_wake_
134        << ", profile_boot_class_path_" << pso.profile_boot_class_path_
135        << ", profile_aot_code_" << pso.profile_aot_code_
136        << ", wait_for_jit_notifications_to_save_" << pso.wait_for_jit_notifications_to_save_;
137    return os;
138  }
139
140  bool enabled_;
141  uint32_t min_save_period_ms_;
142  uint32_t save_resolved_classes_delay_ms_;
143  // Do not access hot_startup_method_samples_ directly for reading since it may be set to the
144  // placeholder default.
145  uint32_t hot_startup_method_samples_;
146  uint32_t min_methods_to_save_;
147  uint32_t min_classes_to_save_;
148  uint32_t min_notification_before_wake_;
149  uint32_t max_notification_before_wake_;
150  std::string profile_path_;
151  bool profile_boot_class_path_;
152  bool profile_aot_code_;
153  bool wait_for_jit_notifications_to_save_;
154};
155
156}  // namespace art
157
158#endif  // ART_RUNTIME_JIT_PROFILE_SAVER_OPTIONS_H_
159