Bug #336142 - Add support for using a thread to wait for locks inside
authorZac Medico <zmedico@gentoo.org>
Tue, 14 Sep 2010 03:01:16 +0000 (20:01 -0700)
committerZac Medico <zmedico@gentoo.org>
Tue, 14 Sep 2010 03:01:16 +0000 (20:01 -0700)
EbuildBuildDir.lock() so that the scheduler can concurrently service ipc
calls in the main thread.

pym/_emerge/Binpkg.py
pym/_emerge/EbuildBuild.py
pym/_emerge/EbuildBuildDir.py

index ac9a68a0f62ff1ec35e685c57f49246271379cc2..f50be6866bbaaa94fe52412404937cdfe0bf07cb 100644 (file)
@@ -42,7 +42,7 @@ class Binpkg(CompositeTask):
                dir_path = os.path.join(settings["PORTAGE_TMPDIR"],
                        "portage", pkg.category, pkg.pf)
                self._build_dir = EbuildBuildDir(dir_path=dir_path,
-                       pkg=pkg, settings=settings)
+                       pkg=pkg, scheduler=self.scheduler, settings=settings)
                self._image_dir = os.path.join(dir_path, "image")
                self._infloc = os.path.join(dir_path, "build-info")
                self._ebuild_path = os.path.join(self._infloc, pkg.pf + ".ebuild")
index 6d42b1fbb2ba970b4a0cca1d79948795b2f2720b..c5241ffcde0e3cd628fe1e6d915b34d021d6bfee 100644 (file)
@@ -114,7 +114,8 @@ class EbuildBuild(CompositeTask):
                                self.wait()
                                return
 
-               self._build_dir = EbuildBuildDir(pkg=pkg, settings=settings)
+               self._build_dir = EbuildBuildDir(pkg=pkg,
+                       scheduler=self.scheduler, settings=settings)
                self._build_dir.lock()
 
                # Cleaning needs to happen before fetch, since the build dir
index d9e471639b19cb3a07fe7c6745c79eadb076ad32..118001b5a903f6e8fe6d5841a0966265d6e28e3d 100644 (file)
@@ -1,6 +1,7 @@
-# Copyright 1999-2009 Gentoo Foundation
+# Copyright 1999-2010 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
+from _emerge.AsynchronousLock import AsynchronousLock
 from _emerge.SlotObject import SlotObject
 import portage
 from portage import os
@@ -8,7 +9,7 @@ import errno
 
 class EbuildBuildDir(SlotObject):
 
-       __slots__ = ("dir_path", "pkg", "settings",
+       __slots__ = ("dir_path", "pkg", "scheduler", "settings",
                "locked", "_catdir", "_lock_obj")
 
        def __init__(self, **kwargs):
@@ -47,17 +48,21 @@ class EbuildBuildDir(SlotObject):
                portage.util.ensure_dirs(os.path.dirname(catdir),
                        gid=portage.portage_gid,
                        mode=0o70, mask=0)
-               catdir_lock = None
+               catdir_lock = AsynchronousLock(path=catdir, scheduler=self.scheduler)
+               catdir_lock.start()
+               catdir_lock.wait()
                try:
-                       catdir_lock = portage.locks.lockdir(catdir)
                        portage.util.ensure_dirs(catdir,
                                gid=portage.portage_gid,
                                mode=0o70, mask=0)
-                       self._lock_obj = portage.locks.lockdir(dir_path)
+                       builddir_lock = AsynchronousLock(path=dir_path,
+                               scheduler=self.scheduler)
+                       builddir_lock.start()
+                       builddir_lock.wait()
+                       self._lock_obj = builddir_lock.lock_obj
                finally:
                        self.locked = self._lock_obj is not None
-                       if catdir_lock is not None:
-                               portage.locks.unlockdir(catdir_lock)
+                       catdir_lock.unlock()
 
        def clean_log(self):
                """Discard existing log. The log will not be be discarded