Loading tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp +22 −12 Original line number Diff line number Diff line #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/unique_fd.h> #include <sys/mman.h> #include <sys/stat.h> Loading @@ -26,13 +27,13 @@ android::base::Result<MutableMappedStorageFile*> map_mutable_storage_file( size_t file_size = file_stat.st_size; const int fd = open(file.c_str(), O_RDWR | O_NOFOLLOW | O_CLOEXEC); if (fd == -1) { android::base::unique_fd ufd(open(file.c_str(), O_RDWR | O_NOFOLLOW | O_CLOEXEC)); if (ufd.get() == -1) { return android::base::ErrnoError() << "failed to open " << file; }; void *const map_result = mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, ufd.get(), 0); if (map_result == MAP_FAILED) { return android::base::ErrnoError() << "mmap failed"; } Loading @@ -55,6 +56,9 @@ android::base::Result<void> set_boolean_flag_value( if (!update_cxx.update_success) { return android::base::Error() << update_cxx.error_message.c_str(); } if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) { return android::base::ErrnoError() << "msync failed"; } return {}; } Loading @@ -71,6 +75,9 @@ android::base::Result<void> set_flag_has_server_override( if (!update_cxx.update_success) { return android::base::Error() << update_cxx.error_message.c_str(); } if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) { return android::base::ErrnoError() << "msync failed"; } return {}; } Loading @@ -87,6 +94,9 @@ android::base::Result<void> set_flag_has_local_override( if (!update_cxx.update_success) { return android::base::Error() << update_cxx.error_message.c_str(); } if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) { return android::base::ErrnoError() << "msync failed"; } return {}; } Loading tools/aconfig/aconfig_storage_write_api/src/flag_info_update.rs +4 −4 Original line number Diff line number Diff line Loading @@ -67,13 +67,13 @@ pub fn update_flag_has_server_override( flag_type: FlagValueType, flag_index: u32, value: bool, ) -> Result<(), AconfigStorageError> { ) -> Result<usize, AconfigStorageError> { let (attribute, head) = get_flag_attribute_and_offset(buf, flag_type, flag_index)?; let has_override = (attribute & (FlagInfoBit::HasServerOverride as u8)) != 0; if has_override != value { buf[head] = (attribute ^ FlagInfoBit::HasServerOverride as u8).to_le_bytes()[0]; } Ok(()) Ok(head) } /// Set if flag has local override Loading @@ -82,13 +82,13 @@ pub fn update_flag_has_local_override( flag_type: FlagValueType, flag_index: u32, value: bool, ) -> Result<(), AconfigStorageError> { ) -> Result<usize, AconfigStorageError> { let (attribute, head) = get_flag_attribute_and_offset(buf, flag_type, flag_index)?; let has_override = (attribute & (FlagInfoBit::HasLocalOverride as u8)) != 0; if has_override != value { buf[head] = (attribute ^ FlagInfoBit::HasLocalOverride as u8).to_le_bytes()[0]; } Ok(()) Ok(head) } #[cfg(test)] Loading tools/aconfig/aconfig_storage_write_api/src/flag_value_update.rs +2 −2 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ pub fn update_boolean_flag_value( buf: &mut [u8], flag_index: u32, flag_value: bool, ) -> Result<(), AconfigStorageError> { ) -> Result<usize, AconfigStorageError> { let interpreted_header = FlagValueHeader::from_bytes(buf)?; if interpreted_header.version > FILE_VERSION { return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!( Loading @@ -43,7 +43,7 @@ pub fn update_boolean_flag_value( } buf[head] = u8::from(flag_value).to_le_bytes()[0]; Ok(()) Ok(head) } #[cfg(test)] Loading tools/aconfig/aconfig_storage_write_api/src/lib.rs +17 −5 Original line number Diff line number Diff line Loading @@ -194,18 +194,21 @@ mod ffi { // Flag value update return for cc interlop pub struct BooleanFlagValueUpdateCXX { pub update_success: bool, pub offset: usize, pub error_message: String, } // Flag has server override update return for cc interlop pub struct FlagHasServerOverrideUpdateCXX { pub update_success: bool, pub offset: usize, pub error_message: String, } // Flag has local override update return for cc interlop pub struct FlagHasLocalOverrideUpdateCXX { pub update_success: bool, pub offset: usize, pub error_message: String, } Loading Loading @@ -251,11 +254,14 @@ pub(crate) fn update_boolean_flag_value_cxx( value: bool, ) -> ffi::BooleanFlagValueUpdateCXX { match crate::flag_value_update::update_boolean_flag_value(file, offset, value) { Ok(()) => { ffi::BooleanFlagValueUpdateCXX { update_success: true, error_message: String::from("") } } Ok(head) => ffi::BooleanFlagValueUpdateCXX { update_success: true, offset: head, error_message: String::from(""), }, Err(errmsg) => ffi::BooleanFlagValueUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } Loading @@ -272,18 +278,21 @@ pub(crate) fn update_flag_has_server_override_cxx( match crate::flag_info_update::update_flag_has_server_override( file, value_type, offset, value, ) { Ok(()) => ffi::FlagHasServerOverrideUpdateCXX { Ok(head) => ffi::FlagHasServerOverrideUpdateCXX { update_success: true, offset: head, error_message: String::from(""), }, Err(errmsg) => ffi::FlagHasServerOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } } Err(errmsg) => ffi::FlagHasServerOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } Loading @@ -300,18 +309,21 @@ pub(crate) fn update_flag_has_local_override_cxx( match crate::flag_info_update::update_flag_has_local_override( file, value_type, offset, value, ) { Ok(()) => ffi::FlagHasLocalOverrideUpdateCXX { Ok(head) => ffi::FlagHasLocalOverrideUpdateCXX { update_success: true, offset: head, error_message: String::from(""), }, Err(errmsg) => ffi::FlagHasLocalOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } } Err(errmsg) => ffi::FlagHasLocalOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } Loading tools/aconfig/aconfig_storage_write_api/tests/Android.bp +6 −0 Original line number Diff line number Diff line Loading @@ -39,4 +39,10 @@ cc_test { "general-tests", ], ldflags: ["-Wl,--allow-multiple-definition"], generated_headers: [ "cxx-bridge-header", "libcxx_aconfig_storage_read_api_bridge_header", ], generated_sources: ["libcxx_aconfig_storage_read_api_bridge_code"], whole_static_libs: ["libaconfig_storage_read_api_cxx_bridge"], } Loading
tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp +22 −12 Original line number Diff line number Diff line #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/unique_fd.h> #include <sys/mman.h> #include <sys/stat.h> Loading @@ -26,13 +27,13 @@ android::base::Result<MutableMappedStorageFile*> map_mutable_storage_file( size_t file_size = file_stat.st_size; const int fd = open(file.c_str(), O_RDWR | O_NOFOLLOW | O_CLOEXEC); if (fd == -1) { android::base::unique_fd ufd(open(file.c_str(), O_RDWR | O_NOFOLLOW | O_CLOEXEC)); if (ufd.get() == -1) { return android::base::ErrnoError() << "failed to open " << file; }; void *const map_result = mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, ufd.get(), 0); if (map_result == MAP_FAILED) { return android::base::ErrnoError() << "mmap failed"; } Loading @@ -55,6 +56,9 @@ android::base::Result<void> set_boolean_flag_value( if (!update_cxx.update_success) { return android::base::Error() << update_cxx.error_message.c_str(); } if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) { return android::base::ErrnoError() << "msync failed"; } return {}; } Loading @@ -71,6 +75,9 @@ android::base::Result<void> set_flag_has_server_override( if (!update_cxx.update_success) { return android::base::Error() << update_cxx.error_message.c_str(); } if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) { return android::base::ErrnoError() << "msync failed"; } return {}; } Loading @@ -87,6 +94,9 @@ android::base::Result<void> set_flag_has_local_override( if (!update_cxx.update_success) { return android::base::Error() << update_cxx.error_message.c_str(); } if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) { return android::base::ErrnoError() << "msync failed"; } return {}; } Loading
tools/aconfig/aconfig_storage_write_api/src/flag_info_update.rs +4 −4 Original line number Diff line number Diff line Loading @@ -67,13 +67,13 @@ pub fn update_flag_has_server_override( flag_type: FlagValueType, flag_index: u32, value: bool, ) -> Result<(), AconfigStorageError> { ) -> Result<usize, AconfigStorageError> { let (attribute, head) = get_flag_attribute_and_offset(buf, flag_type, flag_index)?; let has_override = (attribute & (FlagInfoBit::HasServerOverride as u8)) != 0; if has_override != value { buf[head] = (attribute ^ FlagInfoBit::HasServerOverride as u8).to_le_bytes()[0]; } Ok(()) Ok(head) } /// Set if flag has local override Loading @@ -82,13 +82,13 @@ pub fn update_flag_has_local_override( flag_type: FlagValueType, flag_index: u32, value: bool, ) -> Result<(), AconfigStorageError> { ) -> Result<usize, AconfigStorageError> { let (attribute, head) = get_flag_attribute_and_offset(buf, flag_type, flag_index)?; let has_override = (attribute & (FlagInfoBit::HasLocalOverride as u8)) != 0; if has_override != value { buf[head] = (attribute ^ FlagInfoBit::HasLocalOverride as u8).to_le_bytes()[0]; } Ok(()) Ok(head) } #[cfg(test)] Loading
tools/aconfig/aconfig_storage_write_api/src/flag_value_update.rs +2 −2 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ pub fn update_boolean_flag_value( buf: &mut [u8], flag_index: u32, flag_value: bool, ) -> Result<(), AconfigStorageError> { ) -> Result<usize, AconfigStorageError> { let interpreted_header = FlagValueHeader::from_bytes(buf)?; if interpreted_header.version > FILE_VERSION { return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!( Loading @@ -43,7 +43,7 @@ pub fn update_boolean_flag_value( } buf[head] = u8::from(flag_value).to_le_bytes()[0]; Ok(()) Ok(head) } #[cfg(test)] Loading
tools/aconfig/aconfig_storage_write_api/src/lib.rs +17 −5 Original line number Diff line number Diff line Loading @@ -194,18 +194,21 @@ mod ffi { // Flag value update return for cc interlop pub struct BooleanFlagValueUpdateCXX { pub update_success: bool, pub offset: usize, pub error_message: String, } // Flag has server override update return for cc interlop pub struct FlagHasServerOverrideUpdateCXX { pub update_success: bool, pub offset: usize, pub error_message: String, } // Flag has local override update return for cc interlop pub struct FlagHasLocalOverrideUpdateCXX { pub update_success: bool, pub offset: usize, pub error_message: String, } Loading Loading @@ -251,11 +254,14 @@ pub(crate) fn update_boolean_flag_value_cxx( value: bool, ) -> ffi::BooleanFlagValueUpdateCXX { match crate::flag_value_update::update_boolean_flag_value(file, offset, value) { Ok(()) => { ffi::BooleanFlagValueUpdateCXX { update_success: true, error_message: String::from("") } } Ok(head) => ffi::BooleanFlagValueUpdateCXX { update_success: true, offset: head, error_message: String::from(""), }, Err(errmsg) => ffi::BooleanFlagValueUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } Loading @@ -272,18 +278,21 @@ pub(crate) fn update_flag_has_server_override_cxx( match crate::flag_info_update::update_flag_has_server_override( file, value_type, offset, value, ) { Ok(()) => ffi::FlagHasServerOverrideUpdateCXX { Ok(head) => ffi::FlagHasServerOverrideUpdateCXX { update_success: true, offset: head, error_message: String::from(""), }, Err(errmsg) => ffi::FlagHasServerOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } } Err(errmsg) => ffi::FlagHasServerOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } Loading @@ -300,18 +309,21 @@ pub(crate) fn update_flag_has_local_override_cxx( match crate::flag_info_update::update_flag_has_local_override( file, value_type, offset, value, ) { Ok(()) => ffi::FlagHasLocalOverrideUpdateCXX { Ok(head) => ffi::FlagHasLocalOverrideUpdateCXX { update_success: true, offset: head, error_message: String::from(""), }, Err(errmsg) => ffi::FlagHasLocalOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } } Err(errmsg) => ffi::FlagHasLocalOverrideUpdateCXX { update_success: false, offset: usize::MAX, error_message: format!("{:?}", errmsg), }, } Loading
tools/aconfig/aconfig_storage_write_api/tests/Android.bp +6 −0 Original line number Diff line number Diff line Loading @@ -39,4 +39,10 @@ cc_test { "general-tests", ], ldflags: ["-Wl,--allow-multiple-definition"], generated_headers: [ "cxx-bridge-header", "libcxx_aconfig_storage_read_api_bridge_header", ], generated_sources: ["libcxx_aconfig_storage_read_api_bridge_code"], whole_static_libs: ["libaconfig_storage_read_api_cxx_bridge"], }