From 737b8e30a190395d5011e2fd7a0e4a070dd0f08b Mon Sep 17 00:00:00 2001 From: Dennis Shen Date: Wed, 8 Nov 2023 19:58:47 +0000 Subject: [PATCH] aconfig: Cache flag values for rust codegen Bug: b/307336730 Test: atest aconfig.test Change-Id: I01741a4205cbe4e9b007f43b043505bcbcf05cd8 --- tools/aconfig/src/codegen_rust.rs | 27 +++++++++++++++------- tools/aconfig/templates/rust_prod.template | 19 +++++++++++---- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/tools/aconfig/src/codegen_rust.rs b/tools/aconfig/src/codegen_rust.rs index 4e4c7dd58a..78e62ba095 100644 --- a/tools/aconfig/src/codegen_rust.rs +++ b/tools/aconfig/src/codegen_rust.rs @@ -32,10 +32,12 @@ where { let template_flags: Vec = parsed_flags_iter.map(|pf| TemplateParsedFlag::new(package, pf)).collect(); + let has_readwrite = template_flags.iter().any(|item| item.readwrite); let context = TemplateContext { package: package.to_string(), template_flags, modules: package.split('.').map(|s| s.to_string()).collect::>(), + has_readwrite, }; let mut template = TinyTemplate::new(); template.add_template( @@ -55,6 +57,7 @@ struct TemplateContext { pub package: String, pub template_flags: Vec, pub modules: Vec, + pub has_readwrite: bool, } #[derive(Serialize)] @@ -94,6 +97,20 @@ mod tests { /// flag provider pub struct FlagProvider; +lazy_static::lazy_static! { + /// flag value cache for disabled_rw + static ref CACHED_disabled_rw: bool = flags_rust::GetServerConfigurableFlag( + "aconfig_flags.aconfig_test", + "com.android.aconfig.test.disabled_rw", + "false") == "true"; + + /// flag value cache for enabled_rw + static ref CACHED_enabled_rw: bool = flags_rust::GetServerConfigurableFlag( + "aconfig_flags.aconfig_test", + "com.android.aconfig.test.enabled_rw", + "true") == "true"; +} + impl FlagProvider { /// query flag disabled_ro pub fn disabled_ro(&self) -> bool { @@ -102,10 +119,7 @@ impl FlagProvider { /// query flag disabled_rw pub fn disabled_rw(&self) -> bool { - flags_rust::GetServerConfigurableFlag( - "aconfig_flags.aconfig_test", - "com.android.aconfig.test.disabled_rw", - "false") == "true" + *CACHED_disabled_rw } /// query flag enabled_fixed_ro @@ -120,10 +134,7 @@ impl FlagProvider { /// query flag enabled_rw pub fn enabled_rw(&self) -> bool { - flags_rust::GetServerConfigurableFlag( - "aconfig_flags.aconfig_test", - "com.android.aconfig.test.enabled_rw", - "true") == "true" + *CACHED_enabled_rw } } diff --git a/tools/aconfig/templates/rust_prod.template b/tools/aconfig/templates/rust_prod.template index e22ad6faa4..30ea646614 100644 --- a/tools/aconfig/templates/rust_prod.template +++ b/tools/aconfig/templates/rust_prod.template @@ -3,16 +3,27 @@ /// flag provider pub struct FlagProvider; +{{ if has_readwrite - }} +lazy_static::lazy_static! \{ + {{ for flag in template_flags }} + {{ if flag.readwrite -}} + /// flag value cache for {flag.name} + static ref CACHED_{flag.name}: bool = flags_rust::GetServerConfigurableFlag( + "aconfig_flags.{flag.device_config_namespace}", + "{flag.device_config_flag}", + "{flag.default_value}") == "true"; + {{ -endif }} + {{ endfor }} +} +{{ -endif }} + impl FlagProvider \{ {{ for flag in template_flags }} /// query flag {flag.name} pub fn {flag.name}(&self) -> bool \{ {{ if flag.readwrite -}} - flags_rust::GetServerConfigurableFlag( - "aconfig_flags.{flag.device_config_namespace}", - "{flag.device_config_flag}", - "{flag.default_value}") == "true" + *CACHED_{flag.name} {{ -else- }} {flag.default_value} {{ -endif }}