version 1.327, 2006/05/18 02:17:27
|
version 1.329, 2006/05/18 17:55:49
|
Line 1052 sub _do_hash_untie {
|
Line 1052 sub _do_hash_untie {
|
# Are we reading or writing? |
# Are we reading or writing? |
if ($how eq &GDBM_READER()) { |
if ($how eq &GDBM_READER()) { |
# We are reading |
# 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 |
# We don't have a lock file. This could mean |
# - that there is no such db-file |
# - that there is no such db-file |
# - that it does not have a lock file yet |
# - 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. |
# No such file. Forget it. |
$! = 2; |
$! = 2; |
return undef; |
return undef; |
} |
} |
# Apparently just no lock file yet. Make one |
# Apparently just no lock file yet. Make one |
open($sym,">>$file_prefix.db.lock"); |
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()) { |
} elsif ($how eq &GDBM_WRCREAT()) { |
# We are writing |
# We are writing |
open($sym,">>$file_prefix.db.lock"); |
open($sym,">>$file_prefix.db.lock"); |
# Writing needs exclusive lock |
# Writing needs exclusive lock |
$lock_type=LOCK_EX; |
if (!&flock_sym(LOCK_EX)) { return undef; } |
} else { |
} else { |
&logthis("Unknown method $how for $file_prefix"); |
&logthis("Unknown method $how for $file_prefix"); |
die(); |
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! |
# The file is ours! |
# If it is archived, un-archive it now |
# If it is archived, un-archive it now |
if (-e "$file_prefix.db.gz") { |
if (-e "$file_prefix.db.gz") { |
Line 1105 sub _do_hash_untie {
|
Line 1093 sub _do_hash_untie {
|
return &_do_hash_tie($file_prefix,$namespace,$how,$loghead,$what); |
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 { |
sub _locking_hash_untie { |
my ($hashref) = @_; |
my ($hashref) = @_; |
my $result = untie(%$hashref); |
my $result = untie(%$hashref); |