From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 71151 invoked by alias); 6 Jan 2016 13:03:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 70854 invoked by uid 89); 6 Jan 2016 13:03:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=no version=3.3.2 spammy=427, 42,7, 42,6, threadspecific X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 06 Jan 2016 13:03:45 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id EE06B8EFE6 for ; Wed, 6 Jan 2016 13:03:43 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u06D3cfO007715 for ; Wed, 6 Jan 2016 08:03:43 -0500 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH v3 5/7] InferiorThread.global_num Date: Wed, 06 Jan 2016 13:03:00 -0000 Message-Id: <1452085418-18300-6-git-send-email-palves@redhat.com> In-Reply-To: <1452085418-18300-1-git-send-email-palves@redhat.com> References: <1452085418-18300-1-git-send-email-palves@redhat.com> X-SW-Source: 2016-01/txt/msg00085.txt.bz2 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 * 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 * 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 * python.texi (Breakpoints In Python) : 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)" "\\" "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 -- 1.9.3