diff options
Diffstat (limited to 'bitbake/lib/bb/server/process.py')
| -rw-r--r-- | bitbake/lib/bb/server/process.py | 25 |
1 files changed, 25 insertions, 0 deletions
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 | ||
