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:
parent
2eac356012
commit
674c7ef12b
@ -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'.
|
||||||
|
@ -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]
|
||||||
|
Loading…
Reference in New Issue
Block a user