3 # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
7 from queue import Queue
9 from Queue import Queue
10 from waflib import Utils,Task,Errors,Logs
12 class TaskConsumer(Utils.threading.Thread):
14 Utils.threading.Thread.__init__(self)
26 if not isinstance(tsk,Task.TaskBase):
33 return pool.get(False)
38 def _free_resources():
42 lst.append(pool.get())
48 atexit.register(_free_resources)
49 class Parallel(object):
50 def __init__(self,bld,j=2):
62 def get_next_task(self):
63 if not self.outstanding:
65 return self.outstanding.pop(0)
66 def postpone(self,tsk):
67 if random.randint(0,1):
68 self.frozen.insert(0,tsk)
70 self.frozen.append(tsk)
71 def refill_task_list(self):
72 while self.count>self.numjobs*GAP:
74 while not self.outstanding:
79 cond=self.deadlock==self.processed
80 except AttributeError:
84 msg='check the build order for the tasks'
85 for tsk in self.frozen:
87 msg='check the methods runnable_status'
90 for tsk in self.frozen:
91 lst.append('%s\t-> %r'%(repr(tsk),[id(x)for x in tsk.run_after]))
92 raise Errors.WafError('Deadlock detected: %s%s'%(msg,''.join(lst)))
93 self.deadlock=self.processed
95 self.outstanding+=self.frozen
98 self.outstanding.extend(self.biter.next())
99 self.total=self.bld.total()
101 def add_more_tasks(self,tsk):
102 if getattr(tsk,'more_tasks',None):
103 self.outstanding+=tsk.more_tasks
104 self.total+=len(tsk.more_tasks)
108 self.add_more_tasks(tsk)
112 def error_handler(self,tsk):
113 if not self.bld.keep:
115 self.error.append(tsk)
116 def add_task(self,tsk):
119 except AttributeError:
120 self.init_task_pool()
122 def init_task_pool(self):
123 pool=self.pool=[get_pool()for i in range(self.numjobs)]
126 consumer.ready=self.ready
130 def free_task_pool(self):
132 consumer.ready=Queue(0)
136 except AttributeError:
147 self.total=self.bld.total()
149 self.refill_task_list()
150 tsk=self.get_next_task()
162 st=tsk.runnable_status()
165 tsk.err_msg=Utils.ex_stack()
166 if not self.stop and self.bld.keep:
167 tsk.hasrun=Task.SKIPPED
169 if Logs.verbose>1 or not self.error:
170 self.error.append(tsk)
174 self.error.append(tsk)
176 tsk.hasrun=Task.EXCEPTION
177 self.error_handler(tsk)
179 if st==Task.ASK_LATER:
181 elif st==Task.SKIP_ME:
183 tsk.hasrun=Task.SKIPPED
184 self.add_more_tasks(tsk)
186 tsk.position=(self.processed,self.total)
194 while self.error and self.count:
196 assert(self.count==0 or self.stop)
197 self.free_task_pool()