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
This commit is contained in:
Robert Bowdidge 2003-10-03 18:45:51 -07:00 committed by Robert Bowdidge
parent 2eac356012
commit 674c7ef12b
2 changed files with 30 additions and 5 deletions

View 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> 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'.

View File

@ -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,
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]