From f5c0446975d0e1109a1c15f272f35fd7e20dbf9b Mon Sep 17 00:00:00 2001 From: james <> Date: Fri, 15 Feb 2008 19:51:30 +0000 Subject: *** empty log message *** --- src/lockfile.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) (limited to 'src/lockfile.c') diff --git a/src/lockfile.c b/src/lockfile.c index 9c7acc0..451901c 100644 --- a/src/lockfile.c +++ b/src/lockfile.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.7 2008/02/15 19:51:30 james + * *** empty log message *** + * * Revision 1.6 2008/02/15 19:09:00 james * *** empty log message *** * @@ -426,6 +429,100 @@ lockfile_lock (Filelist * fl) return ret; } +void +lockfile_unlock (Filelist * fl) +{ + + while (fl->head) + { + unlink (fl->head->name); + filelist_remove (fl, fl->head); + } +} + + +/* If we have a passive lock, check noone has an */ +/* active one, returns 1 if he does, 0 if he doesnt */ +int +serial_lock_check (Serial_lock * l) +{ + Filelist_ent *fle; + int locks_found = 0; + struct stat buf; + struct timeval now, dif; + + if (l->mode == SERIAL_LOCK_ACTIVE) + return 0; + + for (fle = l->locks_to_check; fle; fle = fle->next) + { + if (!stat (fle->name, &buf)) + locks_found++; + } + + if (!locks_found) + return 0; + + getimeofday (&now, NULL); + timersub (&now, &l->last_stale_purge, &dif); + + if (dif.tv_sec > STALE_CHECK_INTERVAL) + { + lockfile_remove_stale (l->locks_to_check); + l->last_stale_purge = now; + } + + return 1; +} + +Serial_lock void +serial_lock_free (Serial_lock * l) +{ + if (!l) + return; + + if (l->locks_held) + { + lockfile_unlock (l->locks_held); + filelist_free (l->locks_held); + } + + if (l->locks_to_check) + { + filelist_free (l->locks_to_check); + } + + free (l); +} + + +Serial_lock * +serial_lock_new (char *dev, int mode) +{ + Filelist *fl = lockfile_make_list (dev); + + if (!fl) + return NULL; + + l->mode = mode; + l->locks_to_check = fl; + l->locks_held = NULL; + memset (&l->last_stale_purge, 0, sizeof (l->last_stale_purge)); + + if (mode == SERIAL_LOCK_PASSIVE) + return l; + + l->locks_held = lockfile_lock (l->locks_to_check); + if (!l->locks_held) + { + serial_lock_free (l); + return NULL; + } + + return l; +} + + #if 1 int main (int argc, char *argv[]) -- cgit v1.2.3