xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.threads/step.c (revision e93f7393d476ad1c5192174ea92f14ecc97182e7)
1*e93f7393Sniklas /*    step.c for step.exp    */
2*e93f7393Sniklas #include <ipc.h>
3*e93f7393Sniklas #include <pthread.h>
4*e93f7393Sniklas #include <st.h>
5*e93f7393Sniklas #include <signal.h>
6*e93f7393Sniklas #include <stdio.h>
7*e93f7393Sniklas 
8*e93f7393Sniklas void alarm_handler ();
9*e93f7393Sniklas void alarm_handler1 ();
10*e93f7393Sniklas void alarm_handler2 ();
11*e93f7393Sniklas void thread1 ();
12*e93f7393Sniklas void thread2 ();
13*e93f7393Sniklas 
14*e93f7393Sniklas #define TIME_LIMIT 30
15*e93f7393Sniklas 
16*e93f7393Sniklas 
17*e93f7393Sniklas int count1 = 0;
18*e93f7393Sniklas int count2 = 0;
19*e93f7393Sniklas 
20*e93f7393Sniklas pthread_t tid1, tid2;
21*e93f7393Sniklas pthread_attr_t attr1, attr2;
22*e93f7393Sniklas 
23*e93f7393Sniklas pthread_mutex_t mut;
24*e93f7393Sniklas pthread_mutexattr_t mut_attr;
25*e93f7393Sniklas 
26*e93f7393Sniklas pthread_condattr_t cv_attr_a, cv_attr_b;
27*e93f7393Sniklas pthread_cond_t cv_a, cv_b;
28*e93f7393Sniklas 
29*e93f7393Sniklas struct cv_struct
30*e93f7393Sniklas   {
31*e93f7393Sniklas     char a;
32*e93f7393Sniklas     char b;
33*e93f7393Sniklas   }
34*e93f7393Sniklas test_struct;
35*e93f7393Sniklas 
main()36*e93f7393Sniklas main ()
37*e93f7393Sniklas {
38*e93f7393Sniklas   /*init la struct */
39*e93f7393Sniklas   test_struct.a = 0;
40*e93f7393Sniklas   test_struct.b = 1;
41*e93f7393Sniklas 
42*e93f7393Sniklas   /* create le mutex */
43*e93f7393Sniklas   if (pthread_mutexattr_create (&mut_attr) == -1)
44*e93f7393Sniklas     {
45*e93f7393Sniklas       perror ("mutexattr_create");
46*e93f7393Sniklas       exit (1);
47*e93f7393Sniklas     }
48*e93f7393Sniklas 
49*e93f7393Sniklas 
50*e93f7393Sniklas   if (pthread_mutex_init (&mut, mut_attr) == -1)
51*e93f7393Sniklas     {
52*e93f7393Sniklas       perror ("mutex_init");
53*e93f7393Sniklas       exit (1);
54*e93f7393Sniklas     }
55*e93f7393Sniklas 
56*e93f7393Sniklas   /* create 2 cv */
57*e93f7393Sniklas   if (pthread_condattr_create (&cv_attr_a) == -1)
58*e93f7393Sniklas     {
59*e93f7393Sniklas       perror ("condattr_create(1)");
60*e93f7393Sniklas       exit (1);
61*e93f7393Sniklas     }
62*e93f7393Sniklas 
63*e93f7393Sniklas   if (pthread_cond_init (&cv_a, cv_attr_a) == -1)
64*e93f7393Sniklas     {
65*e93f7393Sniklas       perror ("cond_init(1)");
66*e93f7393Sniklas       exit (1);
67*e93f7393Sniklas     }
68*e93f7393Sniklas 
69*e93f7393Sniklas   if (pthread_condattr_create (&cv_attr_b) == -1)
70*e93f7393Sniklas     {
71*e93f7393Sniklas       perror ("condattr_create(2)");
72*e93f7393Sniklas       exit (1);
73*e93f7393Sniklas     }
74*e93f7393Sniklas 
75*e93f7393Sniklas   if (pthread_cond_init (&cv_b, cv_attr_b) == -1)
76*e93f7393Sniklas     {
77*e93f7393Sniklas       perror ("cond_init(2)");
78*e93f7393Sniklas       exit (1);
79*e93f7393Sniklas     }
80*e93f7393Sniklas 
81*e93f7393Sniklas   /* create 2 threads of execution */
82*e93f7393Sniklas   if (pthread_attr_create (&attr1) == -1)
83*e93f7393Sniklas     {
84*e93f7393Sniklas       perror ("attr_create(1)");
85*e93f7393Sniklas       exit (1);
86*e93f7393Sniklas     }
87*e93f7393Sniklas 
88*e93f7393Sniklas   if (pthread_create (&tid1, attr1, thread1, &count1) == -1)
89*e93f7393Sniklas     {
90*e93f7393Sniklas       perror ("pthread_create(1)");
91*e93f7393Sniklas       exit (1);
92*e93f7393Sniklas     }
93*e93f7393Sniklas 
94*e93f7393Sniklas   if (pthread_attr_create (&attr2) == -1)
95*e93f7393Sniklas     {
96*e93f7393Sniklas       perror ("attr_create(2)");
97*e93f7393Sniklas       exit (1);
98*e93f7393Sniklas     }
99*e93f7393Sniklas 
100*e93f7393Sniklas   if (pthread_create (&tid2, attr2, thread2, &count2) == -1)
101*e93f7393Sniklas     {
102*e93f7393Sniklas       perror ("pthread_create(2)");
103*e93f7393Sniklas       exit (1);
104*e93f7393Sniklas     }
105*e93f7393Sniklas 
106*e93f7393Sniklas   /* set alarm to print out data and exit */
107*e93f7393Sniklas   signal (SIGALRM, alarm_handler);
108*e93f7393Sniklas   alarm (TIME_LIMIT);
109*e93f7393Sniklas 
110*e93f7393Sniklas   for (;;)
111*e93f7393Sniklas     pause ();
112*e93f7393Sniklas }
113*e93f7393Sniklas 
114*e93f7393Sniklas void
thread1(count)115*e93f7393Sniklas thread1 (count)
116*e93f7393Sniklas      int *count;
117*e93f7393Sniklas {
118*e93f7393Sniklas   tid_t tid;
119*e93f7393Sniklas 
120*e93f7393Sniklas   tid = getstid ();
121*e93f7393Sniklas   printf ("Thread1 tid 0x%x  (%d) \n", tid, tid);
122*e93f7393Sniklas   printf ("Thread1 @tid=0x%x \n", &tid);
123*e93f7393Sniklas   signal (SIGALRM, alarm_handler1);
124*e93f7393Sniklas 
125*e93f7393Sniklas   for (;;)
126*e93f7393Sniklas     {
127*e93f7393Sniklas       if (pthread_mutex_lock (&mut) == -1)
128*e93f7393Sniklas 	{
129*e93f7393Sniklas 	  perror ("pthread_mutex_lock(1)");
130*e93f7393Sniklas 	  pthread_exit ((void *) 0);
131*e93f7393Sniklas 	}
132*e93f7393Sniklas 
133*e93f7393Sniklas       while (test_struct.a == 0)
134*e93f7393Sniklas 	{
135*e93f7393Sniklas 	  if (pthread_cond_wait (&cv_a, &mut) == -1)
136*e93f7393Sniklas 	    {
137*e93f7393Sniklas 	      perror ("pthread_cond_wait(1)");
138*e93f7393Sniklas 	      pthread_exit ((void *) -1);
139*e93f7393Sniklas 	    }
140*e93f7393Sniklas 	}
141*e93f7393Sniklas 
142*e93f7393Sniklas       (*count)++;
143*e93f7393Sniklas       printf ("*******thread1 count %d\n", *count);
144*e93f7393Sniklas 
145*e93f7393Sniklas       test_struct.a = 0;
146*e93f7393Sniklas 
147*e93f7393Sniklas       test_struct.b = 1;
148*e93f7393Sniklas       pthread_cond_signal (&cv_b);
149*e93f7393Sniklas 
150*e93f7393Sniklas       if (pthread_mutex_unlock (&mut) == -1)
151*e93f7393Sniklas 	{
152*e93f7393Sniklas 	  perror ("pthread_mutex_unlock(1)");
153*e93f7393Sniklas 	  pthread_exit ((void *) -1);
154*e93f7393Sniklas 	}
155*e93f7393Sniklas     }
156*e93f7393Sniklas }
157*e93f7393Sniklas 
158*e93f7393Sniklas void
thread2(count)159*e93f7393Sniklas thread2 (count)
160*e93f7393Sniklas      int *count;
161*e93f7393Sniklas {
162*e93f7393Sniklas   tid_t tid;
163*e93f7393Sniklas 
164*e93f7393Sniklas   tid = getstid ();
165*e93f7393Sniklas   printf ("Thread2 tid 0x%x  (%d) \n", tid, tid);
166*e93f7393Sniklas   printf ("Thread1 @tid=0x%x \n", &tid);
167*e93f7393Sniklas   signal (SIGALRM, alarm_handler2);
168*e93f7393Sniklas 
169*e93f7393Sniklas   for (;;)
170*e93f7393Sniklas     {
171*e93f7393Sniklas       if (pthread_mutex_lock (&mut) == -1)
172*e93f7393Sniklas 	{
173*e93f7393Sniklas 	  perror ("pthread_mutex_lock(2)");
174*e93f7393Sniklas 	  pthread_exit ((void *) 0);
175*e93f7393Sniklas 	}
176*e93f7393Sniklas 
177*e93f7393Sniklas       while (test_struct.b == 0)
178*e93f7393Sniklas 	{
179*e93f7393Sniklas 	  if (pthread_cond_wait (&cv_b, &mut) == -1)
180*e93f7393Sniklas 	    {
181*e93f7393Sniklas 	      perror ("pthread_cond_wait(2)");
182*e93f7393Sniklas 	      pthread_exit ((void *) -1);
183*e93f7393Sniklas 	    }
184*e93f7393Sniklas 	}
185*e93f7393Sniklas 
186*e93f7393Sniklas       (*count)++;
187*e93f7393Sniklas       printf ("*******thread2 count %d\n", *count);
188*e93f7393Sniklas 
189*e93f7393Sniklas       test_struct.b = 0;
190*e93f7393Sniklas 
191*e93f7393Sniklas       test_struct.a = 1;
192*e93f7393Sniklas       pthread_cond_signal (&cv_a);
193*e93f7393Sniklas 
194*e93f7393Sniklas       if (pthread_mutex_unlock (&mut) == -1)
195*e93f7393Sniklas 	{
196*e93f7393Sniklas 	  perror ("pthread_mutex_unlock(2)");
197*e93f7393Sniklas 	  pthread_exit ((void *) -1);
198*e93f7393Sniklas 	}
199*e93f7393Sniklas     }
200*e93f7393Sniklas }
201*e93f7393Sniklas 
202*e93f7393Sniklas 
203*e93f7393Sniklas void
alarm_handler()204*e93f7393Sniklas alarm_handler ()
205*e93f7393Sniklas {
206*e93f7393Sniklas   printf ("\tcount1 (%d) \n\tcount2 (%d)\n", count1, count2);
207*e93f7393Sniklas   exit (0);
208*e93f7393Sniklas }
209*e93f7393Sniklas 
210*e93f7393Sniklas void
alarm_handler1()211*e93f7393Sniklas alarm_handler1 ()
212*e93f7393Sniklas {
213*e93f7393Sniklas   printf ("ALARM thread 1\n");
214*e93f7393Sniklas }
215*e93f7393Sniklas 
216*e93f7393Sniklas void
alarm_handler2()217*e93f7393Sniklas alarm_handler2 ()
218*e93f7393Sniklas {
219*e93f7393Sniklas   printf ("ALARM thread 2\n");
220*e93f7393Sniklas   pthread_exit ((void *) 0);
221*e93f7393Sniklas }
222