diff options
author | Fred Fish <fnf@specifix.com> | 1996-08-19 17:59:46 +0000 |
---|---|---|
committer | Fred Fish <fnf@specifix.com> | 1996-08-19 17:59:46 +0000 |
commit | 6f5fbad32862b11c76cf6b40f4b40abc35d99342 (patch) | |
tree | 9161024ad998434e1508c23a4b938ceadb60b928 /gdb/testsuite/gdb.threads | |
parent | 9099ec8fb4c0b45cbaafc4043d05e7369bbeed0e (diff) | |
download | gdb-6f5fbad32862b11c76cf6b40f4b40abc35d99342.zip gdb-6f5fbad32862b11c76cf6b40f4b40abc35d99342.tar.gz gdb-6f5fbad32862b11c76cf6b40f4b40abc35d99342.tar.bz2 |
* gdb.threads/pthreads.c (PTHREAD_CREATE_ARG2,
PTHREAD_CREATE_NULL_ARG2): Accomodate old pthreads implementations.
* gdb.threads/pthreads.exp: Try linking with both -lpthread (Solaris)
and -lpthreads (everybody else).
(test_startup): Fail gracefully if threads are not supported.
* gdb.base/nodebug.exp: Add setup_xfail hppa*-*-hpux* for
"p/c array_index("abcdef",2)" when not gcc compiled.
* gdb.base/corefile.exp: Add setup_xfail hppa*-*-hpux* for
"print func2::coremaker_local" when not gcc compiled.
* gdb.base/opaque.exp: Remove setup_xfail hppa*-*-hpux* for
"ptype on opaque struct tagname (statically)",
"ptype on opaque struct tagname (dynamically) 1", and
"ptype on opaque struct tagname (dynamically) 2"
for not compiled with gcc.
* gdb.base/mips_pro.exp: Only do setup_xfail hppa*-*-* for
backtrace when compiled with gcc.
* lib/gdb.exp (runto_main): Return result of "runto main" rather
than always return success.
Diffstat (limited to 'gdb/testsuite/gdb.threads')
-rw-r--r-- | gdb/testsuite/gdb.threads/pthreads.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.threads/pthreads.c b/gdb/testsuite/gdb.threads/pthreads.c new file mode 100644 index 0000000..9e55996 --- /dev/null +++ b/gdb/testsuite/gdb.threads/pthreads.c @@ -0,0 +1,164 @@ +#include <stdio.h> + +#include "config.h" + +#ifndef HAVE_PTHREAD_H + +/* Don't even try to compile. In fact, cause a syntax error that we can + look for as a compiler error message and know that we have no pthread + support. In that case we can just suppress the test completely. */ + +#error "no posix threads support" + +#else + +/* OK. We have the right header. If we try to compile this and fail, then + there is something wrong and the user should know about it so the testsuite + should issue an ERROR result.. */ + +#include <pthread.h> + +/* Under OSF, the second arg of pthread_create is prototyped to be just + a "pthread_attr_t", while under Solaris it is a "pthread_attr_t *". + Arg! */ + +#ifdef __osf__ +#define PTHREAD_CREATE_ARG2(arg) arg +#define PTHREAD_CREATE_NULL_ARG2 null_attr +static pthread_attr_t null_attr; +#else +#define PTHREAD_CREATE_ARG2(arg) &arg +#define PTHREAD_CREATE_NULL_ARG2 NULL +#endif + +static int verbose = 0; + +static void +common_routine (arg) + int arg; +{ + static int from_thread1; + static int from_thread2; + static int from_main; + static int hits; + static int full_coverage; + + if (verbose) printf("common_routine (%d)\n", arg); + hits++; + switch (arg) + { + case 0: + from_main++; + break; + case 1: + from_thread1++; + break; + case 2: + from_thread2++; + break; + } + if (from_main && from_thread1 && from_thread2) + full_coverage = 1; +} + +static void * +thread1 (void *arg) +{ + int i; + int z = 0; + + if (verbose) printf ("thread1 (%0x) ; pid = %d\n", arg, getpid ()); + for (i=1; i <= 10000000; i++) + { + if (verbose) printf("thread1 %d\n", pthread_self ()); + z += i; + common_routine (1); + sleep(1); + } +} + +static void * +thread2 (void * arg) +{ + int i; + int k = 0; + + if (verbose) printf ("thread2 (%0x) ; pid = %d\n", arg, getpid ()); + for (i=1; i <= 10000000; i++) + { + if (verbose) printf("thread2 %d\n", pthread_self ()); + k += i; + common_routine (2); + sleep(1); + } + sleep(100); +} + +int +foo (a, b, c) + int a, b, c; +{ + int d, e, f; + + if (verbose) printf("a=%d\n", a); +} + +main(argc, argv) + int argc; + char **argv; +{ + pthread_t tid1, tid2; + int j; + int t = 0; + void (*xxx) (); + pthread_attr_t attr; + + if (verbose) printf ("pid = %d\n", getpid()); + + foo (1, 2, 3); + +#ifndef __osf__ + if (pthread_attr_init (&attr)) + { + perror ("pthread_attr_init 1"); + exit (1); + } +#endif + +#ifdef PTHREAD_SCOPE_SYSTEM + if (pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM)) + { + perror ("pthread_attr_setscope 1"); + exit (1); + } +#endif + + if (pthread_create (&tid1, PTHREAD_CREATE_ARG2(attr), thread1, (void *) 0xfeedface)) + { + perror ("pthread_create 1"); + exit (1); + } + if (verbose) printf ("Made thread %d\n", tid1); + sleep (1); + + if (pthread_create (&tid2, PTHREAD_CREATE_NULL_ARG2, thread2, (void *) 0xdeadbeef)) + { + perror ("pthread_create 2"); + exit (1); + } + if (verbose) printf("Made thread %d\n", tid2); + + sleep (1); + + for (j = 1; j <= 10000000; j++) + { + if (verbose) printf("top %d\n", pthread_self ()); + common_routine (0); + sleep(1); + t += j; + } + + exit(0); +} + +#endif /* ifndef HAVE_PTHREAD_H */ |