diff options
author | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:35:26 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:35:26 +0000 |
commit | c906108c21474dfb4ed285bcc0ac6fe02cd400cc (patch) | |
tree | a0015aa5cedc19ccbab307251353a41722a3ae13 /gdb/testsuite/gdb.threads/step.c | |
parent | cd946cff9ede3f30935803403f06f6ed30cad136 (diff) | |
download | gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.zip gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.tar.gz gdb-c906108c21474dfb4ed285bcc0ac6fe02cd400cc.tar.bz2 |
Initial creation of sourceware repositorygdb-4_18-branchpoint
Diffstat (limited to 'gdb/testsuite/gdb.threads/step.c')
-rw-r--r-- | gdb/testsuite/gdb.threads/step.c | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.threads/step.c b/gdb/testsuite/gdb.threads/step.c new file mode 100644 index 0000000..1b18a4b --- /dev/null +++ b/gdb/testsuite/gdb.threads/step.c @@ -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); +} |