#---------- utility functions ----------
-sub lockfile ($$$) {
- my ($fh, $fn, $flockmode) = @_;
+sub lockfile ($$$$) {
+ my ($fh, $fn, $flockmode, $update_ts) = @_;
my $what = $fn.(($flockmode & ~LOCK_NB) == LOCK_SH ? " (shared)" : "");
for (;;) {
close $fh;
- open $fh, '+>', $fn or fail "open/create $fn for lock: $!";
+ open $fh, ($update_ts ? '+>' : '+>>'), $fn
+ or fail "open/create $fn for lock: $!";
logm 'debug', "lock $what: acquiring";
if (!flock $fh, $flockmode) {
if ($flockmode & LOCK_NB && $! == EWOULDBLOCK) {
}
sub clonefetch () {
- lockfile \*LOCK, $lock, LOCK_EX;
+ lockfile \*LOCK, $lock, LOCK_EX, 1;
my $exists = lstat $gitd;
$exists or $!==ENOENT or fail "lstat $gitd: $!";
}
servinfo "sharing";
- lockfile \*LOCK, $lock, LOCK_SH; # NB releases and relocks
+ lockfile \*LOCK, $lock, LOCK_SH, 1; # NB releases and relocks
if (stat $gitd) {
return 1;
}
};
}
- if (!lockfile \*LOCK, $lock, LOCK_EX|$mode_locknb) {
+ if (!lockfile \*LOCK, $lock, LOCK_EX|$mode_locknb, 0) {
die $! unless $mode_locknb;
logm 'info', "housekeeping: subdirs $subdir: lock busy, skipping";
next;
sub housekeepingcheck ($$) {
my ($dofork, $force) = @_;
if (!$force) {
- if (!lockfile \*HLOCK, "Housekeeping.lock", LOCK_EX|LOCK_NB) {
+ if (!lockfile \*HLOCK, "Housekeeping.lock", LOCK_EX|LOCK_NB, 1) {
logm 'debug', "housekeeping lock taken, not running";
close HLOCK;
return 0;