aconfig: Cache flag values for c/c++ codegen
Bug: b/307336730
Test: atest aconfig.test
Change-Id: Id604cf154d09a48f657277af6d799f0e17bc4e93
diff --git a/tools/aconfig/src/codegen_cpp.rs b/tools/aconfig/src/codegen_cpp.rs
index aeb57a3..9e77b45 100644
--- a/tools/aconfig/src/codegen_cpp.rs
+++ b/tools/aconfig/src/codegen_cpp.rs
@@ -31,9 +31,10 @@
where
I: Iterator<Item = &'a ProtoParsedFlag>,
{
+ let mut readwrite_count = 0;
let class_elements: Vec<ClassElement> =
- parsed_flags_iter.map(|pf| create_class_element(package, pf)).collect();
- let readwrite = class_elements.iter().any(|item| item.readwrite);
+ parsed_flags_iter.map(|pf| create_class_element(package, pf, &mut readwrite_count)).collect();
+ let readwrite = readwrite_count > 0;
let has_fixed_read_only = class_elements.iter().any(|item| item.is_fixed_read_only);
let header = package.replace('.', "_");
let package_macro = header.to_uppercase();
@@ -46,6 +47,7 @@
package,
has_fixed_read_only,
readwrite,
+ readwrite_count,
for_test: codegen_mode == CodegenMode::Test,
class_elements,
};
@@ -88,12 +90,14 @@
pub package: &'a str,
pub has_fixed_read_only: bool,
pub readwrite: bool,
+ pub readwrite_count: i32,
pub for_test: bool,
pub class_elements: Vec<ClassElement>,
}
#[derive(Serialize)]
pub struct ClassElement {
+ pub readwrite_idx: i32,
pub readwrite: bool,
pub is_fixed_read_only: bool,
pub default_value: String,
@@ -103,8 +107,13 @@
pub device_config_flag: String,
}
-fn create_class_element(package: &str, pf: &ProtoParsedFlag) -> ClassElement {
+fn create_class_element(package: &str, pf: &ProtoParsedFlag, rw_count: &mut i32) -> ClassElement {
ClassElement {
+ readwrite_idx: if pf.permission() == ProtoFlagPermission::READ_WRITE {
+ let index = *rw_count; *rw_count += 1; index
+ } else {
+ -1
+ },
readwrite: pf.permission() == ProtoFlagPermission::READ_WRITE,
is_fixed_read_only: pf.is_fixed_read_only(),
default_value: if pf.state() == ProtoFlagState::ENABLED {
@@ -139,8 +148,12 @@
#ifdef __cplusplus
#include <memory>
+#include <vector>
namespace com::android::aconfig::test {
+
+extern std::vector<int8_t> cache_;
+
class flag_provider_interface {
public:
virtual ~flag_provider_interface() = default;
@@ -330,10 +343,13 @@
}
virtual bool disabled_rw() override {
- return server_configurable_flags::GetServerConfigurableFlag(
- "aconfig_flags.aconfig_test",
- "com.android.aconfig.test.disabled_rw",
- "false") == "true";
+ if (cache_[0] == -1) {
+ cache_[0] = server_configurable_flags::GetServerConfigurableFlag(
+ "aconfig_flags.aconfig_test",
+ "com.android.aconfig.test.disabled_rw",
+ "false") == "true";
+ }
+ return cache_[0];
}
virtual bool enabled_fixed_ro() override {
@@ -345,14 +361,19 @@
}
virtual bool enabled_rw() override {
- return server_configurable_flags::GetServerConfigurableFlag(
- "aconfig_flags.aconfig_test",
- "com.android.aconfig.test.enabled_rw",
- "true") == "true";
+ if (cache_[1] == -1) {
+ cache_[1] = server_configurable_flags::GetServerConfigurableFlag(
+ "aconfig_flags.aconfig_test",
+ "com.android.aconfig.test.enabled_rw",
+ "true") == "true";
+ }
+ return cache_[1];
}
};
+ std::vector<int8_t> cache_ = std::vector<int8_t>(2, -1);
+
std::unique_ptr<flag_provider_interface> provider_ =
std::make_unique<flag_provider>();
}
diff --git a/tools/aconfig/templates/cpp_exported_header.template b/tools/aconfig/templates/cpp_exported_header.template
index 6413699..d19c0fa 100644
--- a/tools/aconfig/templates/cpp_exported_header.template
+++ b/tools/aconfig/templates/cpp_exported_header.template
@@ -18,10 +18,16 @@
#ifdef __cplusplus
#include <memory>
-
+{{ if not for_test- }}
+#include <vector>
+{{ -endif }}
namespace {cpp_namespace} \{
+{{ if not for_test- }}
+extern std::vector<int8_t> cache_;
+{{ -endif }}
+
class flag_provider_interface \{
public:
virtual ~flag_provider_interface() = default;
diff --git a/tools/aconfig/templates/cpp_source_file.template b/tools/aconfig/templates/cpp_source_file.template
index 0f1b845..91e828a 100644
--- a/tools/aconfig/templates/cpp_source_file.template
+++ b/tools/aconfig/templates/cpp_source_file.template
@@ -53,10 +53,13 @@
{{ for item in class_elements}}
virtual bool {item.flag_name}() override \{
{{ if item.readwrite- }}
- return server_configurable_flags::GetServerConfigurableFlag(
- "aconfig_flags.{item.device_config_namespace}",
- "{item.device_config_flag}",
- "{item.default_value}") == "true";
+ if (cache_[{item.readwrite_idx}] == -1) \{
+ cache_[{item.readwrite_idx}] = server_configurable_flags::GetServerConfigurableFlag(
+ "aconfig_flags.{item.device_config_namespace}",
+ "{item.device_config_flag}",
+ "{item.default_value}") == "true";
+ }
+ return cache_[{item.readwrite_idx}];
{{ -else- }}
{{ if item.is_fixed_read_only }}
return {package_macro}_{item.flag_macro};
@@ -68,13 +71,14 @@
{{ endfor }}
};
+ std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1);
{{ -endif }}
-
std::unique_ptr<flag_provider_interface> provider_ =
std::make_unique<flag_provider>();
+
}