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:
@@ -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>();
|
||||||
}
|
}
|
||||||
|
@@ -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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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>();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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 }}
|
||||||
|
Reference in New Issue
Block a user