diff options
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 170 |
1 files changed, 80 insertions, 90 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 4e37aaf723..8580f51693 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -22,13 +22,13 @@ Handles preparation and execution of a queue of tasks | |||
| 22 | # with this program; if not, write to the Free Software Foundation, Inc., | 22 | # with this program; if not, write to the Free Software Foundation, Inc., |
| 23 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 23 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| 24 | 24 | ||
| 25 | import copy | ||
| 25 | import os | 26 | import os |
| 26 | import sys | 27 | import sys |
| 27 | import subprocess | 28 | import subprocess |
| 28 | import signal | 29 | import signal |
| 29 | import stat | 30 | import stat |
| 30 | import fcntl | 31 | import fcntl |
| 31 | import copy | ||
| 32 | import logging | 32 | import logging |
| 33 | import bb | 33 | import bb |
| 34 | from bb import msg, data, event | 34 | from bb import msg, data, event |
| @@ -36,12 +36,6 @@ from bb import msg, data, event | |||
| 36 | bblogger = logging.getLogger("BitBake") | 36 | bblogger = logging.getLogger("BitBake") |
| 37 | logger = logging.getLogger("BitBake.RunQueue") | 37 | logger = logging.getLogger("BitBake.RunQueue") |
| 38 | 38 | ||
| 39 | try: | ||
| 40 | import cPickle as pickle | ||
| 41 | except ImportError: | ||
| 42 | import pickle | ||
| 43 | logger.info("Importing cPickle failed. Falling back to a very slow implementation.") | ||
| 44 | |||
| 45 | class RunQueueStats: | 39 | class RunQueueStats: |
| 46 | """ | 40 | """ |
| 47 | Holds statistics on the tasks handled by the associated runQueue | 41 | Holds statistics on the tasks handled by the associated runQueue |
| @@ -93,28 +87,28 @@ class RunQueueScheduler(object): | |||
| 93 | """ | 87 | """ |
| 94 | self.rq = runqueue | 88 | self.rq = runqueue |
| 95 | self.rqdata = rqdata | 89 | self.rqdata = rqdata |
| 96 | numTasks = len(self.rq.runq_fnid) | 90 | numTasks = len(self.rqdata.runq_fnid) |
| 97 | 91 | ||
| 98 | self.prio_map = [] | 92 | self.prio_map = [] |
| 99 | self.prio_map.extend(range(numTasks)) | 93 | self.prio_map.extend(range(numTasks)) |
| 100 | 94 | ||
| 101 | def next_buildable_tasks(self): | 95 | def next_buildable_task(self): |
| 102 | """ | 96 | """ |
| 103 | Return the id of the first task we find that is buildable | 97 | Return the id of the first task we find that is buildable |
| 104 | """ | 98 | """ |
| 105 | for tasknum in range(len(self.rqdata.runq_fnid)): | 99 | for tasknum in xrange(len(self.rqdata.runq_fnid)): |
| 106 | taskid = self.prio_map[tasknum] | 100 | taskid = self.prio_map[tasknum] |
| 107 | if self.rq.runq_running[taskid] == 1: | 101 | if self.rq.runq_running[taskid] == 1: |
| 108 | continue | 102 | continue |
| 109 | if self.rq.runq_buildable[taskid] == 1: | 103 | if self.rq.runq_buildable[taskid] == 1: |
| 110 | yield taskid | 104 | return taskid |
| 111 | 105 | ||
| 112 | def next(self): | 106 | def next(self): |
| 113 | """ | 107 | """ |
| 114 | Return the id of the task we should build next | 108 | Return the id of the task we should build next |
| 115 | """ | 109 | """ |
| 116 | if self.rq.stats.active < self.rq.number_tasks: | 110 | if self.rq.stats.active < self.rq.number_tasks: |
| 117 | return next(self.next_buildable_tasks(), None) | 111 | return self.next_buildable_task() |
| 118 | 112 | ||
| 119 | class RunQueueSchedulerSpeed(RunQueueScheduler): | 113 | class RunQueueSchedulerSpeed(RunQueueScheduler): |
| 120 | """ | 114 | """ |
| @@ -127,13 +121,12 @@ class RunQueueSchedulerSpeed(RunQueueScheduler): | |||
| 127 | """ | 121 | """ |
| 128 | The priority map is sorted by task weight. | 122 | The priority map is sorted by task weight. |
| 129 | """ | 123 | """ |
| 130 | from copy import deepcopy | ||
| 131 | 124 | ||
| 132 | self.rq = runqueue | 125 | self.rq = runqueue |
| 133 | self.rqdata = rqdata | 126 | self.rqdata = rqdata |
| 134 | 127 | ||
| 135 | sortweight = sorted(deepcopy(self.rqdata.runq_weight)) | 128 | sortweight = sorted(copy.deepcopy(self.rqdata.runq_weight)) |
| 136 | copyweight = deepcopy(self.rqdata.runq_weight) | 129 | copyweight = copy.deepcopy(self.rqdata.runq_weight) |
| 137 | self.prio_map = [] | 130 | self.prio_map = [] |
| 138 | 131 | ||
| 139 | for weight in sortweight: | 132 | for weight in sortweight: |
| @@ -155,12 +148,11 @@ class RunQueueSchedulerCompletion(RunQueueSchedulerSpeed): | |||
| 155 | 148 | ||
| 156 | def __init__(self, runqueue, rqdata): | 149 | def __init__(self, runqueue, rqdata): |
| 157 | RunQueueSchedulerSpeed.__init__(self, runqueue, rqdata) | 150 | RunQueueSchedulerSpeed.__init__(self, runqueue, rqdata) |
| 158 | from copy import deepcopy | ||
| 159 | 151 | ||
| 160 | #FIXME - whilst this groups all fnids together it does not reorder the | 152 | #FIXME - whilst this groups all fnids together it does not reorder the |
| 161 | #fnid groups optimally. | 153 | #fnid groups optimally. |
| 162 | 154 | ||
| 163 | basemap = deepcopy(self.prio_map) | 155 | basemap = copy.deepcopy(self.prio_map) |
| 164 | self.prio_map = [] | 156 | self.prio_map = [] |
| 165 | while (len(basemap) > 0): | 157 | while (len(basemap) > 0): |
| 166 | entry = basemap.pop(0) | 158 | entry = basemap.pop(0) |
| @@ -190,25 +182,6 @@ class RunQueueData: | |||
| 190 | self.stampwhitelist = bb.data.getVar("BB_STAMP_WHITELIST", cfgData, 1) or "" | 182 | self.stampwhitelist = bb.data.getVar("BB_STAMP_WHITELIST", cfgData, 1) or "" |
| 191 | self.multi_provider_whitelist = (bb.data.getVar("MULTI_PROVIDER_WHITELIST", cfgData, 1) or "").split() | 183 | self.multi_provider_whitelist = (bb.data.getVar("MULTI_PROVIDER_WHITELIST", cfgData, 1) or "").split() |
| 192 | 184 | ||
| 193 | self.schedulers = set(obj for obj in globals().itervalues() | ||
| 194 | if type(obj) is type and issubclass(obj, RunQueueScheduler)) | ||
| 195 | |||
| 196 | user_schedulers = bb.data.getVar("BB_SCHEDULERS", cfgData, True) | ||
| 197 | if user_schedulers: | ||
| 198 | for sched in user_schedulers.split(): | ||
| 199 | if not "." in sched: | ||
| 200 | bb.note("Ignoring scheduler '%s' from BB_SCHEDULERS: not an import" % sched) | ||
| 201 | continue | ||
| 202 | |||
| 203 | modname, name = sched.rsplit(".", 1) | ||
| 204 | try: | ||
| 205 | module = __import__(modname, fromlist=(name,)) | ||
| 206 | except ImportError, exc: | ||
| 207 | logger.critical("Unable to import scheduler '%s' from '%s': %s" % (name, modname, exc)) | ||
| 208 | raise SystemExit(1) | ||
| 209 | else: | ||
| 210 | self.schedulers.add(getattr(module, name)) | ||
| 211 | |||
| 212 | self.reset() | 185 | self.reset() |
| 213 | 186 | ||
| 214 | def reset(self): | 187 | def reset(self): |
| @@ -313,7 +286,7 @@ class RunQueueData: | |||
| 313 | if dep in explored_deps[revdep]: | 286 | if dep in explored_deps[revdep]: |
| 314 | scan = True | 287 | scan = True |
| 315 | if scan: | 288 | if scan: |
| 316 | find_chains(revdep, deepcopy(prev_chain)) | 289 | find_chains(revdep, copy.deepcopy(prev_chain)) |
| 317 | for dep in explored_deps[revdep]: | 290 | for dep in explored_deps[revdep]: |
| 318 | if dep not in total_deps: | 291 | if dep not in total_deps: |
| 319 | total_deps.append(dep) | 292 | total_deps.append(dep) |
| @@ -715,20 +688,15 @@ class RunQueueData: | |||
| 715 | stampfnwhitelist.append(fn) | 688 | stampfnwhitelist.append(fn) |
| 716 | self.stampfnwhitelist = stampfnwhitelist | 689 | self.stampfnwhitelist = stampfnwhitelist |
| 717 | 690 | ||
| 718 | #self.dump_data(taskData) | ||
| 719 | |||
| 720 | # Interate over the task list looking for tasks with a 'setscene' function | 691 | # Interate over the task list looking for tasks with a 'setscene' function |
| 721 | |||
| 722 | self.runq_setscene = [] | 692 | self.runq_setscene = [] |
| 723 | for task in range(len(self.runq_fnid)): | 693 | for task in range(len(self.runq_fnid)): |
| 724 | setscene = taskData.gettask_id(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task] + "_setscene", False) | 694 | setscene = taskData.gettask_id(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task] + "_setscene", False) |
| 725 | if not setscene: | 695 | if not setscene: |
| 726 | continue | 696 | continue |
| 727 | #bb.note("Found setscene for %s %s" % (self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task])) | ||
| 728 | self.runq_setscene.append(task) | 697 | self.runq_setscene.append(task) |
| 729 | 698 | ||
| 730 | # Interate over the task list and call into the siggen code | 699 | # Interate over the task list and call into the siggen code |
| 731 | |||
| 732 | dealtwith = set() | 700 | dealtwith = set() |
| 733 | todeal = set(range(len(self.runq_fnid))) | 701 | todeal = set(range(len(self.runq_fnid))) |
| 734 | while len(todeal) > 0: | 702 | while len(todeal) > 0: |
| @@ -744,7 +712,7 @@ class RunQueueData: | |||
| 744 | hashdata = {} | 712 | hashdata = {} |
| 745 | hashdata["hashes"] = {} | 713 | hashdata["hashes"] = {} |
| 746 | hashdata["deps"] = {} | 714 | hashdata["deps"] = {} |
| 747 | for task in range(len(self.runq_fnid)): | 715 | for task in xrange(len(self.runq_fnid)): |
| 748 | hashdata["hashes"][self.taskData.fn_index[self.runq_fnid[task]] + "." + self.runq_task[task]] = self.runq_hash[task] | 716 | hashdata["hashes"][self.taskData.fn_index[self.runq_fnid[task]] + "." + self.runq_task[task]] = self.runq_hash[task] |
| 749 | deps = [] | 717 | deps = [] |
| 750 | for dep in self.runq_depends[task]: | 718 | for dep in self.runq_depends[task]: |
| @@ -764,24 +732,24 @@ class RunQueueData: | |||
| 764 | Dump some debug information on the internal data structures | 732 | Dump some debug information on the internal data structures |
| 765 | """ | 733 | """ |
| 766 | logger.debug(3, "run_tasks:") | 734 | logger.debug(3, "run_tasks:") |
| 767 | for task in range(len(self.rqdata.runq_task)): | 735 | for task in xrange(len(self.rqdata.runq_task)): |
| 768 | logger.debug(3, " (%s)%s - %s: %s Deps %s RevDeps %s" % (task, | 736 | logger.debug(3, " (%s)%s - %s: %s Deps %s RevDeps %s", task, |
| 769 | taskQueue.fn_index[self.rqdata.runq_fnid[task]], | 737 | taskQueue.fn_index[self.rqdata.runq_fnid[task]], |
| 770 | self.rqdata.runq_task[task], | 738 | self.rqdata.runq_task[task], |
| 771 | self.rqdata.runq_weight[task], | 739 | self.rqdata.runq_weight[task], |
| 772 | self.rqdata.runq_depends[task], | 740 | self.rqdata.runq_depends[task], |
| 773 | self.rqdata.runq_revdeps[task])) | 741 | self.rqdata.runq_revdeps[task]) |
| 774 | 742 | ||
| 775 | logger.debug(3, "sorted_tasks:") | 743 | logger.debug(3, "sorted_tasks:") |
| 776 | for task1 in range(len(self.rqdata.runq_task)): | 744 | for task1 in xrange(len(self.rqdata.runq_task)): |
| 777 | if task1 in self.prio_map: | 745 | if task1 in self.prio_map: |
| 778 | task = self.prio_map[task1] | 746 | task = self.prio_map[task1] |
| 779 | logger.debug(3, " (%s)%s - %s: %s Deps %s RevDeps %s" % (task, | 747 | logger.debug(3, " (%s)%s - %s: %s Deps %s RevDeps %s", task, |
| 780 | taskQueue.fn_index[self.rqdata.runq_fnid[task]], | 748 | taskQueue.fn_index[self.rqdata.runq_fnid[task]], |
| 781 | self.rqdata.runq_task[task], | 749 | self.rqdata.runq_task[task], |
| 782 | self.rqdata.runq_weight[task], | 750 | self.rqdata.runq_weight[task], |
| 783 | self.rqdata.runq_depends[task], | 751 | self.rqdata.runq_depends[task], |
| 784 | self.rqdata.runq_revdeps[task])) | 752 | self.rqdata.runq_revdeps[task]) |
| 785 | 753 | ||
| 786 | class RunQueue: | 754 | class RunQueue: |
| 787 | def __init__(self, cooker, cfgData, dataCache, taskData, targets): | 755 | def __init__(self, cooker, cfgData, dataCache, taskData, targets): |
| @@ -809,7 +777,7 @@ class RunQueue: | |||
| 809 | if self.stamppolicy == "whitelist": | 777 | if self.stamppolicy == "whitelist": |
| 810 | stampwhitelist = self.rqdata.stampfnwhitelist | 778 | stampwhitelist = self.rqdata.stampfnwhitelist |
| 811 | 779 | ||
| 812 | for task in range(len(self.rqdata.runq_fnid)): | 780 | for task in xrange(len(self.rqdata.runq_fnid)): |
| 813 | unchecked[task] = "" | 781 | unchecked[task] = "" |
| 814 | if len(self.rqdata.runq_depends[task]) == 0: | 782 | if len(self.rqdata.runq_depends[task]) == 0: |
| 815 | buildable.append(task) | 783 | buildable.append(task) |
| @@ -824,7 +792,7 @@ class RunQueue: | |||
| 824 | if revdep in unchecked: | 792 | if revdep in unchecked: |
| 825 | buildable.append(revdep) | 793 | buildable.append(revdep) |
| 826 | 794 | ||
| 827 | for task in range(len(self.rqdata.runq_fnid)): | 795 | for task in xrange(len(self.rqdata.runq_fnid)): |
| 828 | if task not in unchecked: | 796 | if task not in unchecked: |
| 829 | continue | 797 | continue |
| 830 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] | 798 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] |
| @@ -909,7 +877,7 @@ class RunQueue: | |||
| 909 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] | 877 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] |
| 910 | if taskname is None: | 878 | if taskname is None: |
| 911 | taskname = self.rqdata.runq_task[task] | 879 | taskname = self.rqdata.runq_task[task] |
| 912 | 880 | ||
| 913 | stampfile = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn], fn, taskname) | 881 | stampfile = bb.parse.siggen.stampfile(self.rqdata.dataCache.stamp[fn], fn, taskname) |
| 914 | 882 | ||
| 915 | # If the stamp is missing its not current | 883 | # If the stamp is missing its not current |
| @@ -919,7 +887,7 @@ class RunQueue: | |||
| 919 | # If its a 'nostamp' task, it's not current | 887 | # If its a 'nostamp' task, it's not current |
| 920 | taskdep = self.rqdata.dataCache.task_deps[fn] | 888 | taskdep = self.rqdata.dataCache.task_deps[fn] |
| 921 | if 'nostamp' in taskdep and taskname in taskdep['nostamp']: | 889 | if 'nostamp' in taskdep and taskname in taskdep['nostamp']: |
| 922 | logger.debug(2, "%s.%s is nostamp\n" % (fn, taskname)) | 890 | logger.debug(2, "%s.%s is nostamp\n", fn, taskname) |
| 923 | return False | 891 | return False |
| 924 | 892 | ||
| 925 | if taskname != "do_setscene" and taskname.endswith("_setscene"): | 893 | if taskname != "do_setscene" and taskname.endswith("_setscene"): |
| @@ -939,10 +907,10 @@ class RunQueue: | |||
| 939 | continue | 907 | continue |
| 940 | if fn == fn2 or (fulldeptree and fn2 not in stampwhitelist): | 908 | if fn == fn2 or (fulldeptree and fn2 not in stampwhitelist): |
| 941 | if not t2: | 909 | if not t2: |
| 942 | logger.debug(2, "Stampfile %s does not exist" % (stampfile2)) | 910 | logger.debug(2, 'Stampfile %s does not exist', stampfile2) |
| 943 | iscurrent = False | 911 | iscurrent = False |
| 944 | if t1 < t2: | 912 | if t1 < t2: |
| 945 | logger.debug(2, "Stampfile %s < %s" % (stampfile, stampfile2)) | 913 | logger.debug(2, 'Stampfile %s < %s', stampfile, stampfile2) |
| 946 | iscurrent = False | 914 | iscurrent = False |
| 947 | 915 | ||
| 948 | return iscurrent | 916 | return iscurrent |
| @@ -1014,7 +982,7 @@ class RunQueue: | |||
| 1014 | bb.note("Reparsing files to collect dependency data") | 982 | bb.note("Reparsing files to collect dependency data") |
| 1015 | for task in range(len(self.rqdata.runq_fnid)): | 983 | for task in range(len(self.rqdata.runq_fnid)): |
| 1016 | if self.rqdata.runq_fnid[task] not in done: | 984 | if self.rqdata.runq_fnid[task] not in done: |
| 1017 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] | 985 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] |
| 1018 | the_data = bb.cache.Cache.loadDataFull(fn, self.cooker.get_file_appends(fn), self.cooker.configuration.data) | 986 | the_data = bb.cache.Cache.loadDataFull(fn, self.cooker.get_file_appends(fn), self.cooker.configuration.data) |
| 1019 | done.add(self.rqdata.runq_fnid[task]) | 987 | done.add(self.rqdata.runq_fnid[task]) |
| 1020 | 988 | ||
| @@ -1219,14 +1187,38 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
| 1219 | 1187 | ||
| 1220 | event.fire(bb.event.StampUpdate(self.rqdata.target_pairs, self.rqdata.dataCache.stamp), self.cfgData) | 1188 | event.fire(bb.event.StampUpdate(self.rqdata.target_pairs, self.rqdata.dataCache.stamp), self.cfgData) |
| 1221 | 1189 | ||
| 1222 | for scheduler in self.rqdata.schedulers: | 1190 | schedulers = self.get_schedulers() |
| 1191 | for scheduler in schedulers: | ||
| 1223 | if self.scheduler == scheduler.name: | 1192 | if self.scheduler == scheduler.name: |
| 1224 | self.sched = scheduler(self, self.rqdata) | 1193 | self.sched = scheduler(self, self.rqdata) |
| 1225 | logger.debug(1, "Using runqueue scheduler '%s'", scheduler.name) | 1194 | logger.debug(1, "Using runqueue scheduler '%s'", scheduler.name) |
| 1226 | break | 1195 | break |
| 1227 | else: | 1196 | else: |
| 1228 | bb.fatal("Invalid scheduler '%s'. Available schedulers: %s" % | 1197 | bb.fatal("Invalid scheduler '%s'. Available schedulers: %s" % |
| 1229 | (self.scheduler, ", ".join(obj.name for obj in self.rqdata.schedulers))) | 1198 | (self.scheduler, ", ".join(obj.name for obj in schedulers))) |
| 1199 | |||
| 1200 | |||
| 1201 | def get_schedulers(self): | ||
| 1202 | schedulers = set(obj for obj in globals().values() | ||
| 1203 | if type(obj) is type and | ||
| 1204 | issubclass(obj, RunQueueScheduler)) | ||
| 1205 | |||
| 1206 | user_schedulers = bb.data.getVar("BB_SCHEDULERS", self.cfgData, True) | ||
| 1207 | if user_schedulers: | ||
| 1208 | for sched in user_schedulers.split(): | ||
| 1209 | if not "." in sched: | ||
| 1210 | bb.note("Ignoring scheduler '%s' from BB_SCHEDULERS: not an import" % sched) | ||
| 1211 | continue | ||
| 1212 | |||
| 1213 | modname, name = sched.rsplit(".", 1) | ||
| 1214 | try: | ||
| 1215 | module = __import__(modname, fromlist=(name,)) | ||
| 1216 | except ImportError, exc: | ||
| 1217 | logger.critical("Unable to import scheduler '%s' from '%s': %s" % (name, modname, exc)) | ||
| 1218 | raise SystemExit(1) | ||
| 1219 | else: | ||
| 1220 | schedulers.add(getattr(module, name)) | ||
| 1221 | return schedulers | ||
| 1230 | 1222 | ||
| 1231 | def task_completeoutright(self, task): | 1223 | def task_completeoutright(self, task): |
| 1232 | """ | 1224 | """ |
| @@ -1283,12 +1275,14 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
| 1283 | # nothing to do | 1275 | # nothing to do |
| 1284 | self.rq.state = runQueueCleanUp | 1276 | self.rq.state = runQueueCleanUp |
| 1285 | 1277 | ||
| 1286 | for task in iter(self.sched.next, None): | 1278 | task = self.sched.next() |
| 1279 | if task is not None: | ||
| 1287 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] | 1280 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] |
| 1288 | 1281 | ||
| 1289 | taskname = self.rqdata.runq_task[task] | 1282 | taskname = self.rqdata.runq_task[task] |
| 1290 | if self.rq.check_stamp_task(task, taskname): | 1283 | if self.rq.check_stamp_task(task, taskname): |
| 1291 | logger.debug(2, "Stamp current task %s (%s)" % (task, self.rqdata.get_user_idstring(task))) | 1284 | logger.debug(2, "Stamp current task %s (%s)", task, |
| 1285 | self.rqdata.get_user_idstring(task)) | ||
| 1292 | self.task_skip(task) | 1286 | self.task_skip(task) |
| 1293 | return True | 1287 | return True |
| 1294 | 1288 | ||
| @@ -1455,12 +1449,11 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
| 1455 | 1449 | ||
| 1456 | for task in xrange(len(self.sq_revdeps)): | 1450 | for task in xrange(len(self.sq_revdeps)): |
| 1457 | if task not in valid_new and task not in noexec: | 1451 | if task not in valid_new and task not in noexec: |
| 1458 | logger.debug(2, "No package found so skipping setscene task %s" % (self.rqdata.get_user_idstring(self.rqdata.runq_setscene[task]))) | 1452 | logger.debug(2, 'No package found, so skipping setscene task %s', |
| 1453 | self.rqdata.get_user_idstring(task)) | ||
| 1459 | self.task_failoutright(task) | 1454 | self.task_failoutright(task) |
| 1460 | 1455 | ||
| 1461 | #print(str(valid)) | 1456 | logger.info('Executing SetScene Tasks') |
| 1462 | |||
| 1463 | logger.info("Executing SetScene Tasks") | ||
| 1464 | 1457 | ||
| 1465 | self.rq.state = runQueueSceneRun | 1458 | self.rq.state = runQueueSceneRun |
| 1466 | 1459 | ||
| @@ -1521,11 +1514,6 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
| 1521 | # Find the next setscene to run | 1514 | # Find the next setscene to run |
| 1522 | for nexttask in xrange(self.stats.total): | 1515 | for nexttask in xrange(self.stats.total): |
| 1523 | if self.runq_buildable[nexttask] == 1 and self.runq_running[nexttask] != 1: | 1516 | if self.runq_buildable[nexttask] == 1 and self.runq_running[nexttask] != 1: |
| 1524 | #bb.note("Comparing %s to %s" % (self.sq_revdeps[nexttask], self.scenequeue_covered)) | ||
| 1525 | #if len(self.sq_revdeps[nexttask]) > 0 and self.sq_revdeps[nexttask].issubset(self.scenequeue_covered): | ||
| 1526 | # bb.note("Skipping task %s" % nexttask) | ||
| 1527 | # self.scenequeue_skip(nexttask) | ||
| 1528 | # return True | ||
| 1529 | task = nexttask | 1517 | task = nexttask |
| 1530 | break | 1518 | break |
| 1531 | if task is not None: | 1519 | if task is not None: |
| @@ -1534,7 +1522,8 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
| 1534 | 1522 | ||
| 1535 | taskname = self.rqdata.runq_task[realtask] + "_setscene" | 1523 | taskname = self.rqdata.runq_task[realtask] + "_setscene" |
| 1536 | if self.rq.check_stamp_task(realtask, self.rqdata.runq_task[realtask]): | 1524 | if self.rq.check_stamp_task(realtask, self.rqdata.runq_task[realtask]): |
| 1537 | logger.debug(2, "Stamp for underlying task %s (%s) is current so skipping setscene varient" % (task, self.rqdata.get_user_idstring(task))) | 1525 | logger.debug(2, 'Stamp for underlying task %s(%s) is current, so skipping setscene variant', |
| 1526 | task, self.rqdata.get_user_idstring(task)) | ||
| 1538 | self.task_failoutright(task) | 1527 | self.task_failoutright(task) |
| 1539 | return True | 1528 | return True |
| 1540 | 1529 | ||
| @@ -1545,7 +1534,8 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
| 1545 | return True | 1534 | return True |
| 1546 | 1535 | ||
| 1547 | if self.rq.check_stamp_task(realtask, taskname): | 1536 | if self.rq.check_stamp_task(realtask, taskname): |
| 1548 | logger.debug(2, "Setscene stamp current task %s (%s) so skip it and its dependencies" % (task, self.rqdata.get_user_idstring(realtask))) | 1537 | logger.debug(2, 'Setscene stamp current task %s(%s), so skip it and its dependencies', |
| 1538 | task, self.rqdata.get_user_idstring(realtask)) | ||
| 1549 | self.task_skip(task) | 1539 | self.task_skip(task) |
| 1550 | return True | 1540 | return True |
| 1551 | 1541 | ||
| @@ -1575,7 +1565,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
| 1575 | for task in oldcovered: | 1565 | for task in oldcovered: |
| 1576 | self.rq.scenequeue_covered.add(self.rqdata.runq_setscene[task]) | 1566 | self.rq.scenequeue_covered.add(self.rqdata.runq_setscene[task]) |
| 1577 | 1567 | ||
| 1578 | bb.debug(1, "We can skip tasks %s" % self.rq.scenequeue_covered) | 1568 | logger.debug(1, 'We can skip tasks %s', self.rq.scenequeue_covered) |
| 1579 | 1569 | ||
| 1580 | self.rq.state = runQueueRunInit | 1570 | self.rq.state = runQueueRunInit |
| 1581 | return True | 1571 | return True |
| @@ -1630,12 +1620,12 @@ class runQueueTaskCompleted(runQueueEvent): | |||
| 1630 | """ | 1620 | """ |
| 1631 | 1621 | ||
| 1632 | #def check_stamp_fn(fn, taskname, d): | 1622 | #def check_stamp_fn(fn, taskname, d): |
| 1633 | # rq = bb.data.getVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY", d) | 1623 | # rqexe = bb.data.getVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY", d) |
| 1634 | # fn = bb.data.getVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY2", d) | 1624 | # fn = bb.data.getVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY2", d) |
| 1635 | # fnid = rq.rqdata.taskData.getfn_id(fn) | 1625 | # fnid = rqexe.rqdata.taskData.getfn_id(fn) |
| 1636 | # taskid = rq.get_task_id(fnid, taskname) | 1626 | # taskid = rqexe.rqdata.get_task_id(fnid, taskname) |
| 1637 | # if taskid is not None: | 1627 | # if taskid is not None: |
| 1638 | # return rq.check_stamp_task(taskid) | 1628 | # return rqexe.rq.check_stamp_task(taskid) |
| 1639 | # return None | 1629 | # return None |
| 1640 | 1630 | ||
| 1641 | class runQueuePipe(): | 1631 | class runQueuePipe(): |
| @@ -1643,17 +1633,17 @@ class runQueuePipe(): | |||
| 1643 | Abstraction for a pipe between a worker thread and the server | 1633 | Abstraction for a pipe between a worker thread and the server |
| 1644 | """ | 1634 | """ |
| 1645 | def __init__(self, pipein, pipeout, d): | 1635 | def __init__(self, pipein, pipeout, d): |
| 1646 | self.fd = pipein | 1636 | self.input = pipein |
| 1647 | pipeout.close() | 1637 | pipeout.close() |
| 1648 | fcntl.fcntl(self.fd, fcntl.F_SETFL, fcntl.fcntl(self.fd, fcntl.F_GETFL) | os.O_NONBLOCK) | 1638 | fcntl.fcntl(self.input, fcntl.F_SETFL, fcntl.fcntl(self.input, fcntl.F_GETFL) | os.O_NONBLOCK) |
| 1649 | self.queue = "" | 1639 | self.queue = "" |
| 1650 | self.d = d | 1640 | self.d = d |
| 1651 | 1641 | ||
| 1652 | def read(self): | 1642 | def read(self): |
| 1653 | start = len(self.queue) | 1643 | start = len(self.queue) |
| 1654 | try: | 1644 | try: |
| 1655 | self.queue = self.queue + self.fd.read(1024) | 1645 | self.queue = self.queue + self.input.read(1024) |
| 1656 | except IOError: | 1646 | except (OSError, IOError): |
| 1657 | pass | 1647 | pass |
| 1658 | end = len(self.queue) | 1648 | end = len(self.queue) |
| 1659 | index = self.queue.find("</event>") | 1649 | index = self.queue.find("</event>") |
| @@ -1668,4 +1658,4 @@ class runQueuePipe(): | |||
| 1668 | continue | 1658 | continue |
| 1669 | if len(self.queue) > 0: | 1659 | if len(self.queue) > 0: |
| 1670 | print("Warning, worker left partial message: %s" % self.queue) | 1660 | print("Warning, worker left partial message: %s" % self.queue) |
| 1671 | self.fd.close() | 1661 | self.input.close() |
