aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkOSFile.h1
-rw-r--r--include/core/SkStream.h1
-rw-r--r--src/core/SkStream.cpp8
-rw-r--r--src/ports/SkOSFile_stdio.cpp8
4 files changed, 18 insertions, 0 deletions
diff --git a/include/core/SkOSFile.h b/include/core/SkOSFile.h
index 39a1646458..f977327e25 100644
--- a/include/core/SkOSFile.h
+++ b/include/core/SkOSFile.h
@@ -41,6 +41,7 @@ size_t sk_fwrite(const void* buffer, size_t byteCount, FILE*);
char* sk_fgets(char* str, int size, FILE* f);
void sk_fflush(FILE*);
+void sk_fsync(FILE*);
bool sk_fseek(FILE*, size_t);
bool sk_fmove(FILE*, long);
diff --git a/include/core/SkStream.h b/include/core/SkStream.h
index 44de6e87e1..4502416fd9 100644
--- a/include/core/SkStream.h
+++ b/include/core/SkStream.h
@@ -360,6 +360,7 @@ public:
bool write(const void* buffer, size_t size) override;
void flush() override;
+ void fsync();
size_t bytesWritten() const override;
private:
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index fff8f33822..ef4c6baae4 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -463,6 +463,14 @@ void SkFILEWStream::flush()
}
}
+void SkFILEWStream::fsync()
+{
+ flush();
+ if (fFILE) {
+ sk_fsync(fFILE);
+ }
+}
+
////////////////////////////////////////////////////////////////////////
SkMemoryWStream::SkMemoryWStream(void* buffer, size_t size)
diff --git a/src/ports/SkOSFile_stdio.cpp b/src/ports/SkOSFile_stdio.cpp
index 3371bb7031..ecd5a027fc 100644
--- a/src/ports/SkOSFile_stdio.cpp
+++ b/src/ports/SkOSFile_stdio.cpp
@@ -143,6 +143,14 @@ void sk_fflush(FILE* f) {
::fflush(f);
}
+void sk_fsync(FILE* f) {
+#if !defined(_WIN32) && !defined(SK_BUILD_FOR_ANDROID) && !defined(__UCLIBC__) \
+ && !defined(_NEWLIB_VERSION)
+ int fd = ::fileno(f);
+ ::fsync(fd);
+#endif
+}
+
bool sk_fseek(FILE* f, size_t byteCount) {
int err = ::fseek(f, (long)byteCount, SEEK_SET);
return err == 0;