aboutsummaryrefslogblamecommitdiffstats
path: root/src/iotest.c
blob: ac07e74be390a26d74141552744b25b15264cc4d (plain) (tree)









































































                                                                                              
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/wait.h>

#include "litmus.h"

#define US_PER_MS 1000

int iotest(void *nil) {		
	int id = getpid();
	FILE* file;
	char str[255];
	unsigned long last = 0;
	struct timeval time;

	printf("I'am real time task %d  doing IO!\n", id);
	snprintf(str, sizeof(str), "rt-io-%d.txt", id);
	file = fopen(str, "w");
	if (!file) {
		perror("could not open file for output");
		exit(1);
	}
	while (1) {
		gettimeofday(&time, NULL);
		if (time.tv_usec - last > US_PER_MS) {
		  fprintf(file, "ran at %lus %lums\n", time.tv_sec, time.tv_usec / US_PER_MS);
		  last = time.tv_usec;
		}
		fflush(file);
	}
	return id;
}

#define NUMTASKS 4

int main(int argc, char** argv) 
{
	int rt_task[NUMTASKS];
	int i;
	int ret, pid;
	
	for (i = 0; i < NUMTASKS; i++) {		
		/*                        func   arg  cpu  wcet  period */
		rt_task[i] = create_rt_task(iotest, NULL,   0,   25,     100);
		if (rt_task[i] < 0) {
			perror("Could not create rt child process");
		}
	}

	sync();
	sync();

	printf(":: Starting real-time mode.\n");
	set_rt_mode(MODE_RT_RUN);

	printf(":: Sleeping...\n");
	sleep(120);	

	printf("Killing real-time tasks.\n");
	for (i = 0; i < NUMTASKS; i++) {
		printf(":: sending SIGKILL to %d\n", rt_task[i]);
		kill(rt_task[i], SIGKILL);			
	}
	for (i = 0; i < NUMTASKS; i++) {
		pid = wait(&ret);
		printf(":: %d exited with status %d\n", pid, ret);
	}
	printf(":: Leaving real-time mode.\n");
	set_rt_mode(MODE_NON_RT);
	return 0;	
}