[v3,5/7] InferiorThread.global_num
Commit Message
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-06 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-06 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-06 Pedro Alves <palves@redhat.com>
* python.texi (Breakpoints In Python) <Breakpoint.thread>: Add
anchor.
(Threads In Python): Document new InferiorThread.global_num
attribute.
---
gdb/NEWS | 7 ++++---
gdb/doc/python.texi | 7 +++++++
gdb/python/py-infthread.c | 14 ++++++++++++++
gdb/testsuite/gdb.multi/tids.exp | 19 ++++++++++++++++++-
gdb/testsuite/gdb.python/py-infthread.exp | 1 +
5 files changed, 44 insertions(+), 4 deletions(-)
Comments
On 16-01-06 08:03 AM, Pedro Alves wrote:
> 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-06 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-06 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-06 Pedro Alves <palves@redhat.com>
>
> * python.texi (Breakpoints In Python) <Breakpoint.thread>: Add
> anchor.
> (Threads In Python): Document new InferiorThread.global_num
> attribute.
> ---
> gdb/NEWS | 7 ++++---
> gdb/doc/python.texi | 7 +++++++
> gdb/python/py-infthread.c | 14 ++++++++++++++
> gdb/testsuite/gdb.multi/tids.exp | 19 ++++++++++++++++++-
> gdb/testsuite/gdb.python/py-infthread.exp | 1 +
> 5 files changed, 44 insertions(+), 4 deletions(-)
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 03944383..c87a73d 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -184,9 +184,10 @@ show remote exec-event-feature-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.
>
> diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
> index f9f9e5b..ffbf89a 100644
> --- a/gdb/doc/python.texi
> +++ b/gdb/doc/python.texi
> @@ -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
> diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c
> index a9dd5cb..3a9bae7 100644
> --- a/gdb/python/py-infthread.c
> +++ b/gdb/python/py-infthread.c
> @@ -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,
> diff --git a/gdb/testsuite/gdb.multi/tids.exp b/gdb/testsuite/gdb.multi/tids.exp
> index 7b51c80..12aca07 100644
> --- a/gdb/testsuite/gdb.multi/tids.exp
> +++ b/gdb/testsuite/gdb.multi/tids.exp
> @@ -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"
> }
> }
>
> diff --git a/gdb/testsuite/gdb.python/py-infthread.exp b/gdb/testsuite/gdb.python/py-infthread.exp
> index e07fd82..11f8d21 100644
> --- a/gdb/testsuite/gdb.python/py-infthread.exp
> +++ b/gdb/testsuite/gdb.python/py-infthread.exp
> @@ -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
>
LGTM.
@@ -184,9 +184,10 @@ show remote exec-event-feature-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.
@@ -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,
@@ -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