Scheduler: add queue for ebuild-locks
authorZac Medico <zmedico@gentoo.org>
Sun, 8 May 2011 04:16:58 +0000 (21:16 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 8 May 2011 04:35:30 +0000 (21:35 -0700)
Use a separate queue for ebuild-locks when the merge
queue allows more than 1 job (due to parallel-install),
since the portage.locks module does not behave as desired
if we try to lock the same file multiple times
concurrently from the same process.

pym/_emerge/Scheduler.py

index 182ad87711e9cf70e7bbe048c425758da498b863..6c21c711eaea369674289c22078c02b1f1604292 100644 (file)
@@ -95,7 +95,7 @@ class Scheduler(PollScheduler):
                __slots__ = ("log_file", "schedule")
 
        _task_queues_class = slot_dict_class(
-               ("merge", "jobs", "fetch", "unpack"), prefix="")
+               ("merge", "jobs", "ebuild_locks", "fetch", "unpack"), prefix="")
 
        class _build_opts_class(SlotObject):
                __slots__ = ("buildpkg", "buildpkgonly",
@@ -565,7 +565,16 @@ class Scheduler(PollScheduler):
                Schedule a setup phase on the merge queue, in order to
                serialize unsandboxed access to the live filesystem.
                """
-               self._task_queues.merge.add(setup_phase)
+               if self._task_queues.merge.max_jobs > 1 and \
+                       "ebuild-locks" in self.settings.features:
+                       # Use a separate queue for ebuild-locks when the merge
+                       # queue allows more than 1 job (due to parallel-install),
+                       # since the portage.locks module does not behave as desired
+                       # if we try to lock the same file multiple times
+                       # concurrently from the same process.
+                       self._task_queues.ebuild_locks.add(setup_phase)
+               else:
+                       self._task_queues.merge.add(setup_phase)
                self._schedule()
 
        def _schedule_unpack(self, unpack_phase):