From 754eadd19fceada3873d39edc914c0b63578c000 Mon Sep 17 00:00:00 2001 From: Phil Muldoon Date: Mon, 11 Jul 2011 12:10:19 +0000 Subject: [PATCH] 2011-07-11 Phil Muldoon * python/py-inferior.c (infpy_dealloc): New function. (inferior_to_inferior_object): Return a new object, or a new reference to the existing object. (find_thread_object): Cleanup references to inferior. (delete_thread_object): Ditto. * python/py-infthread.c (create_thread_object): Do not increment inferior reference count. --- gdb/ChangeLog | 10 +++++++ gdb/python/py-inferior.c | 59 +++++++++++++++++++++++++++++++-------- gdb/python/py-infthread.c | 1 - 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3ba20a6bec2..7d4b1a84c70 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2011-07-11 Phil Muldoon + + * python/py-inferior.c (infpy_dealloc): New function. + (inferior_to_inferior_object): Return a new object, or a + new reference to the existing object. + (find_thread_object): Cleanup references to inferior. + (delete_thread_object): Ditto. + * python/py-infthread.c (create_thread_object): Do not increment + inferior reference count. + 2011-07-08 Tom Tromey * dwarf2loc.c (locexpr_regname): New function. diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index f2265014d05..ab9ee8ed8a6 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -125,9 +125,10 @@ python_inferior_exit (struct inferior *inf) do_cleanups (cleanup); } -/* Return a borrowed reference to the Python object of type Inferior +/* Return a reference to the Python object of type Inferior representing INFERIOR. If the object has already been created, - return it, otherwise, create it. Return NULL on failure. */ + return it and increment the reference count, otherwise, create it. + Return NULL on failure. */ PyObject * inferior_to_inferior_object (struct inferior *inferior) { @@ -154,13 +155,14 @@ inferior_to_inferior_object (struct inferior *inferior) do_cleanups (cleanup); } + else + Py_INCREF ((PyObject *)inf_obj); return (PyObject *) inf_obj; } /* Finds the Python Inferior object for the given PID. Returns a - borrowed reference, or NULL if PID does not match any inferior - object. */ + reference, or NULL if PID does not match any inferior object. */ PyObject * find_inferior_object (int pid) @@ -180,6 +182,7 @@ find_thread_object (ptid_t ptid) int pid; struct threadlist_entry *thread; PyObject *inf_obj; + thread_object *found = NULL; pid = PIDGET (ptid); if (pid == 0) @@ -187,11 +190,21 @@ find_thread_object (ptid_t ptid) inf_obj = find_inferior_object (pid); - if (inf_obj) - for (thread = ((inferior_object *)inf_obj)->threads; thread; - thread = thread->next) - if (ptid_equal (thread->thread_obj->thread->ptid, ptid)) - return thread->thread_obj; + if (! inf_obj) + return NULL; + + for (thread = ((inferior_object *)inf_obj)->threads; thread; + thread = thread->next) + if (ptid_equal (thread->thread_obj->thread->ptid, ptid)) + { + found = thread->thread_obj; + break; + } + + Py_DECREF (inf_obj); + + if (found) + return found; return NULL; } @@ -245,7 +258,10 @@ delete_thread_object (struct thread_info *tp, int ignore) break; if (!*entry) - return; + { + Py_DECREF (inf_obj); + return; + } cleanup = ensure_python_env (python_gdbarch, python_language); @@ -256,6 +272,7 @@ delete_thread_object (struct thread_info *tp, int ignore) inf_obj->nthreads--; Py_DECREF (tmp->thread_obj); + Py_DECREF (inf_obj); xfree (tmp); do_cleanups (cleanup); @@ -321,8 +338,15 @@ build_inferior_list (struct inferior *inf, void *arg) { PyObject *list = arg; PyObject *inferior = inferior_to_inferior_object (inf); + int success = 0; + + if (! inferior) + return 0; + + success = PyList_Append (list, inferior); + Py_DECREF (inferior); - if (PyList_Append (list, inferior)) + if (success) return 1; return 0; @@ -617,6 +641,17 @@ infpy_is_valid (PyObject *self, PyObject *args) Py_RETURN_TRUE; } +static void +infpy_dealloc (PyObject *obj) +{ + inferior_object *inf_obj = (inferior_object *) obj; + struct inferior *inf = inf_obj->inferior; + + if (! inf) + return; + + set_inferior_data (inf, infpy_inf_data_key, NULL); +} /* Clear the INFERIOR pointer in an Inferior object and clear the thread list. */ @@ -714,7 +749,7 @@ static PyTypeObject inferior_object_type = "gdb.Inferior", /* tp_name */ sizeof (inferior_object), /* tp_basicsize */ 0, /* tp_itemsize */ - 0, /* tp_dealloc */ + infpy_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c index b37c53ca83c..cb714c7a484 100644 --- a/gdb/python/py-infthread.c +++ b/gdb/python/py-infthread.c @@ -49,7 +49,6 @@ create_thread_object (struct thread_info *tp) thread_obj->thread = tp; thread_obj->inf_obj = find_inferior_object (PIDGET (tp->ptid)); - Py_INCREF (thread_obj->inf_obj); return thread_obj; } -- 2.30.2