From f27ffb51f544e79fe110af75c84879bae35c5096 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 26 Jul 1995 00:35:07 +0000 Subject: [PATCH] * gdb.threads: New directory with some crude multi-threaded gdb tests (step.exp and step2.exp). * config/mt-lynx (STEP_EXECUTABLE): Define. (THREADFLAGS): Define. Hiro's test for 6100 and a crude test of my own. They both need some major cleanup for non-lynx hosts; both are also a little too loose in their checks. But I'm too burnt out on lynx to address either concern. --- gdb/testsuite/.Sanitize | 1 + gdb/testsuite/config/mt-lynx | 3 + gdb/testsuite/gdb.threads/configure.in | 32 ++++ gdb/testsuite/gdb.threads/step.c | 221 +++++++++++++++++++++++++ 4 files changed, 257 insertions(+) create mode 100644 gdb/testsuite/gdb.threads/configure.in create mode 100644 gdb/testsuite/gdb.threads/step.c diff --git a/gdb/testsuite/.Sanitize b/gdb/testsuite/.Sanitize index 887815f10ec..6d029589826 100644 --- a/gdb/testsuite/.Sanitize +++ b/gdb/testsuite/.Sanitize @@ -40,6 +40,7 @@ gdb.c++ gdb.disasm gdb.fortran gdb.stabs +gdb.threads lib Things-to-lose: diff --git a/gdb/testsuite/config/mt-lynx b/gdb/testsuite/config/mt-lynx index f88f2085c27..1c153af7f82 100644 --- a/gdb/testsuite/config/mt-lynx +++ b/gdb/testsuite/config/mt-lynx @@ -1 +1,4 @@ CFLAGS_FOR_TARGET = +STEP_EXECUTABLE = step +THREADFLAGS = -mposix -mthreads +#LDFLAGS= -L/usr/cygnus/progressive-95q1/H-sparc-sun-sunos4.1.3/i386-lynx/lib/thread diff --git a/gdb/testsuite/gdb.threads/configure.in b/gdb/testsuite/gdb.threads/configure.in new file mode 100644 index 00000000000..07619ad4d21 --- /dev/null +++ b/gdb/testsuite/gdb.threads/configure.in @@ -0,0 +1,32 @@ +# This file is a shell script fragment that supplies the information +# necessary to tailor a template configure script into the configure +# script appropriate for this directory. For more information, check +# any existing configure script. + +srctrigger="Makefile.in" +srcname="gdb.threads" + +# per-host: + +# per-target: + + # everything defaults to unix for a target +target_abbrev=unix +target_makefile_frag=../config/mt-unix + + # this section is for all targets +case "${target}" in + hppa*-*-hpux*) target_makefile_frag=../config/mt-hpux ;; + i[345]86-*-aout) target_makefile_frag=../config/mt-i386-aout ;; + *-*-lynx*) target_makefile_frag=../config/mt-lynx ;; + *-*-netware*) target_makefile_frag=../config/mt-netware ;; + *-*-vxworks*) target_makefile_frag=../config/mt-vxworks ;; + m68k-*-*) target_makefile_frag=../config/mt-m68k ;; + i960-*-nindy) target_makefile_frag=../config/mt-i960-nindy ;; + a29k-*-udi) target_makefile_frag=../config/mt-a29k-udi ;; + sparclite-*-*) target_makefile_frag=../config/mt-slite ;; + sparc-*-aout) target_makefile_frag=../config/mt-sparc-aout ;; + mips-*-ecoff) target_makefile_frag=../config/mt-mips-ecoff ;; +esac + +# post-target: diff --git a/gdb/testsuite/gdb.threads/step.c b/gdb/testsuite/gdb.threads/step.c new file mode 100644 index 00000000000..1b18a4b07ad --- /dev/null +++ b/gdb/testsuite/gdb.threads/step.c @@ -0,0 +1,221 @@ +/* step.c for step.exp */ +#include +#include +#include +#include +#include + +void alarm_handler (); +void alarm_handler1 (); +void alarm_handler2 (); +void thread1 (); +void thread2 (); + +#define TIME_LIMIT 30 + + +int count1 = 0; +int count2 = 0; + +pthread_t tid1, tid2; +pthread_attr_t attr1, attr2; + +pthread_mutex_t mut; +pthread_mutexattr_t mut_attr; + +pthread_condattr_t cv_attr_a, cv_attr_b; +pthread_cond_t cv_a, cv_b; + +struct cv_struct + { + char a; + char b; + } +test_struct; + +main () +{ + /*init la struct */ + test_struct.a = 0; + test_struct.b = 1; + + /* create le mutex */ + if (pthread_mutexattr_create (&mut_attr) == -1) + { + perror ("mutexattr_create"); + exit (1); + } + + + if (pthread_mutex_init (&mut, mut_attr) == -1) + { + perror ("mutex_init"); + exit (1); + } + + /* create 2 cv */ + if (pthread_condattr_create (&cv_attr_a) == -1) + { + perror ("condattr_create(1)"); + exit (1); + } + + if (pthread_cond_init (&cv_a, cv_attr_a) == -1) + { + perror ("cond_init(1)"); + exit (1); + } + + if (pthread_condattr_create (&cv_attr_b) == -1) + { + perror ("condattr_create(2)"); + exit (1); + } + + if (pthread_cond_init (&cv_b, cv_attr_b) == -1) + { + perror ("cond_init(2)"); + exit (1); + } + + /* create 2 threads of execution */ + if (pthread_attr_create (&attr1) == -1) + { + perror ("attr_create(1)"); + exit (1); + } + + if (pthread_create (&tid1, attr1, thread1, &count1) == -1) + { + perror ("pthread_create(1)"); + exit (1); + } + + if (pthread_attr_create (&attr2) == -1) + { + perror ("attr_create(2)"); + exit (1); + } + + if (pthread_create (&tid2, attr2, thread2, &count2) == -1) + { + perror ("pthread_create(2)"); + exit (1); + } + + /* set alarm to print out data and exit */ + signal (SIGALRM, alarm_handler); + alarm (TIME_LIMIT); + + for (;;) + pause (); +} + +void +thread1 (count) + int *count; +{ + tid_t tid; + + tid = getstid (); + printf ("Thread1 tid 0x%x (%d) \n", tid, tid); + printf ("Thread1 @tid=0x%x \n", &tid); + signal (SIGALRM, alarm_handler1); + + for (;;) + { + if (pthread_mutex_lock (&mut) == -1) + { + perror ("pthread_mutex_lock(1)"); + pthread_exit ((void *) 0); + } + + while (test_struct.a == 0) + { + if (pthread_cond_wait (&cv_a, &mut) == -1) + { + perror ("pthread_cond_wait(1)"); + pthread_exit ((void *) -1); + } + } + + (*count)++; + printf ("*******thread1 count %d\n", *count); + + test_struct.a = 0; + + test_struct.b = 1; + pthread_cond_signal (&cv_b); + + if (pthread_mutex_unlock (&mut) == -1) + { + perror ("pthread_mutex_unlock(1)"); + pthread_exit ((void *) -1); + } + } +} + +void +thread2 (count) + int *count; +{ + tid_t tid; + + tid = getstid (); + printf ("Thread2 tid 0x%x (%d) \n", tid, tid); + printf ("Thread1 @tid=0x%x \n", &tid); + signal (SIGALRM, alarm_handler2); + + for (;;) + { + if (pthread_mutex_lock (&mut) == -1) + { + perror ("pthread_mutex_lock(2)"); + pthread_exit ((void *) 0); + } + + while (test_struct.b == 0) + { + if (pthread_cond_wait (&cv_b, &mut) == -1) + { + perror ("pthread_cond_wait(2)"); + pthread_exit ((void *) -1); + } + } + + (*count)++; + printf ("*******thread2 count %d\n", *count); + + test_struct.b = 0; + + test_struct.a = 1; + pthread_cond_signal (&cv_a); + + if (pthread_mutex_unlock (&mut) == -1) + { + perror ("pthread_mutex_unlock(2)"); + pthread_exit ((void *) -1); + } + } +} + + +void +alarm_handler () +{ + printf ("\tcount1 (%d) \n\tcount2 (%d)\n", count1, count2); + exit (0); +} + +void +alarm_handler1 () +{ + printf ("ALARM thread 1\n"); +} + +void +alarm_handler2 () +{ + printf ("ALARM thread 2\n"); + pthread_exit ((void *) 0); +} -- 2.30.2