Loading tools/aconfig/aconfig/src/codegen/cpp.rs +4 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ where let header = package.replace('.', "_"); let package_macro = header.to_uppercase(); let cpp_namespace = package.replace('.', "::"); ensure!(class_elements.len() > 0); let container = class_elements[0].container.clone(); ensure!(codegen::is_valid_name_ident(&header)); let context = Context { header: &header, Loading @@ -56,6 +58,7 @@ where readwrite_count, is_test_mode: codegen_mode == CodegenMode::Test, class_elements, container, allow_instrumentation, }; Loading Loading @@ -100,6 +103,7 @@ pub struct Context<'a> { pub readwrite_count: i32, pub is_test_mode: bool, pub class_elements: Vec<ClassElement>, pub container: String, pub allow_instrumentation: bool, } Loading tools/aconfig/aconfig/templates/cpp_source_file.template +93 −65 Original line number Diff line number Diff line #include "{header}.h" {{ if allow_instrumentation }} {{ if readwrite- }} #include <sys/stat.h> #include "aconfig_storage/aconfig_storage_read_api.hpp" #include <android/log.h> #define ALOGI(msg, ...) \ __android_log_print(ANDROID_LOG_INFO, "AconfigTestMission1", (msg), __VA_ARGS__) #define LOG_TAG "aconfig_cpp_codegen" #define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) {{ -endif }} {{ endif }} {{ if readwrite- }} Loading Loading @@ -66,8 +66,60 @@ namespace {cpp_namespace} \{ class flag_provider : public flag_provider_interface \{ public: {{ -for item in class_elements }} {{ if allow_instrumentation- }} {{ if readwrite- }} flag_provider() {{ if readwrite- }} : cache_({readwrite_count}, -1) , boolean_start_index_() {{ -else- }} : boolean_start_index_() {{ -endif }} , flag_value_file_(nullptr) , read_from_new_storage_(false) \{ struct stat buffer; if (stat("/metadata/aconfig_test_missions/mission_1", &buffer) == 0) \{ read_from_new_storage_ = true; } auto package_map_file = aconfig_storage::get_mapped_file( "{container}", aconfig_storage::StorageFileType::package_map); if (!package_map_file.ok()) \{ ALOGI("error: failed to get package map file: %s", package_map_file.error().c_str()); return; } auto context = aconfig_storage::get_package_read_context( **package_map_file, "{package}"); if (!context.ok()) \{ ALOGI("error: failed to get package read context: %s", context.error().c_str()); return; } // cache package boolean flag start index boolean_start_index_ = context->boolean_start_index; // unmap package map file and free memory delete *package_map_file; auto flag_value_file = aconfig_storage::get_mapped_file( "{container}", aconfig_storage::StorageFileType::flag_val); if (!flag_value_file.ok()) \{ ALOGI("error: failed to get flag value file: %s", flag_value_file.error().c_str()); return; } // cache flag value file flag_value_file_ = std::unique_ptr<aconfig_storage::MappedStorageFile>( *flag_value_file); } {{ -endif }} {{ -endif }} {{ -for item in class_elements }} virtual bool {item.flag_name}() override \{ {{ -if item.readwrite }} if (cache_[{item.readwrite_idx}] == -1) \{ Loading @@ -76,6 +128,33 @@ namespace {cpp_namespace} \{ "{item.device_config_flag}", "{item.default_value}") == "true"; } {{ if allow_instrumentation- }} if (read_from_new_storage_) \{ if (!flag_value_file_) \{ ALOGI("error: failed to get flag {item.flag_name}: flag value file is null"); } auto value = aconfig_storage::get_boolean_flag_value( *flag_value_file_, boolean_start_index_ + {item.flag_offset}); if (!value.ok()) \{ ALOGI("error: failed to read flag value: %s", value.error().c_str()); } bool expected_value = cache_[{item.readwrite_idx}]; if (*value != expected_value) \{ ALOGI("error: {item.flag_name} value mismatch, new storage value is %s, old storage value is %s", *value, expected_value); } else \{ ALOGI("success: {item.flag_name} value matches"); } } {{ -endif }} return cache_[{item.readwrite_idx}]; {{ -else }} {{ -if item.is_fixed_read_only }} Loading @@ -86,12 +165,20 @@ namespace {cpp_namespace} \{ {{ -endif }} } {{ -endfor }} {{ if readwrite- }} private: std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1); {{ if allow_instrumentation- }} uint32_t boolean_start_index_; std::unique_ptr<aconfig_storage::MappedStorageFile> flag_value_file_; bool read_from_new_storage_; {{ -endif }} {{ -endif }} }; }; {{ -endif }} Loading @@ -107,62 +194,6 @@ bool {header}_{item.flag_name}() \{ {{ -if item.readwrite }} return {cpp_namespace}::{item.flag_name}(); {{ -else }} {{ if allow_instrumentation }} auto result = {{ if item.is_fixed_read_only }} {package_macro}_{item.flag_macro} {{ else }} {item.default_value} {{ endif }}; struct stat buffer; if (stat("/metadata/aconfig_test_missions/mission_1", &buffer) != 0) \{ return result; } auto package_map_file = aconfig_storage::get_mapped_file( "{item.container}", aconfig_storage::StorageFileType::package_map); if (!package_map_file.ok()) \{ ALOGI("error: failed to get package map file: %s", package_map_file.error().c_str()); return result; } auto package_read_context = aconfig_storage::get_package_read_context( **package_map_file, "{package}"); if (!package_read_context.ok()) \{ ALOGI("error: failed to get package read context: %s", package_map_file.error().c_str()); return result; } delete *package_map_file; auto flag_val_map = aconfig_storage::get_mapped_file( "{item.container}", aconfig_storage::StorageFileType::flag_val); if (!flag_val_map.ok()) \{ ALOGI("error: failed to get flag val map: %s", package_map_file.error().c_str()); return result; } auto value = aconfig_storage::get_boolean_flag_value( **flag_val_map, package_read_context->boolean_start_index + {item.flag_offset}); if (!value.ok()) \{ ALOGI("error: failed to get flag val: %s", package_map_file.error().c_str()); return result; } delete *flag_val_map; if (*value != result) \{ ALOGI("error: new storage value '%d' does not match current value '%d'", *value, result); } else \{ ALOGI("success: new storage value was '%d, legacy storage was '%d'", *value, result); } return result; {{ else }} {{ -if item.is_fixed_read_only }} return {package_macro}_{item.flag_macro}; {{ -else }} Loading @@ -170,7 +201,6 @@ bool {header}_{item.flag_name}() \{ {{ -endif }} {{ -endif }} {{ -endif }} {{ -endif }} } {{ -if is_test_mode }} Loading @@ -185,5 +215,3 @@ void {header}_reset_flags() \{ {cpp_namespace}::reset_flags(); } {{ -endif }} Loading
tools/aconfig/aconfig/src/codegen/cpp.rs +4 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ where let header = package.replace('.', "_"); let package_macro = header.to_uppercase(); let cpp_namespace = package.replace('.', "::"); ensure!(class_elements.len() > 0); let container = class_elements[0].container.clone(); ensure!(codegen::is_valid_name_ident(&header)); let context = Context { header: &header, Loading @@ -56,6 +58,7 @@ where readwrite_count, is_test_mode: codegen_mode == CodegenMode::Test, class_elements, container, allow_instrumentation, }; Loading Loading @@ -100,6 +103,7 @@ pub struct Context<'a> { pub readwrite_count: i32, pub is_test_mode: bool, pub class_elements: Vec<ClassElement>, pub container: String, pub allow_instrumentation: bool, } Loading
tools/aconfig/aconfig/templates/cpp_source_file.template +93 −65 Original line number Diff line number Diff line #include "{header}.h" {{ if allow_instrumentation }} {{ if readwrite- }} #include <sys/stat.h> #include "aconfig_storage/aconfig_storage_read_api.hpp" #include <android/log.h> #define ALOGI(msg, ...) \ __android_log_print(ANDROID_LOG_INFO, "AconfigTestMission1", (msg), __VA_ARGS__) #define LOG_TAG "aconfig_cpp_codegen" #define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) {{ -endif }} {{ endif }} {{ if readwrite- }} Loading Loading @@ -66,8 +66,60 @@ namespace {cpp_namespace} \{ class flag_provider : public flag_provider_interface \{ public: {{ -for item in class_elements }} {{ if allow_instrumentation- }} {{ if readwrite- }} flag_provider() {{ if readwrite- }} : cache_({readwrite_count}, -1) , boolean_start_index_() {{ -else- }} : boolean_start_index_() {{ -endif }} , flag_value_file_(nullptr) , read_from_new_storage_(false) \{ struct stat buffer; if (stat("/metadata/aconfig_test_missions/mission_1", &buffer) == 0) \{ read_from_new_storage_ = true; } auto package_map_file = aconfig_storage::get_mapped_file( "{container}", aconfig_storage::StorageFileType::package_map); if (!package_map_file.ok()) \{ ALOGI("error: failed to get package map file: %s", package_map_file.error().c_str()); return; } auto context = aconfig_storage::get_package_read_context( **package_map_file, "{package}"); if (!context.ok()) \{ ALOGI("error: failed to get package read context: %s", context.error().c_str()); return; } // cache package boolean flag start index boolean_start_index_ = context->boolean_start_index; // unmap package map file and free memory delete *package_map_file; auto flag_value_file = aconfig_storage::get_mapped_file( "{container}", aconfig_storage::StorageFileType::flag_val); if (!flag_value_file.ok()) \{ ALOGI("error: failed to get flag value file: %s", flag_value_file.error().c_str()); return; } // cache flag value file flag_value_file_ = std::unique_ptr<aconfig_storage::MappedStorageFile>( *flag_value_file); } {{ -endif }} {{ -endif }} {{ -for item in class_elements }} virtual bool {item.flag_name}() override \{ {{ -if item.readwrite }} if (cache_[{item.readwrite_idx}] == -1) \{ Loading @@ -76,6 +128,33 @@ namespace {cpp_namespace} \{ "{item.device_config_flag}", "{item.default_value}") == "true"; } {{ if allow_instrumentation- }} if (read_from_new_storage_) \{ if (!flag_value_file_) \{ ALOGI("error: failed to get flag {item.flag_name}: flag value file is null"); } auto value = aconfig_storage::get_boolean_flag_value( *flag_value_file_, boolean_start_index_ + {item.flag_offset}); if (!value.ok()) \{ ALOGI("error: failed to read flag value: %s", value.error().c_str()); } bool expected_value = cache_[{item.readwrite_idx}]; if (*value != expected_value) \{ ALOGI("error: {item.flag_name} value mismatch, new storage value is %s, old storage value is %s", *value, expected_value); } else \{ ALOGI("success: {item.flag_name} value matches"); } } {{ -endif }} return cache_[{item.readwrite_idx}]; {{ -else }} {{ -if item.is_fixed_read_only }} Loading @@ -86,12 +165,20 @@ namespace {cpp_namespace} \{ {{ -endif }} } {{ -endfor }} {{ if readwrite- }} private: std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1); {{ if allow_instrumentation- }} uint32_t boolean_start_index_; std::unique_ptr<aconfig_storage::MappedStorageFile> flag_value_file_; bool read_from_new_storage_; {{ -endif }} {{ -endif }} }; }; {{ -endif }} Loading @@ -107,62 +194,6 @@ bool {header}_{item.flag_name}() \{ {{ -if item.readwrite }} return {cpp_namespace}::{item.flag_name}(); {{ -else }} {{ if allow_instrumentation }} auto result = {{ if item.is_fixed_read_only }} {package_macro}_{item.flag_macro} {{ else }} {item.default_value} {{ endif }}; struct stat buffer; if (stat("/metadata/aconfig_test_missions/mission_1", &buffer) != 0) \{ return result; } auto package_map_file = aconfig_storage::get_mapped_file( "{item.container}", aconfig_storage::StorageFileType::package_map); if (!package_map_file.ok()) \{ ALOGI("error: failed to get package map file: %s", package_map_file.error().c_str()); return result; } auto package_read_context = aconfig_storage::get_package_read_context( **package_map_file, "{package}"); if (!package_read_context.ok()) \{ ALOGI("error: failed to get package read context: %s", package_map_file.error().c_str()); return result; } delete *package_map_file; auto flag_val_map = aconfig_storage::get_mapped_file( "{item.container}", aconfig_storage::StorageFileType::flag_val); if (!flag_val_map.ok()) \{ ALOGI("error: failed to get flag val map: %s", package_map_file.error().c_str()); return result; } auto value = aconfig_storage::get_boolean_flag_value( **flag_val_map, package_read_context->boolean_start_index + {item.flag_offset}); if (!value.ok()) \{ ALOGI("error: failed to get flag val: %s", package_map_file.error().c_str()); return result; } delete *flag_val_map; if (*value != result) \{ ALOGI("error: new storage value '%d' does not match current value '%d'", *value, result); } else \{ ALOGI("success: new storage value was '%d, legacy storage was '%d'", *value, result); } return result; {{ else }} {{ -if item.is_fixed_read_only }} return {package_macro}_{item.flag_macro}; {{ -else }} Loading @@ -170,7 +201,6 @@ bool {header}_{item.flag_name}() \{ {{ -endif }} {{ -endif }} {{ -endif }} {{ -endif }} } {{ -if is_test_mode }} Loading @@ -185,5 +215,3 @@ void {header}_reset_flags() \{ {cpp_namespace}::reset_flags(); } {{ -endif }}