From 315fb4c9e275dcaeab325b9c7647ffe2d262949e Mon Sep 17 00:00:00 2001 From: Randy Witt Date: Wed, 26 Aug 2015 00:15:15 -0700 Subject: qemurunner: In the logging thread retry on EAGAIN, EWOULDBLOCK On a nonblocking socket an exception can be generated for the EAGAIN and EWOULDBLOCK errnos. Since these aren't actually errors make sure to retry rather than bailing out. (From OE-Core rev: 2f5cbfee0ab1189fbb83f0e785d79c8d123fccc2) Signed-off-by: Randy Witt Signed-off-by: Richard Purdie --- meta/lib/oeqa/utils/qemurunner.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'meta/lib/oeqa/utils/qemurunner.py') 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: -- cgit v1.2.3-54-g00ecf