| OLD | NEW |
| (Empty) |
| 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 } | |
| OLD | NEW |