diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2015-11-26 09:49:04 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2015-11-26 13:09:30 -0500 |
commit | f6512a69cd414a31e302daf107f5959ef06bcbec (patch) | |
tree | 660e13b01bedee4dd619031427eaa5d66f5ff0f9 /gdb/testsuite/gdb.threads | |
parent | 79efa585c51f0657b319beb1e213d5721eaacdcc (diff) | |
download | gdb-f6512a69cd414a31e302daf107f5959ef06bcbec.zip gdb-f6512a69cd414a31e302daf107f5959ef06bcbec.tar.gz gdb-f6512a69cd414a31e302daf107f5959ef06bcbec.tar.bz2 |
Add test for thread names
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.
Diffstat (limited to 'gdb/testsuite/gdb.threads')
-rw-r--r-- | gdb/testsuite/gdb.threads/names.c | 97 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/names.exp | 38 |
2 files changed, 135 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.threads/names.c b/gdb/testsuite/gdb.threads/names.c new file mode 100644 index 0000000..37999fc --- /dev/null +++ b/gdb/testsuite/gdb.threads/names.c @@ -0,0 +1,97 @@ +/* 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 <http://www.gnu.org/licenses/>. */ + +#define _GNU_SOURCE +#include <unistd.h> +#include <stdlib.h> +#include <pthread.h> +#include <assert.h> + +#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; + int res; + + res = pthread_setname_np (pthread_self (), arg->name); + assert (res == 0); + + pthread_barrier_wait (arg->barrier); + + pthread_barrier_wait (arg->barrier); + + return NULL; +} + +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, res; + const char *names[] = { "carrot", "potato", "celery" }; + + alarm (20); + + /* Make sure that NAMES contains NUM_THREADS elements. */ + assert (sizeof (names) / sizeof (names[0]) == NUM_THREADS); + + res = pthread_barrier_init (&barrier, NULL, NUM_THREADS + 1); + assert (res == 0);; + + res = pthread_setname_np (pthread_self (), "main"); + assert (res == 0); + + for (i = 0; i < NUM_THREADS; i++) + { + struct thread_data *arg = &args[i]; + + arg->name = names[i]; + arg->barrier = &barrier; + + res = pthread_create (&threads[i], NULL, thread_func, arg); + assert (res == 0); + } + + pthread_barrier_wait (&barrier); + + all_threads_ready (); + + pthread_barrier_wait (&barrier); + + for (i = 0; i < NUM_THREADS; i++) + { + res = pthread_join (threads[i], NULL); + assert (res == 0); + } + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/names.exp b/gdb/testsuite/gdb.threads/names.exp new file mode 100644 index 0000000..f6bbdb4 --- /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 <http://www.gnu.org/licenses/>. + +# 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 +} + +gdb_test "info threads" \ + [multi_line "\\* 1 .*\"main\" all_threads_ready.*" \ + " 2 .*\"carrot\".*" \ + " 3 .*\"potato\".*" \ + " 4 .*\"celery\".*" ] \ + "list threads" |