]> code.ossystems Code Review - openembedded-core.git/commitdiff
qemurunner: In the logging thread retry on EAGAIN, EWOULDBLOCK
authorRandy Witt <randy.e.witt@linux.intel.com>
Wed, 26 Aug 2015 07:15:15 +0000 (00:15 -0700)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 26 Aug 2015 07:23:41 +0000 (08:23 +0100)
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>
meta/lib/oeqa/utils/qemurunner.py

index d079072af800d5e42d7cb10383f6cd07f9a78a75..6d36df69535d2797bf65e1611b708b917cd476dd 100644 (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: