summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-09-13 22:17:48 -0700
committerZac Medico <zmedico@gentoo.org>2010-09-13 22:17:48 -0700
commitaef1da0fb734ff691b191a91c4c66fe95e11ab3b (patch)
treeba130c10d6ed4d6deddffc7690462c6235786a69
parent67e62aafc4c980909ae85dd6956538fc1e267407 (diff)
downloadportage-aef1da0fb734ff691b191a91c4c66fe95e11ab3b.tar.gz
portage-aef1da0fb734ff691b191a91c4c66fe95e11ab3b.tar.bz2
portage-aef1da0fb734ff691b191a91c4c66fe95e11ab3b.zip
Bug #336142 - Use EbuildBuildDir for threaded locking of PORTAGE_BUILDDIR
inside dblink.unmerge(), so that the scheduler can concurrently service ipc calls in the main thread.
-rw-r--r--pym/portage/dbapi/vartree.py39
1 files changed, 8 insertions, 31 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 742bc6049..c90dbbd21 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -52,6 +52,7 @@ from portage import _unicode_decode
from portage import _unicode_encode
from _emerge.AsynchronousLock import AsynchronousLock
+from _emerge.EbuildBuildDir import EbuildBuildDir
from _emerge.PollScheduler import PollScheduler
from _emerge.MiscFunctionsProcess import MiscFunctionsProcess
@@ -1489,7 +1490,6 @@ class dblink(object):
myebuildpath = None
ebuild_phase = "prerm"
log_path = None
- catdir = None
mystuff = os.listdir(self.dbdir)
for x in mystuff:
if x.endswith(".ebuild"):
@@ -1512,28 +1512,18 @@ class dblink(object):
os.path.join(self.dbdir, "EAPI"), noiselevel=-1)
writemsg("%s\n" % str(e), noiselevel=-1)
myebuildpath = None
- else:
- catdir = os.path.dirname(self.settings["PORTAGE_BUILDDIR"])
- ensure_dirs(os.path.dirname(catdir), uid=portage_uid,
- gid=portage_gid, mode=0o70, mask=0)
builddir_lock = None
- catdir_lock = None
scheduler = self._scheduler
retval = os.EX_OK
failures = 0
try:
if myebuildpath:
- catdir_lock = lockdir(catdir)
- ensure_dirs(catdir,
- uid=portage_uid, gid=portage_gid,
- mode=0o70, mask=0)
- builddir_lock = lockdir(
- self.settings["PORTAGE_BUILDDIR"])
- try:
- unlockdir(catdir_lock)
- finally:
- catdir_lock = None
+ builddir_lock = EbuildBuildDir(
+ dir_path=self.settings['PORTAGE_BUILDDIR'],
+ scheduler=(scheduler or PollScheduler().sched_iface),
+ settings=self.settings)
+ builddir_lock.lock()
prepare_build_dirs(settings=self.settings, cleanup=True)
log_path = self.settings.get("PORTAGE_LOG_FILE")
@@ -1666,21 +1656,8 @@ class dblink(object):
self, self.vartree.dbapi,
myebuildpath, "cleanrm")
finally:
- unlockdir(builddir_lock)
- try:
- if catdir and not catdir_lock:
- # Lock catdir for removal if empty.
- catdir_lock = lockdir(catdir)
- finally:
- if catdir_lock:
- try:
- os.rmdir(catdir)
- except OSError as e:
- if e.errno not in (errno.ENOENT,
- errno.ENOTEMPTY, errno.EEXIST):
- raise
- del e
- unlockdir(catdir_lock)
+ if builddir_lock is not None:
+ builddir_lock.unlock()
if log_path is not None: