(lock_file): If the lock file is older than an hour, delete it. Reset
authorColin Walters <walters@gnu.org>
Sun, 14 Apr 2002 06:40:19 +0000 (06:40 +0000)
committerColin Walters <walters@gnu.org>
Sun, 14 Apr 2002 06:40:19 +0000 (06:40 +0000)
attempts to zero if we have to break the lock.

lib-src/update-game-score.c

index 2f49197..27e0baf 100644 (file)
@@ -416,6 +416,7 @@ int
 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 @@ lock_file(const char *filename, void **state)
   *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 @@ lock_file(const char *filename, void **state)
          /* 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;
        }