added process scheduling routines
[nao-ulib.git] / src / psched.c
blobaae941bf4b2b8bafb3b73837d7e4a6c5d26c208b
1 /*
2 * nao-ulib
3 * Copyright 2011 Daniel Borkmann <dborkma@tik.ee.ethz.ch>
4 * Subject to the GPL.
5 * Nao-Team HTWK,
6 * Faculty of Computer Science, Mathematics and Natural Sciences,
7 * Leipzig University of Applied Sciences (HTWK Leipzig)
8 */
10 #define _GNU_SOURCE
11 #include <sys/types.h>
12 #include <unistd.h>
13 #include <sched.h>
15 #include "die.h"
16 #include "psched.h"
18 void run_on_cpu(int cpu)
20 cpu_set_t mask;
22 CPU_ZERO(&mask);
23 CPU_SET(cpu, &mask);
25 sched_setaffinity(0, sizeof(mask), &mask);
28 int set_proc_prio(int priority)
31 * setpriority() is clever, even if you put a nice value which
32 * is out of range it corrects it to the closest valid nice value
34 int ret = setpriority(PRIO_PROCESS, getpid(), priority);
35 if (ret)
36 panic("Can't set nice val to %i!\n", priority);
38 return 0;
41 int set_sched_status(int policy, int priority)
43 int ret, min_prio, max_prio;
44 struct sched_param sp;
46 max_prio = sched_get_priority_max(policy);
47 min_prio = sched_get_priority_min(policy);
49 if (max_prio == -1 || min_prio == -1)
50 whine("Cannot determine scheduler prio limits!\n");
51 else if (priority < min_prio)
52 priority = min_prio;
53 else if (priority > max_prio)
54 priority = max_prio;
56 memset(&sp, 0, sizeof(sp));
57 sp.sched_priority = priority;
59 ret = sched_setscheduler(getpid(), policy, &sp);
60 if (ret) {
61 whine("Cannot set scheduler policy!\n");
62 return -EINVAL;
65 ret = sched_setparam(getpid(), &sp);
66 if (ret) {
67 whine("Cannot set scheduler prio!\n");
68 return -EINVAL;
71 return 0;