add fsync to try to get complete skps from webpage picture capture
R=reed@google.com,mtklein@google.com
BUG=skia:4691
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1530783003
Review URL: https://codereview.chromium.org/1530783003
diff --git a/include/core/SkOSFile.h b/include/core/SkOSFile.h
index 39a1646..f977327 100644
--- a/include/core/SkOSFile.h
+++ b/include/core/SkOSFile.h
@@ -41,6 +41,7 @@
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 44de6e8..4502416 100644
--- a/include/core/SkStream.h
+++ b/include/core/SkStream.h
@@ -360,6 +360,7 @@
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 fff8f33..ef4c6ba 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -463,6 +463,14 @@
}
}
+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 3371bb7..ecd5a02 100644
--- a/src/ports/SkOSFile_stdio.cpp
+++ b/src/ports/SkOSFile_stdio.cpp
@@ -143,6 +143,14 @@
::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;