summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/proc.c b/proc.c
new file mode 100644
index 0000000..39d661e
--- /dev/null
+++ b/proc.c
@@ -0,0 +1,66 @@
+#define _GNU_SOURCE
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include "proc.h"
+#include "die.h"
+
+void cpu_affinity(int cpu)
+{
+ int ret;
+ cpu_set_t cpu_bitmask;
+
+ CPU_ZERO(&cpu_bitmask);
+ CPU_SET(cpu, &cpu_bitmask);
+
+ ret = sched_setaffinity(getpid(), sizeof(cpu_bitmask),
+ &cpu_bitmask);
+ if (ret)
+ panic("Can't set this cpu affinity!\n");
+}
+
+int set_proc_prio(int priority)
+{
+ int ret = setpriority(PRIO_PROCESS, getpid(), priority);
+ if (ret)
+ panic("Can't set nice val to %i!\n", priority);
+
+ return 0;
+}
+
+int set_sched_status(int policy, int priority)
+{
+ int ret, min_prio, max_prio;
+ struct sched_param sp;
+
+ max_prio = sched_get_priority_max(policy);
+ min_prio = sched_get_priority_min(policy);
+
+ if (max_prio == -1 || min_prio == -1)
+ printf("Cannot determine scheduler prio limits!\n");
+ else if (priority < min_prio)
+ priority = min_prio;
+ else if (priority > max_prio)
+ priority = max_prio;
+
+ memset(&sp, 0, sizeof(sp));
+ sp.sched_priority = priority;
+
+ ret = sched_setscheduler(getpid(), policy, &sp);
+ if (ret) {
+ printf("Cannot set scheduler policy!\n");
+ return -EINVAL;
+ }
+
+ ret = sched_setparam(getpid(), &sp);
+ if (ret) {
+ printf("Cannot set scheduler prio!\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}