diff options
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 12 | ||||
| -rw-r--r-- | bitbake/lib/bb/server/process.py | 11 | ||||
| -rw-r--r-- | bitbake/lib/bb/server/xmlrpc.py | 26 |
3 files changed, 28 insertions, 21 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 075c84985a..197308fd9d 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -895,6 +895,14 @@ class RunQueue: | |||
| 895 | if self.fakeworkerpipe: | 895 | if self.fakeworkerpipe: |
| 896 | self.fakeworkerpipe.read() | 896 | self.fakeworkerpipe.read() |
| 897 | 897 | ||
| 898 | def active_fds(self): | ||
| 899 | fds = [] | ||
| 900 | if self.workerpipe: | ||
| 901 | fds.append(self.workerpipe.input) | ||
| 902 | if self.fakeworkerpipe: | ||
| 903 | fds.append(self.fakeworkerpipe.input) | ||
| 904 | return fds | ||
| 905 | |||
| 898 | def check_stamp_task(self, task, taskname = None, recurse = False, cache = None): | 906 | def check_stamp_task(self, task, taskname = None, recurse = False, cache = None): |
| 899 | def get_timestamp(f): | 907 | def get_timestamp(f): |
| 900 | try: | 908 | try: |
| @@ -972,7 +980,7 @@ class RunQueue: | |||
| 972 | (if the abort on failure configuration option isn't set) | 980 | (if the abort on failure configuration option isn't set) |
| 973 | """ | 981 | """ |
| 974 | 982 | ||
| 975 | retval = 0.5 | 983 | retval = True |
| 976 | 984 | ||
| 977 | if self.state is runQueuePrepare: | 985 | if self.state is runQueuePrepare: |
| 978 | self.rqexe = RunQueueExecuteDummy(self) | 986 | self.rqexe = RunQueueExecuteDummy(self) |
| @@ -1375,7 +1383,7 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
| 1375 | 1383 | ||
| 1376 | if self.stats.active > 0: | 1384 | if self.stats.active > 0: |
| 1377 | self.rq.read_workers() | 1385 | self.rq.read_workers() |
| 1378 | return 0.5 | 1386 | return self.rq.active_fds() |
| 1379 | 1387 | ||
| 1380 | if len(self.failed_fnids) != 0: | 1388 | if len(self.failed_fnids) != 0: |
| 1381 | self.rq.state = runQueueFailed | 1389 | self.rq.state = runQueueFailed |
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index e2cec49b74..c0af052ebd 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
| @@ -29,6 +29,7 @@ import os | |||
| 29 | import signal | 29 | import signal |
| 30 | import sys | 30 | import sys |
| 31 | import time | 31 | import time |
| 32 | import select | ||
| 32 | from Queue import Empty | 33 | from Queue import Empty |
| 33 | from multiprocessing import Event, Process, util, Queue, Pipe, queues | 34 | from multiprocessing import Event, Process, util, Queue, Pipe, queues |
| 34 | 35 | ||
| @@ -105,7 +106,7 @@ class ProcessServer(Process, BaseImplServer): | |||
| 105 | command = self.command_channel.recv() | 106 | command = self.command_channel.recv() |
| 106 | self.runCommand(command) | 107 | self.runCommand(command) |
| 107 | 108 | ||
| 108 | self.idle_commands(.1) | 109 | self.idle_commands(.1, [self.event_queue._reader, self.command_channel]) |
| 109 | except Exception: | 110 | except Exception: |
| 110 | logger.exception('Running command %s', command) | 111 | logger.exception('Running command %s', command) |
| 111 | 112 | ||
| @@ -115,7 +116,7 @@ class ProcessServer(Process, BaseImplServer): | |||
| 115 | self.cooker.stop() | 116 | self.cooker.stop() |
| 116 | self.idle_commands(.1) | 117 | self.idle_commands(.1) |
| 117 | 118 | ||
| 118 | def idle_commands(self, delay): | 119 | def idle_commands(self, delay, fds = []): |
| 119 | nextsleep = delay | 120 | nextsleep = delay |
| 120 | 121 | ||
| 121 | for function, data in self._idlefuns.items(): | 122 | for function, data in self._idlefuns.items(): |
| @@ -127,15 +128,15 @@ class ProcessServer(Process, BaseImplServer): | |||
| 127 | nextsleep = None | 128 | nextsleep = None |
| 128 | elif nextsleep is None: | 129 | elif nextsleep is None: |
| 129 | continue | 130 | continue |
| 130 | elif retval < nextsleep: | 131 | else: |
| 131 | nextsleep = retval | 132 | fds = fds + retval |
| 132 | except SystemExit: | 133 | except SystemExit: |
| 133 | raise | 134 | raise |
| 134 | except Exception: | 135 | except Exception: |
| 135 | logger.exception('Running idle function') | 136 | logger.exception('Running idle function') |
| 136 | 137 | ||
| 137 | if nextsleep is not None: | 138 | if nextsleep is not None: |
| 138 | time.sleep(nextsleep) | 139 | select.select(fds,[],[],nextsleep) |
| 139 | 140 | ||
| 140 | def runCommand(self, command): | 141 | def runCommand(self, command): |
| 141 | """ | 142 | """ |
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py index 641e15e833..cca569d0e9 100644 --- a/bitbake/lib/bb/server/xmlrpc.py +++ b/bitbake/lib/bb/server/xmlrpc.py | |||
| @@ -264,12 +264,9 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
| 264 | Serve Requests. Overloaded to honor a quit command | 264 | Serve Requests. Overloaded to honor a quit command |
| 265 | """ | 265 | """ |
| 266 | self.quit = False | 266 | self.quit = False |
| 267 | self.timeout = 0 # Run Idle calls for our first callback | ||
| 268 | while not self.quit: | 267 | while not self.quit: |
| 269 | #print "Idle queue length %s" % len(self._idlefuns) | 268 | fds = [self] |
| 270 | self.handle_request() | 269 | nextsleep = 0.1 |
| 271 | #print "Idle timeout, running idle functions" | ||
| 272 | nextsleep = None | ||
| 273 | for function, data in self._idlefuns.items(): | 270 | for function, data in self._idlefuns.items(): |
| 274 | try: | 271 | try: |
| 275 | retval = function(self, data, False) | 272 | retval = function(self, data, False) |
| @@ -277,21 +274,22 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
| 277 | del self._idlefuns[function] | 274 | del self._idlefuns[function] |
| 278 | elif retval is True: | 275 | elif retval is True: |
| 279 | nextsleep = 0 | 276 | nextsleep = 0 |
| 280 | elif nextsleep is 0: | 277 | else: |
| 281 | continue | 278 | fds = fds + retval |
| 282 | elif nextsleep is None: | ||
| 283 | nextsleep = retval | ||
| 284 | elif retval < nextsleep: | ||
| 285 | nextsleep = retval | ||
| 286 | except SystemExit: | 279 | except SystemExit: |
| 287 | raise | 280 | raise |
| 288 | except: | 281 | except: |
| 289 | import traceback | 282 | import traceback |
| 290 | traceback.print_exc() | 283 | traceback.print_exc() |
| 291 | pass | 284 | pass |
| 292 | if nextsleep is None and len(self._idlefuns) > 0: | 285 | |
| 293 | nextsleep = 0 | 286 | socktimeout = self.socket.gettimeout() or nextsleep |
| 294 | self.timeout = nextsleep | 287 | socktimeout = min(socktimeout, nextsleep) |
| 288 | # Mirror what BaseServer handle_request would do | ||
| 289 | fd_sets = select.select(fds, [], [], socktimeout) | ||
| 290 | if fd_sets[0] and self in fd_sets[0]: | ||
| 291 | self._handle_request_noblock() | ||
| 292 | |||
| 295 | # Tell idle functions we're exiting | 293 | # Tell idle functions we're exiting |
| 296 | for function, data in self._idlefuns.items(): | 294 | for function, data in self._idlefuns.items(): |
| 297 | try: | 295 | try: |
