diff options
| -rw-r--r-- | bitbake/lib/bb/server/process.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 475931a728..d4beac4379 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
| @@ -48,7 +48,7 @@ class ProcessServer(multiprocessing.Process): | |||
| 48 | 48 | ||
| 49 | self.event_handle = None | 49 | self.event_handle = None |
| 50 | self.haveui = False | 50 | self.haveui = False |
| 51 | self.lastui = False | 51 | self.maxuiwait = 30 |
| 52 | self.xmlrpc = False | 52 | self.xmlrpc = False |
| 53 | 53 | ||
| 54 | self._idlefuns = {} | 54 | self._idlefuns = {} |
| @@ -155,6 +155,7 @@ class ProcessServer(multiprocessing.Process): | |||
| 155 | print("No timeout, exiting.") | 155 | print("No timeout, exiting.") |
| 156 | self.quit = True | 156 | self.quit = True |
| 157 | 157 | ||
| 158 | self.lastui = time.time() | ||
| 158 | while not self.quit: | 159 | while not self.quit: |
| 159 | if self.sock in ready: | 160 | if self.sock in ready: |
| 160 | while select.select([self.sock],[],[],0)[0]: | 161 | while select.select([self.sock],[],[],0)[0]: |
| @@ -191,11 +192,18 @@ class ProcessServer(multiprocessing.Process): | |||
| 191 | except (EOFError, OSError): | 192 | except (EOFError, OSError): |
| 192 | disconnect_client(self, fds) | 193 | disconnect_client(self, fds) |
| 193 | 194 | ||
| 194 | if not self.timeout == -1.0 and not self.haveui and self.lastui and self.timeout and \ | 195 | if not self.timeout == -1.0 and not self.haveui and self.timeout and \ |
| 195 | (self.lastui + self.timeout) < time.time(): | 196 | (self.lastui + self.timeout) < time.time(): |
| 196 | print("Server timeout, exiting.") | 197 | print("Server timeout, exiting.") |
| 197 | self.quit = True | 198 | self.quit = True |
| 198 | 199 | ||
| 200 | # If we don't see a UI connection within maxuiwait, its unlikely we're going to see | ||
| 201 | # one. We have had issue with processes hanging indefinitely so timing out UI-less | ||
| 202 | # servers is useful. | ||
| 203 | if not self.haveui and not self.timeout and (self.lastui + self.maxuiwait) < time.time(): | ||
| 204 | print("No UI connection within max timeout, exiting to avoid infinite loop.") | ||
| 205 | self.quit = True | ||
| 206 | |||
| 199 | if self.command_channel in ready: | 207 | if self.command_channel in ready: |
| 200 | try: | 208 | try: |
| 201 | command = self.command_channel.get() | 209 | command = self.command_channel.get() |
| @@ -220,10 +228,13 @@ class ProcessServer(multiprocessing.Process): | |||
| 220 | 228 | ||
| 221 | print("Exiting") | 229 | print("Exiting") |
| 222 | # Remove the socket file so we don't get any more connections to avoid races | 230 | # Remove the socket file so we don't get any more connections to avoid races |
| 223 | os.unlink(self.sockname) | 231 | try: |
| 232 | os.unlink(self.sockname) | ||
| 233 | except: | ||
| 234 | pass | ||
| 224 | self.sock.close() | 235 | self.sock.close() |
| 225 | 236 | ||
| 226 | try: | 237 | try: |
| 227 | self.cooker.shutdown(True) | 238 | self.cooker.shutdown(True) |
| 228 | self.cooker.notifier.stop() | 239 | self.cooker.notifier.stop() |
| 229 | self.cooker.confignotifier.stop() | 240 | self.cooker.confignotifier.stop() |
