ggc-page.c: (ggc_pch_write_object) replace fseek() with fwrite() in PCH generation...
authorRobert Bowdidge <bowdidge@apple.com>
Sat, 4 Oct 2003 01:45:51 +0000 (18:45 -0700)
committerRobert Bowdidge <bowdidge@gcc.gnu.org>
Sat, 4 Oct 2003 01:45:51 +0000 (18:45 -0700)
* ggc-page.c: (ggc_pch_write_object) replace fseek() with fwrite()
  in PCH generation, avoiding
  too-frequent flushes when writing to NFS file system

From-SVN: r72085

gcc/ChangeLog
gcc/ggc-page.c

index 4cb41d4ae196dc08840c1eb9ac10478fa1d57745..e08571e794184b63403e0fa119db1de60a068892 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-03  Robert Bowdidge <bowdidge@apple.com>
+        * ggc-page.c: (ggc_pch_write_object) replace fseek() with fwrite() in 
+        PCH generation, avoiding too-frequent flushes when writing to NFS 
+        file system.
+
 2003-10-03  Ziemowit Laski  <zlaski@apple.com>
 
        * objc/objc-act.c (lookup_category): Mark as 'inline'.
index e8b3ddb85585b554f279420c352ceecb696e4ed1..e507de6929c6254e8461b39a05a61ae30936e725 100644 (file)
@@ -1969,6 +1969,7 @@ ggc_pch_write_object (struct ggc_pch_data *d ATTRIBUTE_UNUSED,
                      size_t size)
 {
   unsigned order;
+  static const char emptyBytes[256];
 
   if (size <= 256)
     order = size_lookup[size];
@@ -1982,11 +1983,30 @@ ggc_pch_write_object (struct ggc_pch_data *d ATTRIBUTE_UNUSED,
   if (fwrite (x, size, 1, f) != 1)
     fatal_error ("can't write PCH file: %m");
 
-  /* In the current implementation, SIZE is always equal to
-     OBJECT_SIZE (order) and so the fseek is never executed.  */
-  if (size != OBJECT_SIZE (order)
-      && fseek (f, OBJECT_SIZE (order) - size, SEEK_CUR) != 0)
-    fatal_error ("can't write PCH file: %m");
+  /* If SIZE is not the same as OBJECT_SIZE(order), then we need to pad the
+     object out to OBJECT_SIZE(order).  This happens for strings. */
+
+  if (size != OBJECT_SIZE (order))
+    {
+      unsigned padding = OBJECT_SIZE(order) - size;
+
+      /* To speed small writes, we use a nulled-out array that's larger
+         than most padding requests as the source for our null bytes.  This
+         permits us to do the padding with fwrite() rather than fseek(), and
+         limits the chance the the OS may try to flush any outstanding
+         writes. */
+      if (padding <= sizeof(emptyBytes))
+        {
+          if (fwrite (emptyBytes, 1, padding, f) != padding)
+            fatal_error ("can't write PCH file");
+        }
+      else
+        {
+          /* Larger than our buffer?  Just default to fseek. */
+          if (fseek (f, padding, SEEK_CUR) != 0)
+            fatal_error ("can't write PCH file");
+        }
+    }
 
   d->written[order]++;
   if (d->written[order] == d->d.totals[order]