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