--- loncom/lond 2006/05/18 02:32:06 1.328 +++ 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.328 2006/05/18 02:32:06 albertel 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.328 $'; #' stupid emacs +my $VERSION='$Revision: 1.329 $'; #' stupid emacs my $remoteVERSION; my $currenthostid="default"; my $currentdomainid; @@ -1063,34 +1063,22 @@ sub _do_hash_untie { } # 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);