-/* Copyright (C) 2009-2012 Free Software Foundation, Inc.
+/* Copyright (C) 2009-2020 Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
+#include "defs.h"
#include "py-event.h"
+#include "infrun.h"
+#include "gdbthread.h"
-/* thread events can either be thread specific or process wide. If gdb is
- running in non-stop mode then the event is thread specific, otherwise
- it is process wide.
- This function returns the currently stopped thread in non-stop mode and
- Py_None otherwise. */
+/* See py-event.h. */
-static PyObject *
-get_event_thread (void)
+gdbpy_ref<>
+py_get_event_thread (ptid_t ptid)
{
- PyObject *thread = NULL;
-
if (non_stop)
- thread = (PyObject *) find_thread_object (inferior_ptid);
- else
- thread = Py_None;
-
- if (!thread)
{
+ thread_info *thread
+ = find_thread_ptid (current_inferior ()->process_target (),
+ ptid);
+ if (thread != nullptr)
+ return thread_to_thread_object (thread);
PyErr_SetString (PyExc_RuntimeError, "Could not find event thread");
return NULL;
}
-
- Py_INCREF (thread);
-
- return thread;
+ return gdbpy_ref<>::new_reference (Py_None);
}
-PyObject *
-create_thread_event_object (PyTypeObject *py_type)
+gdbpy_ref<>
+create_thread_event_object (PyTypeObject *py_type, PyObject *thread)
{
- PyObject *thread = NULL;
- PyObject *thread_event_obj = NULL;
+ gdb_assert (thread != NULL);
- thread_event_obj = create_event_object (py_type);
- if (!thread_event_obj)
- goto fail;
+ gdbpy_ref<> thread_event_obj = create_event_object (py_type);
+ if (thread_event_obj == NULL)
+ return NULL;
- thread = get_event_thread ();
- if (!thread)
- goto fail;
-
- if (evpy_add_attribute (thread_event_obj,
+ if (evpy_add_attribute (thread_event_obj.get (),
"inferior_thread",
thread) < 0)
- goto fail;
+ return NULL;
return thread_event_obj;
-
- fail:
- Py_XDECREF (thread_event_obj);
- return NULL;
}
-
-GDBPY_NEW_EVENT_TYPE (thread,
- "gdb.ThreadEvent",
- "ThreadEvent",
- "GDB thread event object",
- event_object_type,
- /*no qual*/);