#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/event.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <aitsched.h>
intptr_t Kill;
sched_root_task_t *root;
void *event(sched_task_t *arg)
{
printf("Event::\n");
return NULL;
}
void *regular(sched_task_t *arg)
{
printf("Task(%lu):: %s\n", TASK_VAL(arg), (char*) TASK_ARG(arg));
fflush(stdout);
return NULL;
}
void *timer(sched_task_t *arg)
{
printf("Timer %p sec::\n", TASK_ARG(arg));
return NULL;
}
void *alarmz(sched_task_t *arg)
{
printf("Alarm %ld sec::\n", (u_long) TASK_ARG(arg));
return NULL;
}
void *node(sched_task_t *arg)
{
printf("Node %s data %d fflags 0x%X\n", (char*) TASK_ARG(arg), TASK_RET(arg), TASK_FLAG(arg));
return NULL;
}
void *proc(sched_task_t *arg)
{
printf("Proc pid=%ld data %d fflags 0x%X\n", TASK_VAL(arg), TASK_RET(arg), TASK_FLAG(arg));
return NULL;
}
void *sigz(sched_task_t *arg)
{
printf("Signal signal=%ld how many times %d\n", TASK_VAL(arg), TASK_RET(arg));
return NULL;
}
#ifdef EVFILT_USER
void *user(sched_task_t *arg)
{
printf("User trigger id %ld fflags %d\n", TASK_VAL(arg), TASK_FLAG(arg) & NOTE_FFLAGSMASK);
return NULL;
}
#endif
void *susp1(sched_task_t *arg)
{
printf("Suspend 1 =%ld\n", TASK_VAL(arg));
return NULL;
}
void *susp2(sched_task_t *arg)
{
printf("Suspend 2 =%ld\n", TASK_VAL(arg));
return NULL;
}
void *susp3(sched_task_t *arg)
{
printf("Suspend 3 =%ld\n", TASK_VAL(arg));
return NULL;
}
void *once(sched_task_t *arg)
{
printf("once::\n");
return NULL;
}
void sig(int s)
{
switch (s) {
case SIGTERM:
Kill++;
break;
case SIGUSR1:
schedResumeby(root, CRITERIA_ID, (void*) 0);
schedResumeby(root, CRITERIA_ID, (void*) 7);
break;
}
}
int
main(int argc, char **argv)
{
struct timespec ts = { 20, 0 };
// struct timespec p = { 0, 10000000 };
int f = 0;
struct sigaction sa;
#ifdef EVFILT_USER
sched_task_t *t[4];
#endif
sched_task_t *task;
sa.sa_handler = sig;
sigemptyset(&sa.sa_mask);
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
root = schedBegin();
if (!root) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 1;
}
if (!schedTimer(root, timer, (void*) (intptr_t) ts.tv_sec, ts, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 4;
} else
ts.tv_sec = 15;
if (!schedTimer(root, timer, (void*) (intptr_t) ts.tv_sec, ts, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 4;
} else
ts.tv_sec = 10;
if (!schedEvent(root, event, "piuk", 1234, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 2;
}
if (!schedTask(root, regular, "piuk", 11, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 3;
}
if (!schedTask(root, regular, "piuk", 1, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 3;
}
if (!schedTask(root, regular, "piuk", 0, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 3;
}
if (!schedTask(root, regular, "piuk", 1000001, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 3;
}
if (!schedTimer(root, timer, (void*) (intptr_t) ts.tv_sec, ts, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 4;
}
if (!schedAlarm(root, alarmz, (void*) (intptr_t) ts.tv_sec, ts, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 5;
} else {
ts.tv_sec = 3;
ts.tv_nsec = 500000000;
}
if (!schedAlarm(root, alarmz, (void*) (intptr_t) ts.tv_sec, ts, (void*) 1, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 5;
}
if (!schedAlarm(root, alarmz, (void*) (intptr_t) ts.tv_sec, ts, (void*) 2, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 5;
} else {
ts.tv_sec = 0;
ts.tv_nsec = 700000000;
}
if (!schedAlarm(root, alarmz, (void*) (intptr_t) ts.tv_sec, ts, (void*) 3, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 5;
}
#ifdef EVFILT_USER
if (!(t[0] = schedUser(root, user, NULL, 42, 0, 0))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(t[1] = schedUser(root, user, NULL, 1, 0, 73))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(t[2] = schedUser(root, user, NULL, 0xaa, 0, NOTE_FFAND | 0xaa))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(t[3] = schedUser(root, user, NULL, -1, 0, NOTE_FFCOPY | 1003))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
#endif
if (!schedSuspend(root, susp1, NULL, 7, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(task = schedSuspend(root, susp2, NULL, 1, NULL, 0))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!schedSuspend(root, susp3, NULL, 0, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (argc > 1)
if (!schedProc(root, proc, NULL, atoi(argv[1]), 0, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
if (argc > 2) {
f = open(argv[2], O_RDWR);
if (f == -1) {
perror("open()");
return 8;
}
if (!schedNode(root, node, argv[2], f, 0, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
close(f);
return 8;
}
}
#ifdef EVFILT_USER
schedTrigger(t[3]);
schedTrigger(t[1]);
#endif
schedResumeby(root, CRITERIA_DATA, task);
if (!schedSignal(root, sigz, NULL, SIGUSR1, 0, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
close(f);
return 9;
}
#ifdef EVFILT_USER
schedTrigger(t[2]);
schedTrigger(t[0]);
#endif
schedCallOnce(root, once, "000000", 42, NULL, 0);
printf("read_queue=%d timer_queue=%d\n",
ROOT_QUEUE_EMPTY(root, read), ROOT_QUEUE_EMPTY(root, timer));
// schedPolling(root, &p, NULL);
schedRun(root, &Kill);
schedEnd(&root);
if (f > 2)
close(f);
return 0;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>