/* * BufFileFlush * * Like fflush() */ static int BufFileFlush(BufFile *file) { if (file->dirty) { BufFileDumpBuffer(file); if (file->dirty) return EOF; } return 0; }
/* * BufFileWrite * * Like fwrite() except we assume 1-byte element size. */ size_t BufFileWrite(BufFile *file, void *ptr, size_t size) { size_t nwritten = 0; size_t nthistime; while (size > 0) { if (file->pos >= BLCKSZ) { /* Buffer full, dump it out */ if (file->dirty) { /* by cywang */ InstrStartNode(file->instr_filedump); BufFileDumpBuffer(file); InstrStopNode(file->instr_filedump, 0); file->fileDumpNum++; if (file->dirty) break; /* I/O error */ } else { /* Hmm, went directly from reading to writing? */ file->curOffset += file->pos; file->pos = 0; file->nbytes = 0; } } nthistime = BLCKSZ - file->pos; if (nthistime > size) nthistime = size; Assert(nthistime > 0); memcpy(file->buffer + file->pos, ptr, nthistime); file->dirty = true; file->pos += nthistime; if (file->nbytes < file->pos) file->nbytes = file->pos; ptr = (void *) ((char *) ptr + nthistime); size -= nthistime; nwritten += nthistime; } return nwritten; }
/* * BufFileFlush * * Like fflush() */ static int BufFileFlush(BufFile *file) { if (file->dirty) { /* by cywang */ InstrStartNode(file->instr_filedump); BufFileDumpBuffer(file); InstrStopNode(file->instr_filedump, 0); file->fileDumpNum++; if (file->dirty) return EOF; } return 0; }
/* * BufFileFlush * * Like fflush() */ void BufFileFlush(BufFile *file) { if (file->dirty) { int nbytes = file->nbytes; int pos = file->pos; BufFileDumpBuffer(file, file->buffer, nbytes); /* * At this point, curOffset has been advanced to the end of the buffer, * ie, its original value + nbytes. We need to make it point to the * logical file position, ie, original value + pos, in case that is less * (as could happen due to a small backwards seek in a dirty buffer!) */ file->offset -= (nbytes - pos); BufFileUpdateSize(file); } }
/* * BufFileWrite * * Like fwrite() except we assume 1-byte element size. */ Size BufFileWrite(BufFile *file, const void *ptr, Size size) { size_t nwritten = 0; size_t nthistime; while (size > 0) { if ((size_t) file->pos >= BLCKSZ) { Assert((size_t)file->pos == BLCKSZ); /* Buffer full, dump it out */ if (file->dirty) { /* This can throw an exception, but it correctly updates the size when that happens */ BufFileDumpBuffer(file, file->buffer, file->nbytes); } else { /* Hmm, went directly from reading to writing? */ file->offset += file->pos; file->pos = 0; file->nbytes = 0; } } /* * Write full blocks directly from caller's buffer. */ if (size >= BLCKSZ && file->pos == 0) { nthistime = size - size % BLCKSZ; /* This can throw an exception, but it correctly updates the size when that happens */ BufFileDumpBuffer(file, ptr, nthistime); ptr = (void *) ((char *) ptr + nthistime); size -= nthistime; nwritten += nthistime; BufFileUpdateSize(file); if (size == 0) { return nwritten; } } nthistime = BLCKSZ - file->pos; if (nthistime > size) nthistime = size; Assert(nthistime > 0); memcpy(file->buffer + file->pos, ptr, nthistime); file->dirty = true; file->pos += (int) nthistime; if (file->nbytes < file->pos) file->nbytes = file->pos; ptr = (void *) ((char *) ptr + nthistime); size -= nthistime; nwritten += nthistime; } BufFileUpdateSize(file); return nwritten; }