diff options
| -rw-r--r-- | bitbake/lib/bb/event.py | 10 | ||||
| -rw-r--r-- | bitbake/lib/bb/server/process.py | 25 | ||||
| -rw-r--r-- | bitbake/lib/bb/ui/knotty.py | 1 | ||||
| -rw-r--r-- | bitbake/lib/bb/ui/toasterui.py | 3 |
4 files changed, 39 insertions, 0 deletions
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index 6f1cb101fc..cacbac8f56 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
| @@ -48,6 +48,16 @@ class Event(object): | |||
| 48 | def __init__(self): | 48 | def __init__(self): |
| 49 | self.pid = worker_pid | 49 | self.pid = worker_pid |
| 50 | 50 | ||
| 51 | |||
| 52 | class HeartbeatEvent(Event): | ||
| 53 | """Triggered at regular time intervals of 10 seconds. Other events can fire much more often | ||
| 54 | (runQueueTaskStarted when there are many short tasks) or not at all for long periods | ||
| 55 | of time (again runQueueTaskStarted, when there is just one long-running task), so this | ||
| 56 | event is more suitable for doing some task-independent work occassionally.""" | ||
| 57 | def __init__(self, time): | ||
| 58 | Event.__init__(self) | ||
| 59 | self.time = time | ||
| 60 | |||
| 51 | Registered = 10 | 61 | Registered = 10 |
| 52 | AlreadyRegistered = 14 | 62 | AlreadyRegistered = 14 |
| 53 | 63 | ||
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 982fcf71c3..1654faf92b 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
| @@ -92,6 +92,8 @@ class ProcessServer(Process, BaseImplServer): | |||
| 92 | self.event = EventAdapter(event_queue) | 92 | self.event = EventAdapter(event_queue) |
| 93 | self.featurelist = featurelist | 93 | self.featurelist = featurelist |
| 94 | self.quit = False | 94 | self.quit = False |
| 95 | self.heartbeat_seconds = 1 # default, BB_HEARTBEAT_EVENT will be checked once we have a datastore. | ||
| 96 | self.next_heartbeat = time.time() | ||
| 95 | 97 | ||
| 96 | self.quitin, self.quitout = Pipe() | 98 | self.quitin, self.quitout = Pipe() |
| 97 | self.event_handle = multiprocessing.Value("i") | 99 | self.event_handle = multiprocessing.Value("i") |
| @@ -101,6 +103,14 @@ class ProcessServer(Process, BaseImplServer): | |||
| 101 | self.event_queue.put(event) | 103 | self.event_queue.put(event) |
| 102 | self.event_handle.value = bb.event.register_UIHhandler(self, True) | 104 | self.event_handle.value = bb.event.register_UIHhandler(self, True) |
| 103 | 105 | ||
| 106 | heartbeat_event = self.cooker.data.getVar('BB_HEARTBEAT_EVENT', True) | ||
| 107 | if heartbeat_event: | ||
| 108 | try: | ||
| 109 | self.heartbeat_seconds = float(heartbeat_event) | ||
| 110 | except: | ||
| 111 | # Throwing an exception here causes bitbake to hang. | ||
| 112 | # Just warn about the invalid setting and continue | ||
| 113 | bb.warn('Ignoring invalid BB_HEARTBEAT_EVENT=%s, must be a float specifying seconds.' % heartbeat_event) | ||
| 104 | bb.cooker.server_main(self.cooker, self.main) | 114 | bb.cooker.server_main(self.cooker, self.main) |
| 105 | 115 | ||
| 106 | def main(self): | 116 | def main(self): |
| @@ -160,6 +170,21 @@ class ProcessServer(Process, BaseImplServer): | |||
| 160 | del self._idlefuns[function] | 170 | del self._idlefuns[function] |
| 161 | self.quit = True | 171 | self.quit = True |
| 162 | 172 | ||
| 173 | # Create new heartbeat event? | ||
| 174 | now = time.time() | ||
| 175 | if now >= self.next_heartbeat: | ||
| 176 | # We might have missed heartbeats. Just trigger once in | ||
| 177 | # that case and continue after the usual delay. | ||
| 178 | self.next_heartbeat += self.heartbeat_seconds | ||
| 179 | if self.next_heartbeat <= now: | ||
| 180 | self.next_heartbeat = now + self.heartbeat_seconds | ||
| 181 | heartbeat = bb.event.HeartbeatEvent(now) | ||
| 182 | bb.event.fire(heartbeat, self.cooker.data) | ||
| 183 | if nextsleep and now + nextsleep > self.next_heartbeat: | ||
| 184 | # Shorten timeout so that we we wake up in time for | ||
| 185 | # the heartbeat. | ||
| 186 | nextsleep = self.next_heartbeat - now | ||
| 187 | |||
| 163 | if nextsleep is not None: | 188 | if nextsleep is not None: |
| 164 | select.select(fds,[],[],nextsleep) | 189 | select.select(fds,[],[],nextsleep) |
| 165 | 190 | ||
diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index 948f52769d..48e1223c6b 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py | |||
| @@ -647,6 +647,7 @@ def main(server, eventHandler, params, tf = TerminalFilter): | |||
| 647 | bb.event.OperationCompleted, | 647 | bb.event.OperationCompleted, |
| 648 | bb.event.OperationProgress, | 648 | bb.event.OperationProgress, |
| 649 | bb.event.DiskFull, | 649 | bb.event.DiskFull, |
| 650 | bb.event.HeartbeatEvent, | ||
| 650 | bb.build.TaskProgress)): | 651 | bb.build.TaskProgress)): |
| 651 | continue | 652 | continue |
| 652 | 653 | ||
diff --git a/bitbake/lib/bb/ui/toasterui.py b/bitbake/lib/bb/ui/toasterui.py index b1b3684a82..17299026ab 100644 --- a/bitbake/lib/bb/ui/toasterui.py +++ b/bitbake/lib/bb/ui/toasterui.py | |||
| @@ -236,6 +236,9 @@ def main(server, eventHandler, params): | |||
| 236 | # pylint: disable=protected-access | 236 | # pylint: disable=protected-access |
| 237 | # the code will look into the protected variables of the event; no easy way around this | 237 | # the code will look into the protected variables of the event; no easy way around this |
| 238 | 238 | ||
| 239 | if isinstance(event, bb.event.HeartbeatEvent): | ||
| 240 | continue | ||
| 241 | |||
| 239 | if isinstance(event, bb.event.ParseStarted): | 242 | if isinstance(event, bb.event.ParseStarted): |
| 240 | if not (build_log and build_log_file_path): | 243 | if not (build_log and build_log_file_path): |
| 241 | build_log, build_log_file_path = _open_build_log(log_dir) | 244 | build_log, build_log_file_path = _open_build_log(log_dir) |
