File:
[ELWIX - Embedded LightWeight unIX -] /
libaitsched /
example /
test_time.c
Revision
1.15:
download - view:
text,
annotated -
select for diffs -
revision graph
Sat Feb 25 15:55:00 2023 UTC (17 months, 3 weeks ago) by
misho
Branches:
MAIN
CVS tags:
sched8_4,
sched8_3,
sched8_2,
sched8_1,
sched8_0,
sched7_9,
sched7_8,
sched7_7,
sched7_6,
sched7_5,
SCHED8_3,
SCHED8_2,
SCHED8_1,
SCHED8_0,
SCHED7_9,
SCHED7_8,
SCHED7_7,
SCHED7_6,
SCHED7_5,
SCHED7_4,
HEAD
version 7.4
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <aitsched.h>
#include "../inc/config.h"
intptr_t Kill;
sched_root_task_t *root;
void *event(sched_task_t *arg)
{
printf("Event::\n");
taskExit(arg, NULL);
}
void *regular(sched_task_t *arg)
{
printf("Task(%lu):: %s\n", TASK_VAL(arg), (char*) TASK_ARG(arg));
fflush(stdout);
taskExit(arg, NULL);
}
void *timer(sched_task_t *arg)
{
printf("Timer %p sec::\n", TASK_ARG(arg));
taskExit(arg, NULL);
}
void *rtc(sched_task_t *arg)
{
printf("RTC %p sec:: rtc id %lx signo=%lu\n", TASK_ARG(arg), (long) TASK_DATA(arg), TASK_VAL(arg));
taskExit(arg, NULL);
}
void *alarmz(sched_task_t *arg)
{
printf("Alarm %ld sec::\n", (u_long) TASK_ARG(arg));
taskExit(arg, NULL);
}
void *node(sched_task_t *arg)
{
printf("Node %s data %ld fflags 0x%lX\n", (char*) TASK_ARG(arg), (long) TASK_RET(arg), TASK_FLAG(arg));
taskExit(arg, NULL);
}
void *proc(sched_task_t *arg)
{
printf("Proc pid=%ld data %ld fflags 0x%lX\n", TASK_VAL(arg), (long) TASK_RET(arg), TASK_FLAG(arg));
taskExit(arg, NULL);
}
void *sigz(sched_task_t *arg)
{
printf("Signal signal=%ld how many times %ld\n", TASK_VAL(arg), (long) TASK_RET(arg));
taskExit(arg, NULL);
}
#ifdef EVFILT_USER
void *user(sched_task_t *arg)
{
printf("User trigger id %ld fflags %ld\n", TASK_VAL(arg), TASK_FLAG(arg) & NOTE_FFLAGSMASK);
taskExit(arg, NULL);
}
#endif
void *susp1(sched_task_t *arg)
{
printf("Suspend 1 =%ld\n", TASK_VAL(arg));
taskExit(arg, NULL);
}
void *susp2(sched_task_t *arg)
{
printf("Suspend 2 =%ld\n", TASK_VAL(arg));
taskExit(arg, NULL);
}
void *susp3(sched_task_t *arg)
{
printf("Suspend 3 =%ld\n", TASK_VAL(arg));
taskExit(arg, NULL);
}
void *once(sched_task_t *arg)
{
printf("once::\n");
taskExit(arg, NULL);
}
void *thr(sched_task_t *arg)
{
printf("tid (%lx):: %s\n", TASK_VAL(arg), __func__);
printf("tid (%lu):: %s\n", TASK_VAL(arg), (char*) TASK_ARG(arg));
taskExit(arg, 42);
}
void *thr4kill(sched_task_t *arg)
{
char blah[BUFSIZ];
printf("tid (%lx):: %s\n", TASK_VAL(arg), __func__);
read(0, blah, sizeof blah);
printf("never see!!! (%lx):: %s (%d == %d)\n", TASK_VAL(arg), (char*) TASK_ARG(arg), TASK_TYPE(arg), taskTHREAD);
taskExit(arg, 0);
}
void sig(int s)
{
switch (s) {
case SIGINT:
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;
sched_task_t *t;
#ifdef EVFILT_USER
sched_task_t *tt[4];
#endif
sched_task_t *task;
sa.sa_handler = sig;
sigemptyset(&sa.sa_mask);
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
root = schedBegin();
if (!root) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 1;
}
if (!schedRTC(root, rtc, (void*) (intptr_t) ts.tv_sec, ts, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 4;
}
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 (!schedRTC(root, rtc, (void*) (intptr_t) ts.tv_sec, ts, (void*) 1, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 4;
}
printf("query by call %p\n", schedQueryby(root, taskRTC, CRITERIA_CALL, rtc));
printf("query by any %p\n", schedQueryby(root, taskRTC, CRITERIA_ANY, NULL));
printf("query by call in all queues %p\n", schedQueryby(root, taskMAX,
CRITERIA_ANY, NULL));
printf("query by call in wrong queue %p\n", schedQueryby(root, taskTHREAD,
CRITERIA_CALL, rtc));
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 (!schedRTC(root, rtc, (void*) (intptr_t) ts.tv_sec, ts, (void*) 3, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 4;
}
if (!schedRTC(root, rtc, (void*) (intptr_t) ts.tv_sec, ts, (void*) 2, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 4;
}
#if SUP_ENABLE == KQ_SUPPORT
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
#endif
{
ts.tv_sec = 3;
ts.tv_nsec = 500000000;
}
if (!schedRTC(root, rtc, (void*) (intptr_t) ts.tv_sec, ts, (void*) 10, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 5;
}
if (!schedRTC(root, rtc, (void*) (intptr_t) ts.tv_sec, ts, (void*) 10, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 5;
}
#if SUP_ENABLE == KQ_SUPPORT
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
#endif
{
ts.tv_sec = 0;
ts.tv_nsec = 700000000;
}
#if SUP_ENABLE == KQ_SUPPORT
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;
}
#endif
#ifdef EVFILT_USER
if (!(tt[0] = schedUser(root, user, NULL, 42, 0, 0))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(tt[1] = schedUser(root, user, NULL, 1, 0, 73))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(tt[2] = schedUser(root, user, NULL, 0xaa, 0, NOTE_FFAND | 0xaa))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(tt[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;
}
printf("query by task %d\n", schedQuery(task));
if (!schedSuspend(root, susp3, NULL, 0, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 6;
}
if (!(t = schedThread(root, thr4kill, "0aaaa", 0, NULL, 0))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
printf("query by task %d\n", schedQuery(t));
if (!schedThread(root, thr, "mdaaaa this is thread task", 131072, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
if (!schedThread(root, thr, "mdaaaa this is thread task -detached", 0, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
if (!schedThread(root, thr, "mdaaaa this is thread task -j", 131072, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
printf("try to cancel tid = %lx\n", TASK_VAL(t));
schedCancel(t);
if (!schedThread(root, thr, "mdaaaa this is thread task -j2", 131072 * 2, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
if (!(t = schedThread(root, thr4kill, "0aaaa", /*4096*/0, NULL, 0))) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
if (!schedThread(root, thr, "mdaaaa this is thread task -j3", 0, NULL, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
return 7;
}
sleep(1);
schedCancel(t);
schedCancelby(root, taskRTC, CRITERIA_DATA, (void*) 2, NULL);
// schedCancelby(root, taskRTC, CRITERIA_DATA, (void*) 10, NULL);
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(tt[3]);
schedTrigger(tt[1]);
#endif
schedResumeby(root, CRITERIA_DATA, task);
#if SUP_ENABLE == KQ_SUPPORT
if (!schedSignal(root, sigz, NULL, SIGUSR1, 0, 0)) {
printf("Error:: #%d - %s\n", sched_GetErrno(), sched_GetError());
close(f);
return 9;
}
#endif
#ifdef EVFILT_USER
schedTrigger(tt[2]);
schedTrigger(tt[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>