summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandy Witt <randy.e.witt@linux.intel.com>2015-08-26 00:15:15 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-08-26 08:23:41 +0100
commit2f5cbfee0ab1189fbb83f0e785d79c8d123fccc2 (patch)
tree956c2a07c3b72c1ed4dedddb2bd9c7e8599ec9ff
parentf59c875fea839052b5bdd950cb74e0c60a0ba946 (diff)
downloadopenembedded-core-2f5cbfee0ab1189fbb83f0e785d79c8d123fccc2.tar.gz
openembedded-core-2f5cbfee0ab1189fbb83f0e785d79c8d123fccc2.tar.bz2
openembedded-core-2f5cbfee0ab1189fbb83f0e785d79c8d123fccc2.zip
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. Signed-off-by: Randy Witt <randy.e.witt@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/lib/oeqa/utils/qemurunner.py29
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: