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 <randy.e.witt@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Randy Witt
2015-08-26 00:15:15 -07:00
committed by Richard Purdie
parent 778fc612cb
commit 315fb4c9e2

View File

@@ -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: