diff options
-rw-r--r-- | meta/lib/oeqa/utils/qemurunner.py | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index d079072af8..6d36df6953 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py @@ -412,12 +412,33 @@ class LoggingThread(threading.Thread): # Actual data to be logged elif self.readsock.fileno() == event[0]: - data = self.readsock.recv(1024) - if not data: - raise Exception("No data on read ready socket") - + data = self.recv_loop() self.logfunc(data) + # Since the socket is non-blocking make sure to honor EAGAIN + # and EWOULDBLOCK + def recv_loop(self): + while True: + try: + data = self.readsock.recv(1024) + break + except socket.error as e: + if e.errno == errno.EAGAIN or e.errno == errno.EWOULDBLOCK: + continue + else: + raise + + if not data: + raise Exception("No data on read ready socket") + elif data == 0: + # This actually means an orderly shutdown + # happened. But for this code it counts as an + # error since the connection shouldn't go away + # until qemu exits. + raise Exception("Console connection closed unexpectedly") + + return data + def stringify_event(self, event): val = '' if select.POLLERR == event: |