$violentTimeout
$masterTimeout
$iAmMaster
+ $VERSION
);
use Carp;
use Fcntl;
+################################################################################
+#
+# Version check
+#
+$VERSION = do { my @r =(q$Revision$ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
################################################################################
#
# Export
violent_unlock_file
set_master_lock
release_file
+ file_removed
);
%EXPORT_TAGS = (
ALL => \@EXPORT_OK
);
-### sub ~file ($) ##############################################################
+### ~file () ###################################################################
#
# create lock file names
#
# Windows section (no symlinks)
#
-### sub w_lock_file ($;$) ######################################################
+### w_lock_file () #############################################################
#
# set read lock (shared lock)
# (for no-symlink-systems)
0;
}
-### sub w_unlock_file ($;$) ####################################################
+### w_unlock_file () ###########################################################
#
# remove read lock (shared lock)
# (for no-symlink-systems)
# try do decrement the reference counter
#
- if (set_ref($filename,-1,$timeout)) {
+ if (set_ref($filename, -1, $timeout)) {
delete $LOCKED{$filename};
return 1;
}
return;
}
-### sub w_write_lock_file ($;$) ################################################
+### w_write_lock_file () #######################################################
#
# set write lock (exclusive lock)
# (for no-symlink-systems)
0;
}
-### sub w_write_unlock_file ($;$) ##############################################
+### w_write_unlock_file () #####################################################
#
# remove write lock (exclusive lock)
# (for no-symlink-systems)
1;
}
-### sub w_violent_unlock_file ($) ##############################################
+### w_violent_unlock_file () ###################################################
#
# remove any lock violent (excl. master lock)
# (for no-symlink-systems)
return;
}
-### sub w_set_master_lock ($;$) ################################################
+### w_set_master_lock () #######################################################
#
# set master lock
# (for no-symlink-systems)
return;
}
-### sub w_release_file ($) #####################################################
+### w_release_file () ##########################################################
#
# remove any locks (incl. master lock)
# (for no-symlink-systems)
1;
}
+sub w_file_removed ($) {
+ my $filename = shift;
+
+ unlink reffile($filename);
+ unlink lockfile($filename);
+ unlink lockfile(reffile($filename));
+ unlink masterlockfile($filename);
+}
+
################################################################################
#
# *n*x section (symlinks possible)
#
-### sub x_lock_file ($;$) ######################################################
+### x_lock_file () #############################################################
#
# set read lock (shared lock)
# (symlinks possible)
0;
}
-### sub x_unlock_file ($;$) ####################################################
+### x_unlock_file () ###########################################################
#
# remove read lock (shared lock)
# (symlinks possible)
}
}
-### sub x_write_lock_file ($;$) ################################################
+### x_write_lock_file () #######################################################
#
# set write lock (exclusive lock)
# (symlinks possible)
0;
}
-### sub x_write_unlock_file ($;$) ##############################################
+### x_write_unlock_file () #####################################################
#
# remove write lock (exclusive lock)
# (symlinks possible)
1;
}
-### sub x_violent_unlock_file ($) ##############################################
+### x_violent_unlock_file () ###################################################
#
# remove any lock violent (excl. master lock)
# (symlinks possible)
delete $LOCKED{$filename};
}
-### sub x_set_master_lock ($;$) ################################################
+### x_set_master_lock () #######################################################
#
# set master lock
# (symlinks possible)
return;
}
-### sub x_release_file ($) #####################################################
+### x_release_file () ##########################################################
#
# remove any locks (incl. master lock)
# (symlinks possible)
1;
}
-### sub w_simple_lock ($;$) ####################################################
-### sub w_simple_unlock ($) ####################################################
+sub x_file_removed ($) {
+ release_file (shift);
+}
+
+### w_simple_lock () ###########################################################
+### w_simple_unlock () #########################################################
#
# simple file lock/unlock
# (for no-symlink-systems: kill/create lockfile)
my $timeout = shift || $Timeout;
my $lockfile = lockfile $filename;
- for (1..$timeout) {
+ for (0..$timeout) {
unlink $lockfile and return 1;
sleep(1);
}
return;
}
-### sub x_simple_lock ($;$) ####################################################
-### sub x_simple_unlock ($) ####################################################
+### x_simple_lock () ###########################################################
+### x_simple_unlock () #########################################################
#
# simple file lock/unlock
# (symlinks possible: create/unlink symlink)
my $timeout = shift || $Timeout;
my $lockfile = lockfile $filename;
- for (1..$timeout) {
+ for (0..$timeout) {
symlink $filename,$lockfile and return 1;
sleep(1);
}
return;
}
-### sub w_set_ref ($$$) ########################################################
+### w_set_ref () ###############################################################
#
# add $_[1] to reference counter
# (may be negative...)
unlink $reffile or return;
}
else {
- local $\="\n";
+ local $\;
sysopen (REF, $reffile, O_WRONLY | O_TRUNC | O_CREAT) or return;
print REF $old or do {
close REF;
1;
}
-### sub x_set_ref ($$$) ########################################################
+### x_set_ref () ###############################################################
#
# add $_[1] to reference counter
# (may be negative...)
unlink $reffile or return;
}
else {
- local $\="\n";
+ local $\;
sysopen (REF, $reffile, O_WRONLY | O_TRUNC | O_CREAT) or return;
print REF $old or do {
close REF;
1;
}
-### sub get_ref ($) ############################################################
+### get_ref () #################################################################
#
# read out the reference counter
# (system independant)
my $reffile = reffile $filename;
my $old;
local *REF;
+ local $/;
- if (sysopen (REF, $reffile, O_RDONLY)) {
- local $/="\n";
- read REF, $old, -s $reffile;
- close REF;
- chomp $old;
- }
+ sysopen (REF, $reffile, O_RDONLY) or return 0;
+ $old = <REF>;
+ close REF;
# return value
- $old or 0;
+ $old;
}
################################################################################
*violent_unlock_file = \&x_violent_unlock_file;
*set_master_lock = \&x_set_master_lock;
*release_file = \&x_release_file;
+ *file_removed = \&x_file_removed;
*simple_lock = \&x_simple_lock;
*simple_unlock = \&x_simple_unlock;
*violent_unlock_file = \&w_violent_unlock_file;
*set_master_lock = \&w_set_master_lock;
*release_file = \&w_release_file;
+ *file_removed = \&w_file_removed;
*simple_lock = \&w_simple_lock;
*simple_unlock = \&w_simple_unlock;
}
}
-# keeping require happy
+# keep 'require' happy
1;
#