2 #define _XOPEN_SOURCE 600
14 pthread_mutex_t shared_with_hi_mtx;
15 pthread_mutex_t shared_with_lo_mtx;
18 sem_t release_mid_sem;
22 pthread_t mid_task_id;
26 void bad_status(int status, int fail_level, const char *text)
28 printf("ERROR: %s status %d\n", text, status);
33 void block_delay(int delay)
44 void *hi_task(void *arg)
48 printf("THI created\n"); fflush(stdout);
50 status=sem_wait(&release_hi_sem);
51 if(status!=0) bad_status(status, 0, "sem_wait RHI from THI");
52 printf("THI released (RHI)\n"); fflush(stdout);
54 status=pthread_mutex_lock(&shared_with_hi_mtx);
55 if(status!=0) bad_status(status, 0, "pthread_mutex_lock SHI from THI");
56 printf("THI obtained SHI\n"); fflush(stdout);
60 printf("THI going to release SHI\n"); fflush(stdout);
61 status=pthread_mutex_unlock(&shared_with_hi_mtx);
62 if(status!=0) bad_status(status, 0, "pthread_mutex_unlock SHI from THI");
63 printf("THI released SHI\n"); fflush(stdout);
67 void *mid_task(void *arg)
71 printf("TMID created\n"); fflush(stdout);
73 status=sem_wait(&release_mid_sem);
74 if(status!=0) bad_status(status, 0, "sem_wait RMID from TMID");
75 printf("MID released (RMID)\n"); fflush(stdout);
79 printf("MID going to sleep\n"); fflush(stdout);
83 void *lo_task(void *arg)
87 printf("LO created\n"); fflush(stdout);
89 status=sem_wait(&release_lo_sem);
90 if(status!=0) bad_status(status, 0, "sem_wait RLO from TLO");
91 printf("TLO released (RLO)\n"); fflush(stdout);
93 status=pthread_mutex_lock(&shared_with_lo_mtx);
94 if(status!=0) bad_status(status, 0, "pthread_mutex_lock SLO from TLO");
95 printf("TLO obtained SLO\n"); fflush(stdout);
99 printf("TLO going to release SLO\n"); fflush(stdout);
100 status=pthread_mutex_unlock(&shared_with_lo_mtx);
101 if(status!=0) bad_status(status, 0, "pthread_mutex_unlock SLO from TLO");
102 printf("TLO released SLO\n"); fflush(stdout);
107 void *Task_1(void *argument)
110 pthread_mutexattr_t mutexattr;
111 pthread_attr_t taskattr;
112 struct sched_param schedparam;
116 printf("*** Starting up Task_1 ***\n");
118 schedparam.sched_priority = sched_get_priority_min(SCHED_FIFO) + TASK_1_PRIORITY;
119 status = pthread_setschedparam(pthread_self(), SCHED_FIFO, &schedparam);
120 if(status!=0) bad_status(status, 0, "pthread_setschedparam" );
122 status = pthread_mutexattr_init(&mutexattr);
123 if(status!=0) bad_status(status, 0, "pthread_mutexattr_init" );
124 status=pthread_mutexattr_setprotocol(&mutexattr, PTHREAD_PRIO_INHERIT);
125 if(status!=0) bad_status(status, 0, "pthread_mutexattr_setprotocol" );
127 status=pthread_mutex_init(&shared_with_hi_mtx, &mutexattr);
128 if(status!=0) bad_status(status, 0, "pthread_mutex_init SHI" );
130 status=pthread_mutex_init(&shared_with_lo_mtx, &mutexattr);
131 if(status!=0) bad_status(status, 0, "pthread_mutex_init SLO" );
133 status=sem_init(&release_hi_sem, 0, 0);
134 if(status!=0) bad_status(status, 0, "sem_init RHI" );
136 status=sem_init(&release_mid_sem, 0, 0);
137 if(status!=0) bad_status(status, 0, "sem_init RMID" );
139 status=sem_init(&release_lo_sem, 0, 0);
140 if(status!=0) bad_status(status, 0, "sem_init RLO" );
142 status = pthread_attr_init(&taskattr);
143 if(status!=0) bad_status(status, 0, "pthread_attr_init" );
144 status = pthread_attr_setinheritsched(&taskattr, PTHREAD_EXPLICIT_SCHED);
145 if(status!=0) bad_status(status, 0, "pthread_attr_setinheritsched" );
146 status = pthread_attr_setschedpolicy(&taskattr, SCHED_FIFO);
147 if(status!=0) bad_status(status, 0, "pthread_attr_setschedpolicy" );
149 schedparam.sched_priority = sched_get_priority_min(SCHED_FIFO) + TASK_HI_PRIORITY;
150 status = pthread_attr_setschedparam(&taskattr, &schedparam);
151 if(status!=0) bad_status(status, 0, "pthread_attr_setschedparam" );
153 status = pthread_create(&hi_task_id, &taskattr, hi_task, NULL);
154 if(status!=0) bad_status(status, 0, "pthread_create THI\n");
156 schedparam.sched_priority = sched_get_priority_min(SCHED_FIFO) + TASK_MID_PRIORITY;
157 status = pthread_attr_setschedparam(&taskattr, &schedparam);
158 if(status!=0) bad_status(status, 0, "pthread_attr_setschedparam" );
160 status = pthread_create(&hi_task_id, &taskattr, mid_task, NULL);
161 if(status!=0) bad_status(status, 0, "pthread_create TMID\n");
163 schedparam.sched_priority = sched_get_priority_min(SCHED_FIFO) + TASK_LO_PRIORITY;
164 status = pthread_attr_setschedparam(&taskattr, &schedparam);
165 if(status!=0) bad_status(status, 0, "pthread_attr_setschedparam" );
167 status = pthread_create(&hi_task_id, &taskattr, lo_task, NULL);
168 if(status!=0) bad_status(status, 0, "pthread_create TLO\n");
174 status=pthread_mutex_lock(&shared_with_lo_mtx);
175 if(status!=0) bad_status(status, 0, "pthread_mutex_lock SLO");
176 printf("1 obtained SLO\n"); fflush(stdout);
178 printf("1 going to release RLO\n"); fflush(stdout);
179 status=sem_post(&release_lo_sem);
180 if(status!=0) bad_status(status, 0, "sem_post RLO");
182 status=pthread_mutex_lock(&shared_with_hi_mtx);
183 if(status!=0) bad_status(status, 0, "pthread_mutex_lock SHI");
184 printf("1 obtained SHI\n"); fflush(stdout);
186 printf("1 going to release RHI\n"); fflush(stdout);
187 status=sem_post(&release_hi_sem);
188 if(status!=0) bad_status(status, 0, "sem_post RHI");
192 printf("1 going to release RMID\n"); fflush(stdout);
193 status=sem_post(&release_mid_sem);
194 if(status!=0) bad_status(status, 0, "sem_post RMID");
198 printf("1 going to release SHI\n"); fflush(stdout);
199 status=pthread_mutex_unlock(&shared_with_hi_mtx);
200 if(status!=0) bad_status(status, 0, "pthread_mutex_unlock SHI");
204 printf("1 going to release SLO\n"); fflush(stdout);
205 status=pthread_mutex_unlock(&shared_with_lo_mtx);
206 if(status!=0) bad_status(status, 0, "pthread_mutex_unlock SLO");
207 printf("1 released both SHI and SLO\n"); fflush(stdout);
211 printf("1 going to sleep\n"); fflush(stdout);
216 #ifndef COMPILE_FOR_RTEMS
218 int main(int argc, char *argv[])
224 #endif /*COMPILE_FOR_RTEMS*/