Commit 674c7ef1 by Robert Bowdidge Committed by Robert Bowdidge

ggc-page.c: (ggc_pch_write_object) replace fseek() with fwrite() in PCH generation...

* 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
parent 2eac3560
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> 2003-10-03 Ziemowit Laski <zlaski@apple.com>
* objc/objc-act.c (lookup_category): Mark as 'inline'. * objc/objc-act.c (lookup_category): Mark as 'inline'.
......
...@@ -1969,6 +1969,7 @@ ggc_pch_write_object (struct ggc_pch_data *d ATTRIBUTE_UNUSED, ...@@ -1969,6 +1969,7 @@ ggc_pch_write_object (struct ggc_pch_data *d ATTRIBUTE_UNUSED,
size_t size) size_t size)
{ {
unsigned order; unsigned order;
static const char emptyBytes[256];
if (size <= 256) if (size <= 256)
order = size_lookup[size]; order = size_lookup[size];
...@@ -1982,11 +1983,30 @@ ggc_pch_write_object (struct ggc_pch_data *d ATTRIBUTE_UNUSED, ...@@ -1982,11 +1983,30 @@ ggc_pch_write_object (struct ggc_pch_data *d ATTRIBUTE_UNUSED,
if (fwrite (x, size, 1, f) != 1) if (fwrite (x, size, 1, f) != 1)
fatal_error ("can't write PCH file: %m"); fatal_error ("can't write PCH file: %m");
/* In the current implementation, SIZE is always equal to /* If SIZE is not the same as OBJECT_SIZE(order), then we need to pad the
OBJECT_SIZE (order) and so the fseek is never executed. */ object out to OBJECT_SIZE(order). This happens for strings. */
if (size != OBJECT_SIZE (order)
&& fseek (f, OBJECT_SIZE (order) - size, SEEK_CUR) != 0) if (size != OBJECT_SIZE (order))
fatal_error ("can't write PCH file: %m"); {
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]++; d->written[order]++;
if (d->written[order] == d->d.totals[order] if (d->written[order] == d->d.totals[order]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment