Re-acquire GIL earlier in gdbpy_parse_and_eval
Tom de Vries filed a bug about an intermittent gdb DAP failure -- and coincidentally, at the same time, Alexandra Hájková sent email about a somewhat similar failure. After looking into this for a while (with no results) using ASan and valgrind, I found that setting PYTHONMALLOC=malloc_debug found the bug instantly. The problem is that gdbpy_parse_and_eval releases the GIL while calling parse_and_eval, but fails to re-acquire it before calling value_to_value_object. This is easily fixed by introducing a new scope. I wonder whether the test suite should unconditionally set PYTHONMALLOC=malloc_debug. Tested-by: Tom de Vries <tdevries@suse.de> Reviewed-By: Tom de Vries <tdevries@suse.de> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30686
This commit is contained in:
parent
95b83567a4
commit
0c8a0b88d1
1 changed files with 10 additions and 2 deletions
|
@ -994,9 +994,17 @@ gdbpy_parse_and_eval (PyObject *self, PyObject *args, PyObject *kw)
|
|||
PyObject *result = nullptr;
|
||||
try
|
||||
{
|
||||
gdbpy_allow_threads allow_threads;
|
||||
scoped_value_mark free_values;
|
||||
struct value *val = parse_and_eval (expr_str, flags);
|
||||
struct value *val;
|
||||
{
|
||||
/* Allow other Python threads to run while we're evaluating
|
||||
the expression. This is important because the expression
|
||||
could involve inferior calls or otherwise be a lengthy
|
||||
calculation. We take care here to re-acquire the GIL here
|
||||
before continuing with Python work. */
|
||||
gdbpy_allow_threads allow_threads;
|
||||
val = parse_and_eval (expr_str, flags);
|
||||
}
|
||||
result = value_to_value_object (val);
|
||||
}
|
||||
catch (const gdb_exception &except)
|
||||
|
|
Loading…
Add table
Reference in a new issue