Commit | Line | Data |
---|---|---|
f27ffb51 JL |
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 | } |