/* TEST_MUTEX.C */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <math.h>
#include <values.h>
#include <sys/mman.h>
#include <native/task.h>
#include <native/mutex.h>
#include <native/sem.h>
int fd, err;
RT_MUTEX m;
RT_SEM s;
float tmax = 1.0e7;
#define CHECK(arg) check(arg, __LINE__)
int check(int r, int n)
{
if (r != 0)
fprintf(stderr, "L%d: %s.\n", n, strerror(-r));
return(r);
}
void output(char c) {
static int cnt = 0;
int n;
char buf[2];
RT_MUTEX_INFO mutexinfo;
buf[0] = c;
if (cnt == 80) {
buf[1] = '\n';
n = 2;
cnt = 0;
}
else {
n = 1;
cnt++;
}
CHECK(rt_mutex_inquire(&m, &mutexinfo));
if (mutexinfo.lockcnt <= 0) {
RT_TASK_INFO taskinfo;
CHECK(rt_task_inquire(NULL, &taskinfo));
fprintf(stderr, "ALERT: No lock! (lockcnt=%d) Offending task: %s\n",
mutexinfo.lockcnt, taskinfo.name
);
}
if (write(fd, buf, n) != n) {
fprintf(stderr, "File write error.\n");
CHECK(rt_sem_v(&s));
}
}
void task0(void *arg)
{
CHECK(rt_task_set_mode(T_PRIMARY, 0, NULL));
while (1) {
CHECK(rt_task_sleep((float)rand()*tmax/(float)RAND_MAX));
CHECK(rt_mutex_lock(&m, TM_INFINITE));
output('0');
CHECK(rt_mutex_unlock(&m));
}
}
void task1(void *arg)
{
CHECK(rt_task_set_mode(T_PRIMARY, 0, NULL));
while (1) {
CHECK(rt_task_sleep((float)rand()*tmax/(float)RAND_MAX));
CHECK(rt_mutex_lock(&m, TM_INFINITE));
output('1');
CHECK(rt_mutex_unlock(&m));
}
}
void sighandler(int arg)
{
CHECK(rt_sem_v(&s));
}
int main(int argc, char *argv[])
{
RT_TASK t, t0, t1;
if ((fd = open("dump.txt", O_CREAT | O_TRUNC | O_WRONLY)) < 0)
fprintf(stderr, "File open error.\n");
else {
if (argc == 2) {
tmax = atof(argv[1]);
if (tmax == 0.0)
tmax = 1.0e7;
}
if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0)
printf("mlockall() error.\n");
CHECK(rt_task_shadow(&t, "main", 1, T_FPU));
CHECK(rt_timer_start(TM_ONESHOT));
CHECK(rt_mutex_create(&m, "mutex"));
CHECK(rt_sem_create(&s, "sem", 0, S_PRIO));
signal(SIGINT, sighandler);
CHECK(rt_task_create(&t0, "task0", 0, 30, T_FPU));
CHECK(rt_task_start(&t0, task0, NULL));
CHECK(rt_task_create(&t1, "task1", 0, 29, T_FPU));
CHECK(rt_task_start(&t1, task1, NULL));
printf("Running for %.2f seconds.\n", (float)MAXLONG/1.0e9);
CHECK(rt_sem_p(&s, MAXLONG));
signal(SIGINT, SIG_IGN);
CHECK(rt_task_delete(&t1));
CHECK(rt_task_delete(&t1));
CHECK(rt_task_delete(&t0));
CHECK(rt_sem_delete(&s));
CHECK(rt_mutex_delete(&m));
rt_timer_stop();
close(fd);
}
return 0;
}
/*************************************************************************************/
/* TEST_SEM.C */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <math.h>
#include <values.h>
#include <sys/mman.h>
#include <native/task.h>
#include <native/sem.h>
int fd, err;
RT_SEM s, m;
float tmax = 1.0e9;
#define CHECK(arg) check(arg, __LINE__)
int check(int r, int n)
{
if (r != 0)
fprintf(stderr, "L%d: %s.\n", n, strerror(-r));
return(r);
}
void output(char c) {
static int cnt = 0;
int n;
char buf[2];
RT_SEM_INFO seminfo;
buf[0] = c;
if (cnt == 80) {
buf[1] = '\n';
n = 2;
cnt = 0;
}
else {
n = 1;
cnt++;
}
CHECK(rt_sem_inquire(&m, &seminfo));
if (seminfo.count != 0) {
RT_TASK_INFO taskinfo;
CHECK(rt_task_inquire(NULL, &taskinfo));
fprintf(stderr, "ALERT: No lock! (count=%ld) Offending task: %s\n",
seminfo.count, taskinfo.name);
}
if (write(fd, buf, n) != n) {
fprintf(stderr, "File write error.\n");
CHECK(rt_sem_v(&s));
}
}
void task0(void *arg)
{
CHECK(rt_task_set_mode(T_PRIMARY, 0, NULL));
while (1) {
CHECK(rt_task_sleep((float)rand()*tmax/(float)RAND_MAX));
CHECK(rt_sem_p(&m, TM_INFINITE));
output('0');
CHECK(rt_sem_v(&m));
}
}
void task1(void *arg)
{
CHECK(rt_task_set_mode(T_PRIMARY, 0, NULL));
while (1) {
CHECK(rt_task_sleep((float)rand()*tmax/(float)RAND_MAX));
CHECK(rt_sem_p(&m, TM_INFINITE));
output('1');
CHECK(rt_sem_v(&m));
}
}
void sighandler(int arg)
{
CHECK(rt_sem_v(&s));
}
int main(int argc, char *argv[])
{
RT_TASK t, t0, t1;
if ((fd = open("dump.txt", O_CREAT | O_TRUNC | O_WRONLY)) < 0)
fprintf(stderr, "File open error.\n");
else {
if (argc == 2) {
tmax = atof(argv[1]);
if (tmax == 0.0)
tmax = 1.0e7;
}
if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0)
printf("mlockall() error.\n");
CHECK(rt_task_shadow(&t, "main", 1, T_FPU));
CHECK(rt_timer_start(TM_ONESHOT));
CHECK(rt_sem_create(&m, "mutex", 1, S_PRIO));
CHECK(rt_sem_create(&s, "sem", 0, S_PRIO));
signal(SIGINT, sighandler);
CHECK(rt_task_create(&t0, "task0", 0, 30, T_FPU));
CHECK(rt_task_start(&t0, task0, NULL));
CHECK(rt_task_create(&t1, "task1", 0, 29, T_FPU));
CHECK(rt_task_start(&t1, task1, NULL));
printf("Running for %.2f seconds.\n", (float)MAXLONG/1.0e9);
CHECK(rt_sem_p(&s, MAXLONG));
signal(SIGINT, SIG_IGN);
CHECK(rt_task_delete(&t1));
CHECK(rt_task_delete(&t1));
CHECK(rt_task_delete(&t0));
CHECK(rt_sem_delete(&s));
CHECK(rt_sem_delete(&m));
rt_timer_stop();
close(fd);
}
return 0;
}
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core