* gdb.threads: New directory with some crude multi-threaded
authorJeff Law <law@redhat.com>
Wed, 26 Jul 1995 00:35:07 +0000 (00:35 +0000)
committerJeff Law <law@redhat.com>
Wed, 26 Jul 1995 00:35:07 +0000 (00:35 +0000)
        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
gdb/testsuite/config/mt-lynx
gdb/testsuite/gdb.threads/configure.in [new file with mode: 0644]
gdb/testsuite/gdb.threads/step.c [new file with mode: 0644]

index 887815f10eca67340c678bba7dae06d120844a81..6d0295898265f361ed8706a45c57d3afb6465d29 100644 (file)
@@ -40,6 +40,7 @@ gdb.c++
 gdb.disasm
 gdb.fortran
 gdb.stabs
+gdb.threads
 lib
 
 Things-to-lose:
index f88f2085c276093641261916b1c367deb92b64c6..1c153af7f82ca3e71ffc80f8024ebfb5da6860fd 100644 (file)
@@ -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 (file)
index 0000000..07619ad
--- /dev/null
@@ -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 (file)
index 0000000..1b18a4b
--- /dev/null
@@ -0,0 +1,221 @@
+/*    step.c for step.exp    */
+#include <ipc.h>
+#include <pthread.h>
+#include <st.h>
+#include <signal.h>
+#include <stdio.h>
+
+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);
+}