Implement WriteAtomically using write/fsync on all platforms, and enable (#18320)
diff --git a/fml/platform/posix/file_posix.cc b/fml/platform/posix/file_posix.cc
index ab64b5c..f6a9094 100644
--- a/fml/platform/posix/file_posix.cc
+++ b/fml/platform/posix/file_posix.cc
@@ -206,15 +206,23 @@
return false;
}
- FileMapping mapping(temp_file, {FileMapping::Protection::kWrite});
- if (mapping.GetMutableMapping() == nullptr ||
- data.GetSize() != mapping.GetSize()) {
- return false;
+ ssize_t remaining = data.GetSize();
+ ssize_t written = 0;
+ ssize_t offset = 0;
+
+ while (remaining > 0) {
+ written = FML_HANDLE_EINTR(
+ ::write(temp_file.get(), data.GetMapping() + offset, remaining));
+
+ if (written == -1) {
+ return false;
+ }
+
+ remaining -= written;
+ offset += written;
}
- ::memcpy(mapping.GetMutableMapping(), data.GetMapping(), data.GetSize());
-
- if (::msync(mapping.GetMutableMapping(), data.GetSize(), MS_SYNC) != 0) {
+ if (::fsync(temp_file.get()) != 0) {
return false;
}
diff --git a/testing/fuchsia/meta/fuchsia_test.cmx b/testing/fuchsia/meta/fuchsia_test.cmx
index 02ac947..9a01e29 100644
--- a/testing/fuchsia/meta/fuchsia_test.cmx
+++ b/testing/fuchsia/meta/fuchsia_test.cmx
@@ -6,7 +6,8 @@
"features": [
"vulkan",
"deprecated-ambient-replace-as-executable",
- "isolated-cache-storage"
+ "isolated-cache-storage",
+ "isolated-temp"
],
"services": [
"fuchsia.accessibility.semantics.SemanticsManager",
diff --git a/testing/fuchsia/run_tests.sh b/testing/fuchsia/run_tests.sh
index 2c39beb..44c6057 100755
--- a/testing/fuchsia/run_tests.sh
+++ b/testing/fuchsia/run_tests.sh
@@ -100,7 +100,7 @@
./fuchsia_ctl -d $device_name test \
-f fml_tests-0.far \
-t fml_tests \
- -a "--gtest_filter=-FileTest*" \
+ -a "--gtest_filter=-FileTest.CanTruncateAndWrite:FileTest.CreateDirectoryStructure" \
--identity-file $pkey \
--timeout-seconds $test_timeout_seconds \
--packages-directory packages