Fix write failures in concurrency
authorH.G. Muller <h.g.muller@hccnet.nl>
Tue, 13 Sep 2011 17:55:44 +0000 (19:55 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 13 Sep 2011 21:05:34 +0000 (23:05 +0200)
In WinBoard a flood of writes by differentprocesses to the same PGN can
cause a "permission denied" error in fopen. This patch causes retries after
a random (5-15 msec) wait, in such cases.

backend.c

index 64b5f3d..c259cc5 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -11955,12 +11955,18 @@ SaveGameToFile(filename, append)
 {
     FILE *f;
     char buf[MSG_SIZ];
-    int result;
+    int result, i, t,tot=0;
 
     if (strcmp(filename, "-") == 0) {
        return SaveGame(stdout, 0, NULL);
     } else {
-       f = fopen(filename, append ? "a" : "w");
+       for(i=0; i<10; i++) { // upto 10 tries
+            f = fopen(filename, append ? "a" : "w");
+            if(f && i) fprintf(f, "[Delay \"%d retries, %d msec\"]\n",i,tot);
+            if(f || errno != 13) break;
+            DoSleep(t = 5 + random()%11); // wait 5-15 msec
+            tot += t;
+       }
        if (f == NULL) {
            snprintf(buf, sizeof(buf), _("Can't open \"%s\""), filename);
            DisplayError(buf, errno);