public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Tom de Vries <tdevries@suse.de>
To: Tom Tromey <tromey@adacore.com>
Cc: Tom Tromey via Gdb-patches <gdb-patches@sourceware.org>
Subject: [PATCH] [gdb/python] Avoid queue.SimpleQueue for python 3.6
Date: Thu, 5 Jan 2023 10:49:05 +0100	[thread overview]
Message-ID: <a4acfae5-f73a-5db8-909e-28ec15a2acb3@suse.de> (raw)
In-Reply-To: <0b6635ea-ee55-1edd-6f4b-149a3ab200f5@suse.de>

[-- Attachment #1: Type: text/plain, Size: 2414 bytes --]

[ was: Re: [PATCH] Initial implementation of Debugger Adapter Protocol ]

On 1/4/23 13:27, Tom de Vries wrote:
> On 1/4/23 12:59, Tom de Vries via Gdb-patches wrote:
>> On 1/3/23 15:14, Tom Tromey wrote:
>>> Tom> /home/vries/gdb_versions/devel/src/gdb/python/py-dap.c: In member
>>> Tom> function ‘virtual void dap_interp::init(bool)’:
>>> Tom> /home/vries/gdb_versions/devel/src/gdb/python/py-dap.c:83:27: 
>>> error:
>>> Tom> ‘PyObject_CallNoArgs’ was not declared in this scope
>>> Tom>    gdbpy_ref<> result_obj (PyObject_CallNoArgs (func.get ()));
>>> Tom>                            ^~~~~~~~~~~~~~~~~~~
>>> Tom> /home/vries/gdb_versions/devel/src/gdb/python/py-dap.c:83:27: note:
>>> Tom> suggested alternative: ‘_PyObject_CallNoArg’
>>> Tom>    gdbpy_ref<> result_obj (PyObject_CallNoArgs (func.get ()));
>>> Tom>                            ^~~~~~~~~~~~~~~~~~~
>>> Tom>                            _PyObject_CallNoArg
>>> Tom> ...
>>>
>>> Sorry about that.  I'm going to apply the appended, which should fix the
>>> problem.
>>
>> That fixed the build problem, thanks for that.
>>
>> Now I'm running into an error in the testsuite:
>> ...
>> 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
>> ...
> 
> Hmm, that seems to be because:
> ...
> (gdb)
> #5  0x0000000000a59a7c in gdbpy_handle_exception ()
>      at /home/vries/gdb_versions/devel/src/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'"
> ...
> 
> That's new in python 3.7, and I have:
> ...
> $ ldd ./gdb | grep python
>          libpython3.6m.so.1.0 => /usr/lib64/libpython3.6m.so.1.0 
> (0x00007f93ed624000)
> ...

Fixed by attached commit, any comments?

Thanks,
- Tom

[-- Attachment #2: 0001-gdb-python-Avoid-queue.SimpleQueue-for-python-3.6.patch --]
[-- Type: text/x-patch, Size: 3006 bytes --]

From 2704ba927c369d834d8b88adb136e323f3c2036d Mon Sep 17 00:00:00 2001
From: Tom de Vries <tdevries@suse.de>
Date: Thu, 5 Jan 2023 10:34:58 +0100
Subject: [PATCH] [gdb/python] Avoid queue.SimpleQueue for python 3.6

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  | 6 +++++-
 gdb/python/lib/gdb/dap/startup.py | 6 +++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py
index d6fc0bd5754..f8cb6170a96 100644
--- a/gdb/python/lib/gdb/dap/server.py
+++ b/gdb/python/lib/gdb/dap/server.py
@@ -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
diff --git a/gdb/python/lib/gdb/dap/startup.py b/gdb/python/lib/gdb/dap/startup.py
index acfdcb4d81b..523705a5933 100644
--- a/gdb/python/lib/gdb/dap/startup.py
+++ b/gdb/python/lib/gdb/dap/startup.py
@@ -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:

base-commit: b26c8438c71d44427fc9c7ef6fa2ab1742d220a9
-- 
2.35.3


  reply	other threads:[~2023-01-05  9:49 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-01 16:30 [PATCH] Initial implementation of Debugger Adapter Protocol Tom Tromey
2022-09-01 16:38 ` Eli Zaretskii
2022-09-12 19:54 ` Tom Tromey
2022-09-13  2:26   ` Eli Zaretskii
2022-10-06 14:27   ` Tom Tromey
2023-01-02 16:54     ` Tom Tromey
2023-01-03  8:04       ` Tom de Vries
2023-01-03 14:14         ` Tom Tromey
2023-01-04 11:59           ` Tom de Vries
2023-01-04 12:27             ` Tom de Vries
2023-01-05  9:49               ` Tom de Vries [this message]
2023-01-05 15:19                 ` [PATCH] [gdb/python] Avoid queue.SimpleQueue for python 3.6 Tom Tromey
2023-01-05 16:34                   ` Tom de Vries
2023-01-05 17:07                     ` Tom Tromey
2023-01-05 11:35 ` [PATCH] Initial implementation of Debugger Adapter Protocol Tom de Vries
2023-01-05 15:24   ` Tom Tromey
2023-01-05 16:17     ` Tom de Vries
2023-01-06 14:12       ` Tom de Vries

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a4acfae5-f73a-5db8-909e-28ec15a2acb3@suse.de \
    --to=tdevries@suse.de \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@adacore.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).