Add Python InferiorThread.global_num attribute
This commit adds a new Python InferiorThread.global_num attribute. This can be used to pass the correct thread ID to Breakpoint.thread, which takes a global thread ID, not a per-inferior thread number. gdb/ChangeLog: 2016-01-13 Pedro Alves <palves@redhat.com> * NEWS: Mention InferiorThread.global_num. * python/py-infthread.c (thpy_get_global_num): New function. (thread_object_getset): Register "global_num". gdb/testsuite/ChangeLog: 2016-01-13 Pedro Alves <palves@redhat.com> * gdb.multi/tids.exp: Test InferiorThread.global_num and Breakpoint.thread. * gdb.python/py-infthread.exp: Test InferiorThread.global_num. gdb/doc/ChangeLog: 2016-01-13 Pedro Alves <palves@redhat.com> * python.texi (Breakpoints In Python) <Breakpoint.thread>: Add anchor. (Threads In Python): Document new InferiorThread.global_num attribute.
This commit is contained in:
parent
5d5658a1d3
commit
22a0232400
8 changed files with 63 additions and 4 deletions
|
@ -1,3 +1,9 @@
|
|||
2016-01-13 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* NEWS: Mention InferiorThread.global_num.
|
||||
* python/py-infthread.c (thpy_get_global_num): New function.
|
||||
(thread_object_getset): Register "global_num".
|
||||
|
||||
2016-01-13 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* NEWS: Mention that thread IDs are now per inferior and global
|
||||
|
|
7
gdb/NEWS
7
gdb/NEWS
|
@ -208,9 +208,10 @@ show remote catch-syscall-packet
|
|||
|
||||
* Python Scripting
|
||||
|
||||
** The "num" attribute of gdb.InferiorThread objects now refers to
|
||||
the thread's per-inferior number. See "Per-inferior thread
|
||||
numbers" above.
|
||||
** gdb.InferiorThread objects have a new attribute "global_num",
|
||||
which refers to the thread's global thread ID. The existing
|
||||
"num" attribute now refers to the thread's per-inferior number.
|
||||
See "Per-inferior thread numbers" above.
|
||||
** gdb.InferiorThread objects have a new attribute "inferior", which
|
||||
is the Inferior object the thread belongs to.
|
||||
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2016-01-13 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* python.texi (Breakpoints In Python) <Breakpoint.thread>: Add
|
||||
anchor.
|
||||
(Threads In Python): Document new InferiorThread.global_num
|
||||
attribute.
|
||||
|
||||
2016-01-07 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdb.texinfo (Threads): Document per-inferior thread IDs,
|
||||
|
|
|
@ -2998,6 +2998,12 @@ user-specified thread name.
|
|||
The per-inferior number of the thread, as assigned by GDB.
|
||||
@end defvar
|
||||
|
||||
@defvar InferiorThread.global_num
|
||||
The global ID of the thread, as assigned by GDB. You can use this to
|
||||
make Python breakpoints thread-specific, for example
|
||||
(@pxref{python_breakpoint_thread,,The Breakpoint.thread attribute}).
|
||||
@end defvar
|
||||
|
||||
@defvar InferiorThread.ptid
|
||||
ID of the thread, as assigned by the operating system. This attribute is a
|
||||
tuple containing three integers. The first is the Process ID (PID); the second
|
||||
|
@ -4642,6 +4648,7 @@ first command is @code{silent}. This is not reported by the
|
|||
@code{silent} attribute.
|
||||
@end defvar
|
||||
|
||||
@anchor{python_breakpoint_thread}
|
||||
@defvar Breakpoint.thread
|
||||
If the breakpoint is thread-specific, this attribute holds the
|
||||
thread's global id. If the breakpoint is not thread-specific, this
|
||||
|
|
|
@ -127,6 +127,18 @@ thpy_get_num (PyObject *self, void *closure)
|
|||
return PyLong_FromLong (thread_obj->thread->per_inf_num);
|
||||
}
|
||||
|
||||
/* Getter for InferiorThread.global_num. */
|
||||
|
||||
static PyObject *
|
||||
thpy_get_global_num (PyObject *self, void *closure)
|
||||
{
|
||||
thread_object *thread_obj = (thread_object *) self;
|
||||
|
||||
THPY_REQUIRE_VALID (thread_obj);
|
||||
|
||||
return PyLong_FromLong (thread_obj->thread->global_num);
|
||||
}
|
||||
|
||||
/* Getter for InferiorThread.ptid -> (pid, lwp, tid).
|
||||
Returns a tuple with the thread's ptid components. */
|
||||
|
||||
|
@ -298,6 +310,8 @@ static PyGetSetDef thread_object_getset[] =
|
|||
"The name of the thread, as set by the user or the OS.", NULL },
|
||||
{ "num", thpy_get_num, NULL,
|
||||
"Per-inferior number of the thread, as assigned by GDB.", NULL },
|
||||
{ "global_num", thpy_get_global_num, NULL,
|
||||
"Global number of the thread, as assigned by GDB.", NULL },
|
||||
{ "ptid", thpy_get_ptid, NULL, "ID of the thread, as assigned by the OS.",
|
||||
NULL },
|
||||
{ "inferior", thpy_get_inferior, NULL,
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2016-01-13 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdb.multi/tids.exp: Test InferiorThread.global_num and
|
||||
Breakpoint.thread.
|
||||
* gdb.python/py-infthread.exp: Test InferiorThread.global_num.
|
||||
|
||||
2016-01-07 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdb.base/break.exp: Adjust to output changes.
|
||||
|
|
|
@ -244,11 +244,28 @@ with_test_prefix "two inferiors" {
|
|||
|
||||
if { ![skip_python_tests] } {
|
||||
with_test_prefix "python" {
|
||||
# Check that InferiorThread.num returns the expected number.
|
||||
# Check that InferiorThread.num and InferiorThread.global_num
|
||||
# return the expected numbers.
|
||||
gdb_py_test_silent_cmd "python t0 = gdb.selected_thread ()" \
|
||||
"test gdb.selected_thread" 1
|
||||
gdb_test "python print ('result = %s' % t0.num)" " = 3" \
|
||||
"test InferiorThread.num"
|
||||
gdb_test "python print ('result = %s' % t0.global_num)" " = 6" \
|
||||
"test InferiorThread.global_num"
|
||||
|
||||
# Breakpoint.thread expects global IDs. Confirm that that
|
||||
# works as expected.
|
||||
delete_breakpoints
|
||||
gdb_breakpoint "thread_function1"
|
||||
|
||||
gdb_py_test_silent_cmd "python bp = gdb.breakpoints()\[0\]" \
|
||||
"get python breakpoint" 0
|
||||
gdb_test "python bp.thread = 6" "thread = 6" \
|
||||
"make breakpoint thread-specific with python"
|
||||
# Check that the inferior-qualified ID is correct.
|
||||
gdb_test "info breakpoint" \
|
||||
"stop only in thread 1.3\r\n.*" \
|
||||
"thread specific breakpoint right thread"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ if ![runto_main] then {
|
|||
gdb_py_test_silent_cmd "python t0 = gdb.selected_thread ()" "test gdb.selected_thread" 1
|
||||
gdb_test "python print (t0)" "\\<gdb.InferiorThread object at 0x\[\[:xdigit:\]\]+>" "verify InferiorThread object"
|
||||
gdb_test "python print ('result = %s' % t0.num)" " = 1" "test InferiorThread.num"
|
||||
gdb_test "python print ('result = %s' % t0.global_num)" " = 1" "test InferiorThread.global_num"
|
||||
gdb_test "python print ('result = %s' % str (t0.ptid))" " = \\(\[0-9\]+, \[0-9\]+, \[0-9\]+\\)" "test InferiorThread.ptid"
|
||||
|
||||
gdb_py_test_silent_cmd "python i0 = t0.inferior" "test InferiorThread.inferior" 1
|
||||
|
|
Loading…
Reference in a new issue