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