From 2c1f329215e57a6f070cab21236b132b22ef80c2 Mon Sep 17 00:00:00 2001 From: "Bjoern B. Brandenburg" Date: Tue, 12 Feb 2008 15:51:00 -0500 Subject: first changes to compile with LITMUS 2008 --- src/syscalls.c | 10 +++++++--- src/task.c | 43 +++++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/syscalls.c b/src/syscalls.c index 40f5f7f..1ad709b 100644 --- a/src/syscalls.c +++ b/src/syscalls.c @@ -1,4 +1,4 @@ -/* To get syscall() we need to define _GNU_SOURCE +/* To get syscall() we need to define _GNU_SOURCE * in modern glibc versions. */ #define _GNU_SOURCE @@ -87,8 +87,12 @@ int wait_for_job_release(unsigned int job_no) return syscall(__NR_wait_for_job_release, job_no); } -int task_mode(int target_mode) +int sched_setscheduler(pid_t pid, int policy, int* priority) { - return syscall(__NR_task_mode, target_mode); + return syscall(__NR_sched_setscheduler, pid, policy, priority); } +int sched_getscheduler(pid_t pid) +{ + return syscall(__NR_sched_getscheduler, pid); +} diff --git a/src/task.c b/src/task.c index 7cfa6ce..0036efb 100644 --- a/src/task.c +++ b/src/task.c @@ -1,30 +1,31 @@ #include #include #include +#include #include "litmus.h" #include "internal.h" -static void tperrorx(char* msg) +static void tperrorx(char* msg) { - fprintf(stderr, + fprintf(stderr, "Task %d: %s: %m", - getpid(), msg); + gettid(), msg); exit(-1); } /* common launch routine */ -int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, rt_setup_fn_t setup, - void* setup_arg) +int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, rt_setup_fn_t setup, + void* setup_arg) { int ret; int rt_task = fork(); if (rt_task == 0) { - /* we are the real-time task + /* we are the real-time task * launch task and die when it is done - */ - rt_task = getpid(); + */ + rt_task = gettid(); ret = setup(rt_task, setup_arg); if (ret < 0) tperrorx("could not setup task parameters"); @@ -38,14 +39,14 @@ int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, rt_setup_fn_t setup, } int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, - task_class_t class) + task_class_t class) { struct rt_task params; params.cpu = cpu; params.period = period; params.exec_cost = wcet; params.cls = class; - return __launch_rt_task(rt_prog, arg, + return __launch_rt_task(rt_prog, arg, (rt_setup_fn_t) set_rt_task_param, ¶ms); } @@ -53,3 +54,25 @@ int create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period) { return __create_rt_task(rt_prog, arg, cpu, wcet, period, RT_CLASS_HARD); } + +#define SCHED_NORMAL 0 +#define SCHED_LITMUS 6 + +int task_mode(int mode) +{ + int prio = 0; + int me = gettid(); + int policy = sched_getscheduler(gettid()); + int old_mode = policy == SCHED_LITMUS ? LITMUS_RT_TASK : BACKGROUND_TASK; + + if (old_mode == LITMUS_RT_TASK && mode == BACKGROUND_TASK) { + /* transition to normal task */ + return sched_setscheduler(me, SCHED_NORMAL, &prio); + } else if (old_mode == BACKGROUND_TASK && mode == LITMUS_RT_TASK) { + /* transition to RT task */ + return sched_setscheduler(me, SCHED_LITMUS, &prio); + } else { + errno = -EINVAL; + return -1; + } +} -- cgit v1.2.2