From patchwork Wed Nov 25 21:48:58 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 9826 Received: (qmail 36387 invoked by alias); 25 Nov 2015 21:49:32 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 36318 invoked by uid 89); 25 Nov 2015 21:49:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: usevmg20.ericsson.net Received: from usevmg20.ericsson.net (HELO usevmg20.ericsson.net) (198.24.6.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Wed, 25 Nov 2015 21:49:26 +0000 Received: from EUSAAHC007.ericsson.se (Unknown_Domain [147.117.188.93]) by usevmg20.ericsson.net (Symantec Mail Security) with SMTP id C0.B3.03778.BFAD5565; Wed, 25 Nov 2015 16:59:55 +0100 (CET) Received: from elxcz23q12-y4.dyn.mo.ca.am.ericsson.se (147.117.188.8) by smtps-am.internal.ericsson.com (147.117.188.93) with Microsoft SMTP Server (TLS) id 14.3.248.2; Wed, 25 Nov 2015 16:49:11 -0500 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH v2 3/3] Add test for thread names Date: Wed, 25 Nov 2015 16:48:58 -0500 Message-ID: <1448488138-2360-4-git-send-email-simon.marchi@ericsson.com> In-Reply-To: <1448488138-2360-1-git-send-email-simon.marchi@ericsson.com> References: <1448488138-2360-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 X-IsSubscribed: yes I couldn't find a test that verified the thread name functionality, so I created a new one. A target board can define gdb,no_thread_names if it doesn't support thread names and wants to skip the tests that uses them. This test has been made with Linux in mind. Not all platforms use pthread_setname_np to set the thread name, but some #ifdefs can be added later in order to support other platforms. Tested on x86-64 Ubuntu 14.04, native and remote. gdb/testsuite/ChangeLog: * gdb.threads/names.exp: New file. * gdb.threads/names.c: New file. * README: Mention gdb,no_thread_names. --- gdb/testsuite/README | 3 ++ gdb/testsuite/gdb.threads/names.c | 80 +++++++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.threads/names.exp | 38 ++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 gdb/testsuite/gdb.threads/names.c create mode 100644 gdb/testsuite/gdb.threads/names.exp diff --git a/gdb/testsuite/README b/gdb/testsuite/README index 70f65cd..77ac74e 100644 --- a/gdb/testsuite/README +++ b/gdb/testsuite/README @@ -369,6 +369,9 @@ gdb,predefined_tsv The predefined trace state variables the board has. +gdb,no_thread_names + + The target doesn't support thread names. Testsuite Organization ********************** diff --git a/gdb/testsuite/gdb.threads/names.c b/gdb/testsuite/gdb.threads/names.c new file mode 100644 index 0000000..6b08ff7 --- /dev/null +++ b/gdb/testsuite/gdb.threads/names.c @@ -0,0 +1,80 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2015 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include +#include +#include + +#define NUM_THREADS 3 + +struct thread_data +{ + const char *name; + pthread_barrier_t *barrier; +}; + +static void * +thread_func (void *varg) +{ + struct thread_data *arg = (struct thread_data *) varg; + + pthread_setname_np (pthread_self (), arg->name); + + pthread_barrier_wait (arg->barrier); + + while (1) + sleep (1); +} + +static void +all_threads_ready (void) +{ +} + +int +main (int argc, char **argv) +{ + pthread_t threads[NUM_THREADS]; + struct thread_data args[NUM_THREADS]; + pthread_barrier_t barrier; + int i; + const char *names[] = { "carrot", "potato", "celery" }; + + /* Make sure that NAMES contains NUM_THREADS elements. */ + assert (sizeof (names) == sizeof(names[0]) * NUM_THREADS); + + assert (0 == pthread_barrier_init (&barrier, NULL, NUM_THREADS + 1)); + + pthread_setname_np (pthread_self (), "main"); + + for (i = 0; i < NUM_THREADS; i++) + { + struct thread_data *arg = &args[i]; + + arg->name = names[i]; + arg->barrier = &barrier; + + assert (0 == pthread_create (&threads[i], NULL, thread_func, arg)); + } + + pthread_barrier_wait (&barrier); + + all_threads_ready (); + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/names.exp b/gdb/testsuite/gdb.threads/names.exp new file mode 100644 index 0000000..b056df3 --- /dev/null +++ b/gdb/testsuite/gdb.threads/names.exp @@ -0,0 +1,38 @@ +# Copyright (C) 2015 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Verify that thread name features work properly (e.g. they show up in info +# threads). + +if [target_info exists gdb,no_thread_names] { + continue +} + +standard_testfile + +if [prepare_for_testing "failed to prepare" $testfile $srcfile {debug pthreads}] { + return -1 +} + +if ![runto "all_threads_ready"] { + continue +} + +set expected_thread_list "\\* 1 .*\"main\" all_threads_ready.*\n" +append expected_thread_list " 2 .*\"carrot\".*\n" +append expected_thread_list " 3 .*\"potato\".*\n" +append expected_thread_list " 4 .*\"celery\".*" + +gdb_test "info threads" "$expected_thread_list" "list threads"