X-Git-Url: https://git.p6c8.net/selfforum.git/blobdiff_plain/42e7ab8a13679442f2cd7524ab7fa38bb2166951..9218fb0859abdc5a09758bed809b26902ae179d6:/selfforum-cgi/shared/Lock.pm?ds=sidebyside diff --git a/selfforum-cgi/shared/Lock.pm b/selfforum-cgi/shared/Lock.pm index 3f01861..88f9a5a 100644 --- a/selfforum-cgi/shared/Lock.pm +++ b/selfforum-cgi/shared/Lock.pm @@ -19,11 +19,18 @@ use vars qw( $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 @@ -38,6 +45,7 @@ use base qw(Exporter); violent_unlock_file set_master_lock release_file + file_removed ); %EXPORT_TAGS = ( @@ -54,7 +62,7 @@ use base qw(Exporter); ALL => \@EXPORT_OK ); -### sub ~file ($) ############################################################## +### ~file () ################################################################### # # create lock file names # @@ -76,7 +84,7 @@ sub masterlockfile ($) { # Windows section (no symlinks) # -### sub w_lock_file ($;$) ###################################################### +### w_lock_file () ############################################################# # # set read lock (shared lock) # (for no-symlink-systems) @@ -114,7 +122,7 @@ sub w_lock_file ($;$) { 0; } -### sub w_unlock_file ($;$) #################################################### +### w_unlock_file () ########################################################### # # remove read lock (shared lock) # (for no-symlink-systems) @@ -138,7 +146,7 @@ sub w_unlock_file ($;$) { # try do decrement the reference counter # - if (set_ref($filename,-1,$timeout)) { + if (set_ref($filename, -1, $timeout)) { delete $LOCKED{$filename}; return 1; } @@ -150,7 +158,7 @@ sub w_unlock_file ($;$) { return; } -### sub w_write_lock_file ($;$) ################################################ +### w_write_lock_file () ####################################################### # # set write lock (exclusive lock) # (for no-symlink-systems) @@ -213,7 +221,7 @@ sub w_write_lock_file ($;$) { 0; } -### sub w_write_unlock_file ($;$) ############################################## +### w_write_unlock_file () ##################################################### # # remove write lock (exclusive lock) # (for no-symlink-systems) @@ -243,7 +251,7 @@ sub w_write_unlock_file ($;$) { 1; } -### sub w_violent_unlock_file ($) ############################################## +### w_violent_unlock_file () ################################################### # # remove any lock violent (excl. master lock) # (for no-symlink-systems) @@ -275,7 +283,7 @@ sub w_violent_unlock_file ($) { return; } -### sub w_set_master_lock ($;$) ################################################ +### w_set_master_lock () ####################################################### # # set master lock # (for no-symlink-systems) @@ -301,7 +309,7 @@ sub w_set_master_lock ($;$) { return; } -### sub w_release_file ($) ##################################################### +### w_release_file () ########################################################## # # remove any locks (incl. master lock) # (for no-symlink-systems) @@ -325,12 +333,21 @@ sub w_release_file ($) { 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) @@ -368,7 +385,7 @@ sub x_lock_file ($;$) { 0; } -### sub x_unlock_file ($;$) #################################################### +### x_unlock_file () ########################################################### # # remove read lock (shared lock) # (symlinks possible) @@ -403,7 +420,7 @@ sub x_unlock_file ($;$) { } } -### sub x_write_lock_file ($;$) ################################################ +### x_write_lock_file () ####################################################### # # set write lock (exclusive lock) # (symlinks possible) @@ -470,7 +487,7 @@ sub x_write_lock_file ($;$) { 0; } -### sub x_write_unlock_file ($;$) ############################################## +### x_write_unlock_file () ##################################################### # # remove write lock (exclusive lock) # (symlinks possible) @@ -499,7 +516,7 @@ sub x_write_unlock_file ($;$) { 1; } -### sub x_violent_unlock_file ($) ############################################## +### x_violent_unlock_file () ################################################### # # remove any lock violent (excl. master lock) # (symlinks possible) @@ -534,7 +551,7 @@ sub x_violent_unlock_file ($) { delete $LOCKED{$filename}; } -### sub x_set_master_lock ($;$) ################################################ +### x_set_master_lock () ####################################################### # # set master lock # (symlinks possible) @@ -560,7 +577,7 @@ sub x_set_master_lock ($;$) { return; } -### sub x_release_file ($) ##################################################### +### x_release_file () ########################################################## # # remove any locks (incl. master lock) # (symlinks possible) @@ -584,8 +601,12 @@ sub x_release_file ($) { 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) @@ -600,7 +621,7 @@ sub w_simple_lock ($;$) { my $timeout = shift || $Timeout; my $lockfile = lockfile $filename; - for (1..$timeout) { + for (0..$timeout) { unlink $lockfile and return 1; sleep(1); } @@ -624,8 +645,8 @@ sub w_simple_unlock ($) { return; } -### sub x_simple_lock ($;$) #################################################### -### sub x_simple_unlock ($) #################################################### +### x_simple_lock () ########################################################### +### x_simple_unlock () ######################################################### # # simple file lock/unlock # (symlinks possible: create/unlink symlink) @@ -640,7 +661,7 @@ sub x_simple_lock ($;$) { my $timeout = shift || $Timeout; my $lockfile = lockfile $filename; - for (1..$timeout) { + for (0..$timeout) { symlink $filename,$lockfile and return 1; sleep(1); } @@ -659,7 +680,7 @@ sub x_simple_unlock ($) { return; } -### sub w_set_ref ($$$) ######################################################## +### w_set_ref () ############################################################### # # add $_[1] to reference counter # (may be negative...) @@ -702,7 +723,7 @@ sub w_set_ref ($$$) { 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; @@ -719,7 +740,7 @@ sub w_set_ref ($$$) { 1; } -### sub x_set_ref ($$$) ######################################################## +### x_set_ref () ############################################################### # # add $_[1] to reference counter # (may be negative...) @@ -761,7 +782,7 @@ sub x_set_ref ($$$) { 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; @@ -778,7 +799,7 @@ sub x_set_ref ($$$) { 1; } -### sub get_ref ($) ############################################################ +### get_ref () ################################################################# # # read out the reference counter # (system independant) @@ -793,16 +814,14 @@ sub get_ref ($) { 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 = ; + close REF; # return value - $old or 0; + $old; } ################################################################################ @@ -831,6 +850,7 @@ BEGIN { *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; @@ -845,6 +865,7 @@ BEGIN { *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; @@ -852,7 +873,7 @@ BEGIN { } } -# keeping require happy +# keep 'require' happy 1; #