[gdb/python] Avoid queue.SimpleQueue for python 3.6
authorTom de Vries <tdevries@suse.de>
Thu, 5 Jan 2023 16:35:41 +0000 (17:35 +0100)
committerTom de Vries <tdevries@suse.de>
Thu, 5 Jan 2023 16:35:41 +0000 (17:35 +0100)
On openSUSE Leap 15.4 with python 3.6, the gdb.dap/basic-dap.exp test-case
fails as follows:
...
ERROR: eof reading json header
    while executing
"error "eof reading json header""
    invoked from within
"expect {
-i exp19 -timeout 10
        -re "^Content-Length: (\[0-9\]+)\r\n" {
            set length $expect_out(1,string)
            exp_continue
        }
        -re "^(\[^\r\n\]+)..."
    ("uplevel" body line 1)
    invoked from within
"uplevel $body" NONE eof reading json header
UNRESOLVED: gdb.dap/basic-dap.exp: startup - initialize
...

Investigation using a "catch throw" shows that:
...
(gdb)
    at gdb/python/py-utils.c:396
396             error (_("Error occurred in Python: %s"), msg.get ());
(gdb) p msg.get ()
$1 = 0x2b91d10 "module 'queue' has no attribute 'SimpleQueue'"
...

The python class queue.SimpleQueue was introduced in python 3.7.

Fix this by falling back to queue.Queue for python <= 3.6.

Tested on x86_64-linux, by successfully running the test-case:
...
 # of expected passes            47
...

gdb/python/lib/gdb/dap/server.py
gdb/python/lib/gdb/dap/startup.py

index d6fc0bd5754094c7cda2fd330a0f84ac63096039..f8cb6170a9692bce605f22f5f9265be00817d757 100644 (file)
@@ -15,6 +15,7 @@
 
 import json
 import queue
+import sys
 
 from .io import start_json_writer, read_json
 from .startup import (
@@ -47,7 +48,10 @@ class Server:
         # This queue accepts JSON objects that are then sent to the
         # DAP client.  Writing is done in a separate thread to avoid
         # blocking the read loop.
-        self.write_queue = queue.SimpleQueue()
+        if sys.version_info[0] == 3 and sys.version_info[1] <= 6:
+            self.write_queue = queue.Queue()
+        else:
+            self.write_queue = queue.SimpleQueue()
         self.done = False
         global _server
         _server = self
index acfdcb4d81be368b6dd467529d473ed2e54fe4c2..523705a59337cc5e2cf0763090d72755f26c690d 100644 (file)
@@ -22,6 +22,7 @@ import signal
 import threading
 import traceback
 from contextlib import contextmanager
+import sys
 
 
 # The GDB thread, aka the main thread.
@@ -173,7 +174,10 @@ def send_gdb_with_response(fn):
     """
     if isinstance(fn, str):
         fn = Invoker(fn)
-    result_q = queue.SimpleQueue()
+    if sys.version_info[0] == 3 and sys.version_info[1] <= 6:
+        result_q = queue.Queue()
+    else:
+        result_q = queue.SimpleQueue()
 
     def message():
         try: