* 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.
This commit is contained in:
parent
80ac01168f
commit
f27ffb51f5
|
@ -40,6 +40,7 @@ gdb.c++
|
|||
gdb.disasm
|
||||
gdb.fortran
|
||||
gdb.stabs
|
||||
gdb.threads
|
||||
lib
|
||||
|
||||
Things-to-lose:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue