summaryrefslogtreecommitdiffstats
path: root/urpm
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2006-11-23 08:33:45 +0000
committerPascal Rigaux <pixel@mandriva.com>2006-11-23 08:33:45 +0000
commit60d85b7e9fe14eeff84053cc1585ca45eaa3f1ab (patch)
treed20074bef1523c17e8b69e39099ad7c9e5f7e4ec /urpm
parenta331f6da8a7d9384093c1b3a95a682fd9a2e98be (diff)
downloadurpmi-60d85b7e9fe14eeff84053cc1585ca45eaa3f1ab.tar
urpmi-60d85b7e9fe14eeff84053cc1585ca45eaa3f1ab.tar.gz
urpmi-60d85b7e9fe14eeff84053cc1585ca45eaa3f1ab.tar.bz2
urpmi-60d85b7e9fe14eeff84053cc1585ca45eaa3f1ab.tar.xz
urpmi-60d85b7e9fe14eeff84053cc1585ca45eaa3f1ab.zip
don't have a global variable to hold locks, otherwise code can't lock twice
non-exclusive
Diffstat (limited to 'urpm')
-rw-r--r--urpm/media.pm13
-rw-r--r--urpm/sys.pm32
2 files changed, 19 insertions, 26 deletions
diff --git a/urpm/media.pm b/urpm/media.pm
index 68665f1a..c55fb786 100644
--- a/urpm/media.pm
+++ b/urpm/media.pm
@@ -600,7 +600,7 @@ sub add_medium {
#- make sure configuration has been read.
$urpm->{media} or die "caller should have used ->read_config or ->configure first";
- urpm::sys::lock_urpmi_db($urpm, 'exclusive') if !$options{nolock};
+ my $lock = urpm::sys::lock_urpmi_db($urpm, 'exclusive');
#- if a medium with that name has already been found, we have to exit now
my $medium;
@@ -643,7 +643,7 @@ sub add_medium {
$urpm->{log}(N("added medium %s", $name));
$urpm->{modified} = 1;
- $options{nolock} or urpm::sys::unlock_urpmi_db($urpm);
+ $lock and urpm::sys::unlock($lock);
$name;
}
@@ -1710,12 +1710,13 @@ sub update_media {
$options{nopubkey} ||= $urpm->{options}{nopubkey};
#- get gpg-pubkey signature.
+ my $rpm_lock;
if (!$options{nopubkey}) {
- urpm::sys::lock_rpm_db($urpm, 'exclusive');
+ $rpm_lock = urpm::sys::lock_rpm_db($urpm, 'exclusive');
$urpm->{keys} or $urpm->parse_pubkeys(root => $urpm->{root});
}
#- lock database if allowed.
- urpm::sys::lock_urpmi_db($urpm, 'exclusive') if !$options{nolock};
+ my $urpmi_lock = urpm::sys::lock_urpmi_db($urpm, 'exclusive') if !$options{nolock};
#- examine each medium to see if one of them needs to be updated.
#- if this is the case and if not forced, try to use a pre-calculated
@@ -1766,8 +1767,8 @@ sub update_media {
write_MD5SUM($urpm);
}
- $options{nolock} or urpm::sys::unlock_urpmi_db($urpm);
- $options{nopubkey} or urpm::sys::unlock_rpm_db($urpm);
+ $urpmi_lock and urpm::sys::unlock($urpmi_lock);
+ $rpm_lock and urpm::sys::unlock($rpm_lock);
}
#- clean params and depslist computation zone.
diff --git a/urpm/sys.pm b/urpm/sys.pm
index e1d83f20..dd24b08e 100644
--- a/urpm/sys.pm
+++ b/urpm/sys.pm
@@ -194,7 +194,7 @@ sub clean_dir {
# - lock rpm db in chroot
# - lock urpmi db in /
sub _lock {
- my ($urpm, $fh_ref, $file, $b_exclusive) = @_;
+ my ($urpm, $file, $b_exclusive) = @_;
#- avoid putting a require on Fcntl ':flock' (which is perl and not perl-base).
my ($LOCK_SH, $LOCK_EX, $LOCK_NB) = (1, 2, 4);
if ($b_exclusive) {
@@ -206,39 +206,31 @@ sub _lock {
#- lock urpmi database, if the LOCK file doesn't exists no share lock.
}
my ($sense, $mode) = $b_exclusive ? ('>', $LOCK_EX) : ('<', $LOCK_SH);
- open $$fh_ref, $sense, $file or return;
- flock $$fh_ref, $mode|$LOCK_NB or $urpm->{fatal}(7, N("urpmi database locked"));
+ open(my $fh, $sense, $file) or return;
+ flock $fh, $mode|$LOCK_NB or $urpm->{fatal}(7, N("urpmi database locked"));
+# warn "locking $file $b_exclusive ($fh)\n";
+ $fh;
}
-my $RPMLOCK_FILE;
-my $LOCK_FILE;
-
sub lock_rpm_db {
my ($urpm, $b_exclusive) = @_;
- _lock($urpm, \$RPMLOCK_FILE, "$urpm->{root}/$urpm->{statedir}/.RPMLOCK", $b_exclusive);
+ _lock($urpm, "$urpm->{root}/$urpm->{statedir}/.RPMLOCK", $b_exclusive);
}
sub lock_urpmi_db {
my ($urpm, $b_exclusive) = @_;
- _lock($urpm, \$LOCK_FILE, "$urpm->{statedir}/.LOCK", $b_exclusive);
+ _lock($urpm, "$urpm->{statedir}/.LOCK", $b_exclusive);
}
-sub _unlock {
- my ($fh_ref) = @_;
+sub unlock {
+ my ($fh) = @_;
+# warn "unlocking $fh\n";
#- avoid putting a require on Fcntl ':flock' (which is perl and not perl-base).
my $LOCK_UN = 8;
#- now everything is finished.
#- release lock on database.
- flock $$fh_ref, $LOCK_UN;
- close $$fh_ref;
-}
-sub unlock_rpm_db {
- my ($_urpm) = @_;
- _unlock(\$RPMLOCK_FILE);
-}
-sub unlock_urpmi_db {
- my ($_urpm) = @_;
- _unlock(\$LOCK_FILE);
+ flock $fh, $LOCK_UN;
+ close $fh;
}
sub syserror {