mirror of
https://git.yoctoproject.org/poky
synced 2026-02-20 08:29:42 +01:00
qemurunner: configurable timeout for run_serial()
Some commands might need to run longer than the default timeout of
five seconds. If that occurred, run_serial() returned with a status
code of zero (sic!) and no other indication of what went wrong.
Now the timeout is configurable (with five still the default) and
an explicit warning ("<<< run_serial(): command timed out after 5 seconds without output >>>")
gets appended at the end of the data returned to the caller.
While at it, the logic for checking for the timeout was updated a bit
because both implementations could overshoot the timeout when entering
select() right before the final deadline.
(From OE-Core rev: accf0362f964cc9d6330b6e52e83d748d890521f)
Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
1e3f04f86a
commit
58e6e7c204
@@ -206,8 +206,8 @@ class QemuTarget(BaseTarget):
|
||||
else:
|
||||
raise bb.build.FuncFailed("%s - FAILED to re-start qemu - check the task log and the boot log" % self.pn)
|
||||
|
||||
def run_serial(self, command):
|
||||
return self.runner.run_serial(command)
|
||||
def run_serial(self, command, timeout=5):
|
||||
return self.runner.run_serial(command, timeout=timeout)
|
||||
|
||||
|
||||
class SimpleRemoteTarget(BaseTarget):
|
||||
|
||||
@@ -416,7 +416,7 @@ class QemuRunner:
|
||||
if "qemu-system" in basecmd and "-serial tcp" in commands[p]:
|
||||
return [int(p),commands[p]]
|
||||
|
||||
def run_serial(self, command, raw=False):
|
||||
def run_serial(self, command, raw=False, timeout=5):
|
||||
# We assume target system have echo to get command status
|
||||
if not raw:
|
||||
command = "%s; echo $?\n" % command
|
||||
@@ -424,20 +424,23 @@ class QemuRunner:
|
||||
data = ''
|
||||
status = 0
|
||||
self.server_socket.sendall(command.encode('utf-8'))
|
||||
keepreading = True
|
||||
while keepreading:
|
||||
sread, _, _ = select.select([self.server_socket],[],[],5)
|
||||
start = time.time()
|
||||
end = start + timeout
|
||||
while True:
|
||||
now = time.time()
|
||||
if now >= end:
|
||||
data += "<<< run_serial(): command timed out after %d seconds without output >>>\r\n\r\n" % timeout
|
||||
break
|
||||
sread, _, _ = select.select([self.server_socket],[],[], end - now)
|
||||
if sread:
|
||||
answer = self.server_socket.recv(1024)
|
||||
if answer:
|
||||
data += answer.decode('utf-8')
|
||||
# Search the prompt to stop
|
||||
if re.search("[a-zA-Z0-9]+@[a-zA-Z0-9\-]+:~#", data):
|
||||
keepreading = False
|
||||
break
|
||||
else:
|
||||
raise Exception("No data on serial console socket")
|
||||
else:
|
||||
keepreading = False
|
||||
|
||||
if data:
|
||||
if raw:
|
||||
|
||||
@@ -107,14 +107,14 @@ class QemuTinyRunner(QemuRunner):
|
||||
|
||||
return self.is_alive()
|
||||
|
||||
def run_serial(self, command):
|
||||
def run_serial(self, command, timeout=5):
|
||||
self.server_socket.sendall(command+'\n')
|
||||
data = ''
|
||||
status = 0
|
||||
stopread = False
|
||||
endtime = time.time()+5
|
||||
endtime = time.time()+timeout
|
||||
while time.time()<endtime and not stopread:
|
||||
sread, _, _ = select.select([self.server_socket],[],[],5)
|
||||
sread, _, _ = select.select([self.server_socket],[],[],1)
|
||||
for sock in sread:
|
||||
answer = sock.recv(1024)
|
||||
if answer:
|
||||
@@ -124,6 +124,8 @@ class QemuTinyRunner(QemuRunner):
|
||||
stopread = True
|
||||
if not data:
|
||||
status = 1
|
||||
if not stopread:
|
||||
data += "<<< run_serial(): command timed out after %d seconds without output >>>\r\n\r\n" % timeout
|
||||
return (status, str(data))
|
||||
|
||||
def find_child(self,parent_pid):
|
||||
|
||||
Reference in New Issue
Block a user