diff --git a/lib/setupmanagers/qemuhck/qmp.rb b/lib/setupmanagers/qemuhck/qmp.rb index 9b2781fe..6a2c47b0 100644 --- a/lib/setupmanagers/qemuhck/qmp.rb +++ b/lib/setupmanagers/qemuhck/qmp.rb @@ -44,6 +44,11 @@ def wait_for(name, accepted, timeout = 60) cached = find_cached_event(name, accepted) return cached if cached + run_cmd('query-status') + + cached = find_cached_event(name, accepted) + return cached if cached + wait_for_new_event(name, accepted, timeout) end @@ -57,12 +62,19 @@ def find_cached_event(name, accepted) def wait_for_new_event(name, accepted, timeout) Timeout.timeout(timeout) do loop do - response = JSON.parse(@socket_internal.readline) - @logger.debug("Received QMP message: #{response}") - return response if accepted.include?(response[name]) + if @socket_internal.wait_readable(2) + response = JSON.parse(@socket_internal.readline) + @logger.debug("Received QMP message: #{response}") + return response if accepted.include?(response[name]) + + @events << response if response.key?('event') + raise(QMPError, response['error'].to_s) if response.key?('error') + else + run_cmd('query-status') - @events << response if response.key?('event') - raise(QMPError, response['error'].to_s) if response.key?('error') + cached = find_cached_event(name, accepted) + return cached if cached + end end end end