Skip to content

Commit

Permalink
PHYSFS_flush() shouldn't call PHYSFS_Io::flush().
Browse files Browse the repository at this point in the history
The former is meant to send PhysicsFS-buffered data to the PHYSFS_Io's
implementation, the latter is meant to tell the OS to definitely make sure the
data is safely written to disk (or at least, that's what it does in practice).

This was making PHYSFS_setBuffer()'d handles _slower_, since they would end
up blocking whenever the buffer was full until the data made the full trip to
physical media, instead of just letting the OS do its own buffering.

Now we still PHYSFS_Io::flush() on PHYSFS_close(), like this has always
worked. That might also be overkill, but that remains a historical artifact
of trying to keep the underlying file handle usable if pending writes fail
for possibly-recoverable reasons (which isn't guaranteed if you just close()
it, at least as far as I remember).
  • Loading branch information
icculus committed Nov 28, 2018
1 parent 73d6644 commit 5786a58
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions src/physfs.c
Expand Up @@ -2752,17 +2752,23 @@ static int closeHandleInOpenList(FileHandle **list, FileHandle *handle)
{
FileHandle *prev = NULL;
FileHandle *i;
int rc = 1;

for (i = *list; i != NULL; i = i->next)
{
if (i == handle) /* handle is in this list? */
{
PHYSFS_Io *io = handle->io;
PHYSFS_uint8 *tmp = handle->buffer;
rc = PHYSFS_flush((PHYSFS_File *) handle);
if (!rc)

/* send our buffer to io... */
if (!PHYSFS_flush((PHYSFS_File *) handle))
return -1;

/* ...then have io send it to the disk... */
else if (io->flush && !io->flush(io))
return -1;

/* ...then close the underlying file. */
io->destroy(io);

if (tmp != NULL) /* free any associated buffer. */
Expand Down Expand Up @@ -3060,7 +3066,7 @@ int PHYSFS_flush(PHYSFS_File *handle)
rc = io->write(io, fh->buffer + fh->bufpos, fh->buffill - fh->bufpos);
BAIL_IF_ERRPASS(rc <= 0, 0);
fh->bufpos = fh->buffill = 0;
return io->flush ? io->flush(io) : 1;
return 1;
} /* PHYSFS_flush */


Expand Down

0 comments on commit 5786a58

Please sign in to comment.