summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2019-08-13 20:14:49 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-08-14 17:28:23 +0100
commitd842d2507a7f74f2a4a711d293006b4ee03b10af (patch)
tree5db01fbf618d842d31ecc390968f05704a0f2dba /bitbake
parent99db00b8364930c154fe2e5d1aa3e6c22f8d566d (diff)
downloadpoky-d842d2507a7f74f2a4a711d293006b4ee03b10af.tar.gz
bitbake: runqueue: Fix next_buildable_task performance problem
Looking at the profile information, a lot of time is being spent in next_buildable_task. This is probably due to the generator expressions not working well with the empty test. The easiest way to improve things is to switch to using set manipulations. We also don't need to update self.buildable the way the original code did as we don't rely on that anywhere. (Bitbake rev: 3bcf9ad4964b7e42d1a02ce231e9db42a81ead2a) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/runqueue.py12
1 files changed, 7 insertions, 5 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 9acad7af8e..3bcbaee12a 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -133,7 +133,7 @@ class RunQueueScheduler(object):
133 133
134 self.prio_map = [self.rqdata.runtaskentries.keys()] 134 self.prio_map = [self.rqdata.runtaskentries.keys()]
135 135
136 self.buildable = [] 136 self.buildable = set()
137 self.skip_maxthread = {} 137 self.skip_maxthread = {}
138 self.stamps = {} 138 self.stamps = {}
139 for tid in self.rqdata.runtaskentries: 139 for tid in self.rqdata.runtaskentries:
@@ -148,8 +148,10 @@ class RunQueueScheduler(object):
148 """ 148 """
149 Return the id of the first task we find that is buildable 149 Return the id of the first task we find that is buildable
150 """ 150 """
151 self.buildable = [x for x in self.buildable if x not in self.rq.runq_running] 151 buildable = set(self.buildable)
152 buildable = [x for x in self.buildable if (x in self.rq.tasks_covered or x in self.rq.tasks_notcovered) and x not in self.rq.holdoff_tasks] 152 buildable.difference_update(self.rq.runq_running)
153 buildable.difference_update(self.rq.holdoff_tasks)
154 buildable.intersection_update(self.rq.tasks_covered | self.rq.tasks_notcovered)
153 if not buildable: 155 if not buildable:
154 return None 156 return None
155 157
@@ -167,7 +169,7 @@ class RunQueueScheduler(object):
167 skip_buildable[rtaskname] = 1 169 skip_buildable[rtaskname] = 1
168 170
169 if len(buildable) == 1: 171 if len(buildable) == 1:
170 tid = buildable[0] 172 tid = buildable.pop()
171 taskname = taskname_from_tid(tid) 173 taskname = taskname_from_tid(tid)
172 if taskname in skip_buildable and skip_buildable[taskname] >= int(self.skip_maxthread[taskname]): 174 if taskname in skip_buildable and skip_buildable[taskname] >= int(self.skip_maxthread[taskname]):
173 return None 175 return None
@@ -204,7 +206,7 @@ class RunQueueScheduler(object):
204 return self.next_buildable_task() 206 return self.next_buildable_task()
205 207
206 def newbuildable(self, task): 208 def newbuildable(self, task):
207 self.buildable.append(task) 209 self.buildable.add(task)
208 210
209 def removebuildable(self, task): 211 def removebuildable(self, task):
210 self.buildable.remove(task) 212 self.buildable.remove(task)