changeset 44576:90866353c7bd

(lock_file): If the lock file is older than an hour, delete it. Reset attempts to zero if we have to break the lock.
author Colin Walters <walters@gnu.org>
date Sun, 14 Apr 2002 06:40:19 +0000
parents 52bd3d1b9cb9
children ffb634bccc64
files lib-src/update-game-score.c
diffstat 1 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/update-game-score.c	Sun Apr 14 05:51:31 2002 +0000
+++ b/lib-src/update-game-score.c	Sun Apr 14 06:40:19 2002 +0000
@@ -416,6 +416,7 @@
 lock_file(const char *filename, void **state)
 {
   int fd;
+  struct stat buf;
   int attempts = 0;
   char *lockext = ".lockfile";
   char *lockpath = malloc(strlen(filename) + strlen(lockext) + 60);
@@ -426,6 +427,10 @@
   *state = lockpath;
  trylock:
   attempts++;
+  /* If the lock is over an hour old, delete it. */
+  if (stat(lockpath, &buf) == 0
+      && (difftime(buf.st_ctime, time(NULL) > 60*60)))
+    unlink(lockpath);
   if ((fd = open(lockpath, O_CREAT | O_EXCL, 0600)) < 0)
     {
       if (errno == EEXIST)
@@ -433,7 +438,10 @@
 	  /* Break the lock; we won't corrupt the file, but we might
 	     lose some scores. */
 	  if (attempts > MAX_ATTEMPTS)
-	    unlink(lockpath);
+	    {
+	      unlink(lockpath);
+	      attempts = 0;
+	    }
 	  sleep((rand() % 2)+1);
 	  goto trylock;
 	}