Applying my updated version of Craig Barratt's buffered I/O patch.

This commit is contained in:
Wayne Davison
2004-01-02 08:29:49 +00:00
parent 968c8030cf
commit 76c2194714
5 changed files with 81 additions and 13 deletions

View File

@@ -69,6 +69,21 @@ static int write_sparse(int f,char *buf,size_t len)
return len;
}
static char *wf_writeBuf;
static size_t wf_writeBufSize;
static size_t wf_writeBufCnt;
int flush_write_file(int f)
{
int ret = write(f, wf_writeBuf, wf_writeBufCnt);
if (ret < 0)
return ret;
/* if (ret < wf_writeBufCnt) ??? */
wf_writeBufCnt = 0;
return ret;
}
/*
* write_file does not allow incomplete writes. It loops internally
* until len bytes are written or errno is set.
@@ -83,7 +98,22 @@ int write_file(int f,char *buf,size_t len)
int len1 = MIN(len, SPARSE_WRITE_SIZE);
r1 = write_sparse(f, buf, len1);
} else {
r1 = write(f, buf, len);
if (!wf_writeBuf) {
wf_writeBufSize = MAX_MAP_SIZE;
wf_writeBufCnt = 0;
wf_writeBuf = new_array(char, MAX_MAP_SIZE);
if (!wf_writeBuf) out_of_memory("write_file");
}
r1 = MIN(len, wf_writeBufSize - wf_writeBufCnt);
if (r1) {
memcpy(wf_writeBuf + wf_writeBufCnt, buf, r1);
wf_writeBufCnt += r1;
}
if (wf_writeBufCnt == wf_writeBufSize) {
if (flush_write_file(f) < 0) return -1;
if (!r1 && len)
continue;
}
}
if (r1 <= 0) {
if (ret > 0) return ret;