Index: lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py +++ lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py @@ -78,6 +78,7 @@ self.setUpBaseLogging() self._remote_server_log_file = None self.debug_monitor_extra_args = [] + self._pump_queues = socket_packet_pump.PumpQueues() if self.isVerboseLoggingRequested(): # If requested, full logs go to a log file @@ -109,6 +110,8 @@ self.stub_hostname = "localhost" def tearDown(self): + self._pump_queues.verify_queues_empty() + if self._remote_server_log_file is not None: lldb.remote_platform.Get(lldb.SBFileSpec(self._remote_server_log_file), lldb.SBFileSpec(self.getLocalServerLogFile())) @@ -629,7 +632,8 @@ def expect_gdbremote_sequence(self, timeout_seconds=None): if not timeout_seconds: timeout_seconds = self._TIMEOUT_SECONDS - return expect_lldb_gdbserver_replay(self, self.sock, self.test_sequence, timeout_seconds, self.logger) + return expect_lldb_gdbserver_replay(self, self.sock, self.test_sequence, + self._pump_queues, timeout_seconds, self.logger) _KNOWN_REGINFO_KEYS = [ "name", Index: lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py +++ lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py @@ -154,6 +154,7 @@ asserter, sock, test_sequence, + pump_queues, timeout_seconds, logger=None): """Replay socket communication with lldb-gdbserver and verify responses. @@ -193,7 +194,7 @@ return {} context = {"O_count":0, "O_content":""} - with socket_packet_pump.SocketPacketPump(sock, logger) as pump: + with socket_packet_pump.SocketPacketPump(sock, pump_queues, logger) as pump: # Grab the first sequence entry. sequence_entry = test_sequence.entries.pop(0) @@ -220,14 +221,14 @@ if sequence_entry.is_output_matcher(): try: # Grab next entry from the output queue. - content = pump.output_queue().get(True, timeout_seconds) + content = pump_queues.output_queue().get(True, timeout_seconds) except queue.Empty: if logger: logger.warning("timeout waiting for stub output (accumulated output:{})".format(pump.get_accumulated_output())) raise Exception("timed out while waiting for output match (accumulated output: {})".format(pump.get_accumulated_output())) else: try: - content = pump.packet_queue().get(True, timeout_seconds) + content = pump_queues.packet_queue().get(True, timeout_seconds) except queue.Empty: if logger: logger.warning("timeout waiting for packet match (receive buffer: {})".format(pump.get_receive_buffer())) Index: lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/socket_packet_pump.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/socket_packet_pump.py +++ lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-server/socket_packet_pump.py @@ -26,6 +26,33 @@ print(codecs.encode(the_queue.get(True), "string_escape")) print("\n") +class PumpQueues(object): + def __init__(self): + self._output_queue = queue.Queue() + self._packet_queue = queue.Queue() + + def output_queue(self): + return self._output_queue + + def packet_queue(self): + return self._packet_queue + + def verify_queues_empty(self): + # Warn if there is any content left in any of the queues. + # That would represent unmatched packets. + if not self.output_queue().empty(): + print("warning: output queue entries still exist:") + _dump_queue(self.output_queue()) + print("from here:") + traceback.print_stack() + + if not self.packet_queue().empty(): + print("warning: packet queue entries still exist:") + _dump_queue(self.packet_queue()) + print("from here:") + traceback.print_stack() + + class SocketPacketPump(object): """A threaded packet reader that partitions packets into two streams. @@ -40,18 +67,17 @@ _GDB_REMOTE_PACKET_REGEX = re.compile(r'^\$([^\#]*)#[0-9a-fA-F]{2}') - def __init__(self, pump_socket, logger=None): + def __init__(self, pump_socket, pump_queues, logger=None): if not pump_socket: raise Exception("pump_socket cannot be None") - self._output_queue = queue.Queue() - self._packet_queue = queue.Queue() self._thread = None self._stop_thread = False self._socket = pump_socket self._logger = logger self._receive_buffer = "" self._accumulated_output = "" + self._pump_queues = pump_queues def __enter__(self): """Support the python 'with' statement. @@ -66,20 +92,6 @@ Shut down the pump thread.""" self.stop_pump_thread() - # Warn if there is any content left in any of the queues. - # That would represent unmatched packets. - if not self.output_queue().empty(): - print("warning: output queue entries still exist:") - _dump_queue(self.output_queue()) - print("from here:") - traceback.print_stack() - - if not self.packet_queue().empty(): - print("warning: packet queue entries still exist:") - _dump_queue(self.packet_queue()) - print("from here:") - traceback.print_stack() - def start_pump_thread(self): if self._thread: raise Exception("pump thread is already running") @@ -92,12 +104,6 @@ if self._thread: self._thread.join() - def output_queue(self): - return self._output_queue - - def packet_queue(self): - return self._packet_queue - def _process_new_bytes(self, new_bytes): if not new_bytes: return @@ -114,7 +120,7 @@ has_more = False # handle '+' ack elif self._receive_buffer[0] == "+": - self._packet_queue.put("+") + self._pump_queues.packet_queue().put("+") self._receive_buffer = self._receive_buffer[1:] if self._logger: self._logger.debug( @@ -132,10 +138,10 @@ if new_output_content: # This was an $O packet with new content. self._accumulated_output += new_output_content - self._output_queue.put(self._accumulated_output) + self._pump_queues.output_queue().put(self._accumulated_output) else: # Any packet other than $O. - self._packet_queue.put(packet_match.group(0)) + self._pump_queues.packet_queue().put(packet_match.group(0)) # Remove the parsed packet from the receive # buffer.