Merge changes from topic "rust_caching" into main

* changes:
  aconfig: Cache flag values for rust codegen
  aconfig: Cache flag values for c/c++ codegen
This commit is contained in:
Dennis Shen
2023-11-09 20:03:42 +00:00
committed by Gerrit Code Review
5 changed files with 82 additions and 29 deletions

View File

@@ -31,9 +31,10 @@ pub fn generate_cpp_code<'a, I>(
where where
I: Iterator<Item = &'a ProtoParsedFlag>, I: Iterator<Item = &'a ProtoParsedFlag>,
{ {
let mut readwrite_count = 0;
let class_elements: Vec<ClassElement> = let class_elements: Vec<ClassElement> =
parsed_flags_iter.map(|pf| create_class_element(package, pf)).collect(); parsed_flags_iter.map(|pf| create_class_element(package, pf, &mut readwrite_count)).collect();
let readwrite = class_elements.iter().any(|item| item.readwrite); let readwrite = readwrite_count > 0;
let has_fixed_read_only = class_elements.iter().any(|item| item.is_fixed_read_only); let has_fixed_read_only = class_elements.iter().any(|item| item.is_fixed_read_only);
let header = package.replace('.', "_"); let header = package.replace('.', "_");
let package_macro = header.to_uppercase(); let package_macro = header.to_uppercase();
@@ -46,6 +47,7 @@ where
package, package,
has_fixed_read_only, has_fixed_read_only,
readwrite, readwrite,
readwrite_count,
for_test: codegen_mode == CodegenMode::Test, for_test: codegen_mode == CodegenMode::Test,
class_elements, class_elements,
}; };
@@ -88,12 +90,14 @@ pub struct Context<'a> {
pub package: &'a str, pub package: &'a str,
pub has_fixed_read_only: bool, pub has_fixed_read_only: bool,
pub readwrite: bool, pub readwrite: bool,
pub readwrite_count: i32,
pub for_test: bool, pub for_test: bool,
pub class_elements: Vec<ClassElement>, pub class_elements: Vec<ClassElement>,
} }
#[derive(Serialize)] #[derive(Serialize)]
pub struct ClassElement { pub struct ClassElement {
pub readwrite_idx: i32,
pub readwrite: bool, pub readwrite: bool,
pub is_fixed_read_only: bool, pub is_fixed_read_only: bool,
pub default_value: String, pub default_value: String,
@@ -103,8 +107,13 @@ pub struct ClassElement {
pub device_config_flag: String, 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 { 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, readwrite: pf.permission() == ProtoFlagPermission::READ_WRITE,
is_fixed_read_only: pf.is_fixed_read_only(), is_fixed_read_only: pf.is_fixed_read_only(),
default_value: if pf.state() == ProtoFlagState::ENABLED { default_value: if pf.state() == ProtoFlagState::ENABLED {
@@ -139,8 +148,12 @@ mod tests {
#ifdef __cplusplus #ifdef __cplusplus
#include <memory> #include <memory>
#include <vector>
namespace com::android::aconfig::test { namespace com::android::aconfig::test {
extern std::vector<int8_t> cache_;
class flag_provider_interface { class flag_provider_interface {
public: public:
virtual ~flag_provider_interface() = default; virtual ~flag_provider_interface() = default;
@@ -330,10 +343,13 @@ namespace com::android::aconfig::test {
} }
virtual bool disabled_rw() override { virtual bool disabled_rw() override {
return server_configurable_flags::GetServerConfigurableFlag( if (cache_[0] == -1) {
"aconfig_flags.aconfig_test", cache_[0] = server_configurable_flags::GetServerConfigurableFlag(
"com.android.aconfig.test.disabled_rw", "aconfig_flags.aconfig_test",
"false") == "true"; "com.android.aconfig.test.disabled_rw",
"false") == "true";
}
return cache_[0];
} }
virtual bool enabled_fixed_ro() override { virtual bool enabled_fixed_ro() override {
@@ -345,14 +361,19 @@ namespace com::android::aconfig::test {
} }
virtual bool enabled_rw() override { virtual bool enabled_rw() override {
return server_configurable_flags::GetServerConfigurableFlag( if (cache_[1] == -1) {
"aconfig_flags.aconfig_test", cache_[1] = server_configurable_flags::GetServerConfigurableFlag(
"com.android.aconfig.test.enabled_rw", "aconfig_flags.aconfig_test",
"true") == "true"; "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::unique_ptr<flag_provider_interface> provider_ =
std::make_unique<flag_provider>(); std::make_unique<flag_provider>();
} }

View File

@@ -32,10 +32,12 @@ where
{ {
let template_flags: Vec<TemplateParsedFlag> = let template_flags: Vec<TemplateParsedFlag> =
parsed_flags_iter.map(|pf| TemplateParsedFlag::new(package, pf)).collect(); parsed_flags_iter.map(|pf| TemplateParsedFlag::new(package, pf)).collect();
let has_readwrite = template_flags.iter().any(|item| item.readwrite);
let context = TemplateContext { let context = TemplateContext {
package: package.to_string(), package: package.to_string(),
template_flags, template_flags,
modules: package.split('.').map(|s| s.to_string()).collect::<Vec<_>>(), modules: package.split('.').map(|s| s.to_string()).collect::<Vec<_>>(),
has_readwrite,
}; };
let mut template = TinyTemplate::new(); let mut template = TinyTemplate::new();
template.add_template( template.add_template(
@@ -55,6 +57,7 @@ struct TemplateContext {
pub package: String, pub package: String,
pub template_flags: Vec<TemplateParsedFlag>, pub template_flags: Vec<TemplateParsedFlag>,
pub modules: Vec<String>, pub modules: Vec<String>,
pub has_readwrite: bool,
} }
#[derive(Serialize)] #[derive(Serialize)]
@@ -94,6 +97,20 @@ mod tests {
/// flag provider /// flag provider
pub struct FlagProvider; 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 { impl FlagProvider {
/// query flag disabled_ro /// query flag disabled_ro
pub fn disabled_ro(&self) -> bool { pub fn disabled_ro(&self) -> bool {
@@ -102,10 +119,7 @@ impl FlagProvider {
/// query flag disabled_rw /// query flag disabled_rw
pub fn disabled_rw(&self) -> bool { pub fn disabled_rw(&self) -> bool {
flags_rust::GetServerConfigurableFlag( *CACHED_disabled_rw
"aconfig_flags.aconfig_test",
"com.android.aconfig.test.disabled_rw",
"false") == "true"
} }
/// query flag enabled_fixed_ro /// query flag enabled_fixed_ro
@@ -120,10 +134,7 @@ impl FlagProvider {
/// query flag enabled_rw /// query flag enabled_rw
pub fn enabled_rw(&self) -> bool { pub fn enabled_rw(&self) -> bool {
flags_rust::GetServerConfigurableFlag( *CACHED_enabled_rw
"aconfig_flags.aconfig_test",
"com.android.aconfig.test.enabled_rw",
"true") == "true"
} }
} }

View File

@@ -18,10 +18,16 @@
#ifdef __cplusplus #ifdef __cplusplus
#include <memory> #include <memory>
{{ if not for_test- }}
#include <vector>
{{ -endif }}
namespace {cpp_namespace} \{ namespace {cpp_namespace} \{
{{ if not for_test- }}
extern std::vector<int8_t> cache_;
{{ -endif }}
class flag_provider_interface \{ class flag_provider_interface \{
public: public:
virtual ~flag_provider_interface() = default; virtual ~flag_provider_interface() = default;

View File

@@ -53,10 +53,13 @@ namespace {cpp_namespace} \{
{{ for item in class_elements}} {{ for item in class_elements}}
virtual bool {item.flag_name}() override \{ virtual bool {item.flag_name}() override \{
{{ if item.readwrite- }} {{ if item.readwrite- }}
return server_configurable_flags::GetServerConfigurableFlag( if (cache_[{item.readwrite_idx}] == -1) \{
"aconfig_flags.{item.device_config_namespace}", cache_[{item.readwrite_idx}] = server_configurable_flags::GetServerConfigurableFlag(
"{item.device_config_flag}", "aconfig_flags.{item.device_config_namespace}",
"{item.default_value}") == "true"; "{item.device_config_flag}",
"{item.default_value}") == "true";
}
return cache_[{item.readwrite_idx}];
{{ -else- }} {{ -else- }}
{{ if item.is_fixed_read_only }} {{ if item.is_fixed_read_only }}
return {package_macro}_{item.flag_macro}; return {package_macro}_{item.flag_macro};
@@ -68,13 +71,14 @@ namespace {cpp_namespace} \{
{{ endfor }} {{ endfor }}
}; };
std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1);
{{ -endif }} {{ -endif }}
std::unique_ptr<flag_provider_interface> provider_ = std::unique_ptr<flag_provider_interface> provider_ =
std::make_unique<flag_provider>(); std::make_unique<flag_provider>();
} }

View File

@@ -3,16 +3,27 @@
/// flag provider /// flag provider
pub struct FlagProvider; 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 \{ impl FlagProvider \{
{{ for flag in template_flags }} {{ for flag in template_flags }}
/// query flag {flag.name} /// query flag {flag.name}
pub fn {flag.name}(&self) -> bool \{ pub fn {flag.name}(&self) -> bool \{
{{ if flag.readwrite -}} {{ if flag.readwrite -}}
flags_rust::GetServerConfigurableFlag( *CACHED_{flag.name}
"aconfig_flags.{flag.device_config_namespace}",
"{flag.device_config_flag}",
"{flag.default_value}") == "true"
{{ -else- }} {{ -else- }}
{flag.default_value} {flag.default_value}
{{ -endif }} {{ -endif }}