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;