--- loncom/lond 2006/05/18 02:17:27 1.327 +++ loncom/lond 2006/05/18 17:55:49 1.329 @@ -2,7 +2,7 @@ # The LearningOnline Network # lond "LON Daemon" Server (port "LOND" 5663) # -# $Id: lond,v 1.327 2006/05/18 02:17:27 www Exp $ +# $Id: lond,v 1.329 2006/05/18 17:55:49 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -60,7 +60,7 @@ my $status=''; my $lastlog=''; my $lond_max_wait_time = 13; -my $VERSION='$Revision: 1.327 $'; #' stupid emacs +my $VERSION='$Revision: 1.329 $'; #' stupid emacs my $remoteVERSION; my $currenthostid="default"; my $currentdomainid; @@ -1052,45 +1052,33 @@ sub _do_hash_untie { # Are we reading or writing? if ($how eq &GDBM_READER()) { # We are reading - unless (open($sym,"$file_prefix.db.lock")) { + if (!open($sym,"$file_prefix.db.lock")) { # We don't have a lock file. This could mean # - that there is no such db-file # - that it does not have a lock file yet - unless ((-e "$file_prefix.db") || (-e "$file_prefix.db.gz")) { + if ((! -e "$file_prefix.db") && (! -e "$file_prefix.db.gz")) { # No such file. Forget it. $! = 2; return undef; } # Apparently just no lock file yet. Make one open($sym,">>$file_prefix.db.lock"); - } + } +# Do a shared lock + if (!&flock_sym(LOCK_SH)) { return undef; } +# If this is compressed, we will actually need an exclusive lock + if (-e "$file_prefix.db.gz") { + if (!&flock_sym(LOCK_EX)) { return undef; } + } } elsif ($how eq &GDBM_WRCREAT()) { # We are writing open($sym,">>$file_prefix.db.lock"); # Writing needs exclusive lock - $lock_type=LOCK_EX; + if (!&flock_sym(LOCK_EX)) { return undef; } } else { &logthis("Unknown method $how for $file_prefix"); die(); } -# If this is compressed, we will also need an exclusive lock - if (-e "$file_prefix.db.gz") { $lock_type=LOCK_EX; } -# Okay, try to obtain the lock we want - my $failed=0; - eval { - local $SIG{__DIE__}='DEFAULT'; - local $SIG{ALRM}=sub { - $failed=1; - die("failed lock"); - }; - alarm($lond_max_wait_time); - flock($sym,$lock_type); - alarm(0); - }; - if ($failed) { - $! = 100; # throwing error # 100 - return undef; - } # The file is ours! # If it is archived, un-archive it now if (-e "$file_prefix.db.gz") { @@ -1105,6 +1093,27 @@ sub _do_hash_untie { return &_do_hash_tie($file_prefix,$namespace,$how,$loghead,$what); } + sub flock_sym { + my ($lock_type)=@_; + my $failed=0; + eval { + local $SIG{__DIE__}='DEFAULT'; + local $SIG{ALRM}=sub { + $failed=1; + die("failed lock"); + }; + alarm($lond_max_wait_time); + flock($sym,$lock_type); + alarm(0); + }; + if ($failed) { + $! = 100; # throwing error # 100 + return undef; + } else { + return 1; + } + } + sub _locking_hash_untie { my ($hashref) = @_; my $result = untie(%$hashref);