]> granicus.if.org Git - strace/commitdiff
2004-03-01 Roland McGrath <roland@redhat.com>
authorRoland McGrath <roland@redhat.com>
Mon, 1 Mar 2004 20:27:37 +0000 (20:27 +0000)
committerRoland McGrath <roland@redhat.com>
Mon, 1 Mar 2004 20:27:37 +0000 (20:27 +0000)
* linux/dummy.h (sys_sched_getscheduler, sys_sched_setparam,
sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler,
sys_sched_get_priority_max, sys_sched_get_priority_min): Remove macros.
* process.c [LINUX] (sys_sched_getscheduler, sys_sched_setparam,
sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler,
sys_sched_get_priority_min): New functions.
From Ulrich Drepper <drepper@redhat.com>.

linux/dummy.h
process.c

index 2cccdead2e246326e77485b4f41529a1dee4e6be..63e5aa8610ab16aa7f5235d8396d8ac80768b957 100644 (file)
 #define sys_set_thread_area    printargs
 #endif
 
-#define sys_sched_setparam     printargs
-#define sys_sched_getparam     printargs
-#define sys_sched_setscheduler printargs
-#define sys_sched_getscheduler printargs
 #define sys_sched_yield                printargs
-#define sys_sched_get_priority_max printargs
-#define sys_sched_get_priority_min printargs
+#define sys_sched_get_priority_max sys_sched_get_priority_min
 #define sys_sched_rr_get_interval printargs
 
 /* like another call */
index 1839463c69035840d14ffffe2ec2daed1b36af42..48237c3f718d9eab311dc9160858e6a3b1d8097b 100644 (file)
--- a/process.c
+++ b/process.c
 #endif
 
 #ifdef LINUX
+#include <sched.h>
 #include <asm/posix_types.h>
 #undef GETGROUPS_T
 #define GETGROUPS_T __kernel_gid_t
@@ -2998,4 +2999,81 @@ struct tcb *tcp;
     }
     return 0;
 }
+
+static struct xlat schedulers[] = {
+       { SCHED_OTHER,  "SCHED_OTHER" },
+       { SCHED_RR,     "SCHED_RR" },
+       { SCHED_FIFO,   "SCHED_FIFO" },
+       { 0,            NULL }
+};
+
+int
+sys_sched_getscheduler(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+       tprintf("%d", (int) tcp->u_arg[0]);
+    } else if (! syserror(tcp)) {
+       tcp->auxstr = xlookup (schedulers, tcp->u_rval);
+       if (tcp->auxstr != NULL)
+           return RVAL_STR;
+    }
+    return 0;
+}
+
+int
+sys_sched_setscheduler(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+       struct sched_param p;
+       tprintf("%d, ", (int) tcp->u_arg[0]);
+       printxval(schedulers, tcp->u_arg[1], "SCHED_???");
+       if (umove(tcp, tcp->u_arg[2], &p) < 0)
+           tprintf(", %lx", tcp->u_arg[2]);
+       else
+           tprintf(", { %d }", p.__sched_priority);
+    }
+    return 0;
+}
+
+int
+sys_sched_getparam(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+           tprintf("%d, ", (int) tcp->u_arg[0]);
+    } else {
+       struct sched_param p;
+       if (umove(tcp, tcp->u_arg[1], &p) < 0)
+           tprintf("%lx", tcp->u_arg[1]);
+       else
+           tprintf("{ %d }", p.__sched_priority);
+    }
+    return 0;
+}
+
+int
+sys_sched_setparam(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+       struct sched_param p;
+       if (umove(tcp, tcp->u_arg[1], &p) < 0)
+           tprintf("%d, %lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
+       else
+           tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
+    }
+    return 0;
+}
+
+int
+sys_sched_get_priority_min(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+       printxval(schedulers, tcp->u_arg[0], "SCHED_???");
+    }
+    return 0;
+}
 #endif