--- loncom/LONCAPA.pm 2006/06/27 15:21:28 1.10 +++ loncom/LONCAPA.pm 2006/06/27 21:47:15 1.11 @@ -1,7 +1,7 @@ # The LearningOnline Network # Base routines # -# $Id: LONCAPA.pm,v 1.10 2006/06/27 15:21:28 albertel Exp $ +# $Id: LONCAPA.pm,v 1.11 2006/06/27 21:47:15 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -229,6 +229,10 @@ sub _do_hash_untie { { my $sym; my @pushed_syms; + + sub clean_sym { + undef($sym); + } sub push_locking_hash_tie { if (!defined($sym)) { die("Invalid used of push_locking_hash_tie, should only be called after a lock has occurred and before and unlock."); @@ -247,7 +251,7 @@ sub _do_hash_untie { sub _locking_hash_tie { my ($file_prefix,$namespace,$how,$loghead,$what) = @_; if (defined($sym)) { - die('Nested locking attempted withut proper use of push_locking_hahs_tie, this is unsupportted'); + die('Nested locking attempted without proper use of push_locking_hash_tie, this is unsupported'); } my $lock_type=LOCK_SH; @@ -261,6 +265,7 @@ sub _do_hash_untie { if ((! -e "$file_prefix.db") && (! -e "$file_prefix.db.gz")) { # No such file. Forget it. $! = 2; + &clean_sym(); return undef; } # Apparently just no lock file yet. Make one @@ -268,11 +273,13 @@ sub _do_hash_untie { } # Do a shared lock if (!&flock_sym(LOCK_SH)) { + &clean_sym(); return undef; } # If this is compressed, we will actually need an exclusive lock if (-e "$file_prefix.db.gz") { if (!&flock_sym(LOCK_EX)) { + &clean_sym(); return undef; } } @@ -281,6 +288,7 @@ sub _do_hash_untie { open($sym,">>$file_prefix.db.lock"); # Writing needs exclusive lock if (!&flock_sym(LOCK_EX)) { + &clean_sym(); return undef; } } else { @@ -326,7 +334,7 @@ sub _do_hash_untie { my $result = untie(%$hashref); flock($sym,LOCK_UN); close($sym); - undef($sym); + &clean_sym(); return $result; } }