Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4dfe15c2 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "flush mmap file to disk after updating" into main am: 78d6964f

parents e507bfb4 78d6964f
Loading
Loading
Loading
Loading
+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>
@@ -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";
  }
@@ -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 {};
}

@@ -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 {};
}

@@ -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 {};
}

+4 −4
Original line number Diff line number Diff line
@@ -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
@@ -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)]
+2 −2
Original line number Diff line number Diff line
@@ -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!(
@@ -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)]
+17 −5
Original line number Diff line number Diff line
@@ -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,
    }

@@ -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),
        },
    }
@@ -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),
        },
    }
@@ -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),
        },
    }
+6 −0
Original line number Diff line number Diff line
@@ -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