From 60d85b7e9fe14eeff84053cc1585ca45eaa3f1ab Mon Sep 17 00:00:00 2001 From: Pascal Rigaux Date: Thu, 23 Nov 2006 08:33:45 +0000 Subject: don't have a global variable to hold locks, otherwise code can't lock twice non-exclusive --- urpm/media.pm | 13 +++++++------ urpm/sys.pm | 32 ++++++++++++-------------------- 2 files changed, 19 insertions(+), 26 deletions(-) (limited to 'urpm') 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 { -- cgit v1.2.1