File: 02-fsync.diff

package info (click to toggle)
libphysfs 3.0.1-3.1
  • links: PTS
  • area: main
  • in suites: buster
  • size: 1,452 kB
  • sloc: ansic: 18,160; sh: 232; perl: 210; cpp: 152; makefile: 11
file content (63 lines) | stat: -rw-r--r-- 2,267 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

# HG changeset patch
# User Ryan C. Gordon <icculus@icculus.org>
# Date 1543380813 18000
# Node ID c17f025e7a923a487c9fea87bb9c754b147d45de
# Parent  ece6769c0676c2d4e8a5893a1acebd0f65456817
PHYSFS_flush() shouldn't call PHYSFS_Io::flush().

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).
(transplanted from 8b3cc36531c6ac09dbac98d3774921bdf14b240d)

diff -r ece6769c0676 -r c17f025e7a92 src/physfs.c
--- a/src/physfs.c	Wed Oct 03 22:40:57 2018 -0400
+++ b/src/physfs.c	Tue Nov 27 23:53:33 2018 -0500
@@ -2669,7 +2669,6 @@
 {
     FileHandle *prev = NULL;
     FileHandle *i;
-    int rc = 1;
 
     for (i = *list; i != NULL; i = i->next)
     {
@@ -2677,9 +2676,16 @@
         {
             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. */
@@ -2977,7 +2983,7 @@
     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 */