forked from mirror/waf
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.5 KiB
Python
69 lines
1.5 KiB
Python
#!/usr/bin/env python
|
|
# encoding: utf-8
|
|
# Thomas Nagy, 2021 (ita)
|
|
|
|
from waflib import Utils, Runner
|
|
|
|
"""
|
|
Re-enable the classic threading system from waf 1.x
|
|
|
|
def configure(conf):
|
|
conf.load('classic_runner')
|
|
"""
|
|
|
|
class TaskConsumer(Utils.threading.Thread):
|
|
"""
|
|
Task consumers belong to a pool of workers
|
|
|
|
They wait for tasks in the queue and then use ``task.process(...)``
|
|
"""
|
|
def __init__(self, spawner):
|
|
Utils.threading.Thread.__init__(self)
|
|
"""
|
|
Obtain :py:class:`waflib.Task.TaskBase` instances from this queue.
|
|
"""
|
|
self.spawner = spawner
|
|
self.daemon = True
|
|
self.start()
|
|
|
|
def run(self):
|
|
"""
|
|
Loop over the tasks to execute
|
|
"""
|
|
try:
|
|
self.loop()
|
|
except Exception:
|
|
pass
|
|
|
|
def loop(self):
|
|
"""
|
|
Obtain tasks from :py:attr:`waflib.Runner.TaskConsumer.ready` and call
|
|
:py:meth:`waflib.Task.TaskBase.process`. If the object is a function, execute it.
|
|
"""
|
|
master = self.spawner.master
|
|
while 1:
|
|
if not master.stop:
|
|
try:
|
|
tsk = master.ready.get()
|
|
if tsk:
|
|
tsk.log_display(tsk.generator.bld)
|
|
master.process_task(tsk)
|
|
else:
|
|
break
|
|
finally:
|
|
master.out.put(tsk)
|
|
|
|
class Spawner(object):
|
|
"""
|
|
Daemon thread that consumes tasks from :py:class:`waflib.Runner.Parallel` producer and
|
|
spawns a consuming thread :py:class:`waflib.Runner.Consumer` for each
|
|
:py:class:`waflib.Task.Task` instance.
|
|
"""
|
|
def __init__(self, master):
|
|
self.master = master
|
|
""":py:class:`waflib.Runner.Parallel` producer instance"""
|
|
|
|
self.pool = [TaskConsumer(self) for i in range(master.numjobs)]
|
|
|
|
Runner.Spawner = Spawner
|