diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2008-01-03 19:25:02 -0200 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2008-01-03 19:25:02 -0200 |
commit | 85e445cbb7a8766b05470d5cca91422e270bdeae (patch) | |
tree | 207c7351ed10528322d7c35682aa03ba1f495cab | |
parent | eaedc1782710b31a251b9a38f04623df3f741f43 (diff) | |
download | python-schedutils-85e445cbb7a8766b05470d5cca91422e270bdeae.tar.gz |
[SCHEDUTILS]: Implement set_{affinity,scheduler} and schedfromstr
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | python-schedutils/schedutils.c | 94 |
1 files changed, 92 insertions, 2 deletions
diff --git a/python-schedutils/schedutils.c b/python-schedutils/schedutils.c index 293b4fc..5ecdb35 100644 --- a/python-schedutils/schedutils.c +++ b/python-schedutils/schedutils.c @@ -18,7 +18,7 @@ static PyObject *get_affinity(PyObject *self __unused, PyObject *args) CPU_ZERO(&cpus); if (sched_getaffinity(pid, sizeof(cpus), &cpus) < 0) { - PyErr_SetString(PyExc_OSError, strerror(errno)); + PyErr_SetFromErrno(PyExc_SystemError); return NULL; } @@ -30,6 +30,37 @@ static PyObject *get_affinity(PyObject *self __unused, PyObject *args) return list; } +static PyObject *set_affinity(PyObject *self __unused, PyObject *args) +{ + int pid, nr_elements, i; + cpu_set_t cpus; + PyObject *list; + + if (!PyArg_ParseTuple(args, "iO", &pid, &list)) + return NULL; + + CPU_ZERO(&cpus); + + nr_elements = PyList_Size(list); + for (i = 0; i < nr_elements; ++i) { + int cpu = PyInt_AsLong(PyList_GetItem(list, i)); + + if (cpu >= CPU_SETSIZE) { + PyErr_SetString(PyExc_SystemError, "Invalid CPU"); + return NULL; + } + CPU_SET(cpu, &cpus); + } + + if (sched_setaffinity(pid, sizeof(cpus), &cpus) < 0) { + PyErr_SetFromErrno(PyExc_SystemError); + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + static PyObject *get_scheduler(PyObject *self __unused, PyObject *args) { int pid, scheduler; @@ -39,13 +70,33 @@ static PyObject *get_scheduler(PyObject *self __unused, PyObject *args) scheduler = sched_getscheduler(pid); if (scheduler < 0) { - PyErr_SetString(PyExc_OSError, strerror(errno)); + PyErr_SetFromErrno(PyExc_SystemError); return NULL; } return Py_BuildValue("i", scheduler); } +static PyObject *set_scheduler(PyObject *self __unused, PyObject *args) +{ + int pid, policy, priority; + struct sched_param param; + + if (!PyArg_ParseTuple(args, "iii", &pid, &policy, &priority)) + return NULL; + + memset(¶m, 0, sizeof(param)); + param.sched_priority = priority; + + if (sched_setscheduler(pid, policy, ¶m) < 0) { + PyErr_SetFromErrno(PyExc_SystemError); + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + static PyObject *schedstr(PyObject *self __unused, PyObject *args) { int scheduler; @@ -65,6 +116,30 @@ static PyObject *schedstr(PyObject *self __unused, PyObject *args) return PyString_FromString(s); } +static PyObject *schedfromstr(PyObject *self __unused, PyObject *args) +{ + int scheduler; + char *s; + + if (!PyArg_ParseTuple(args, "s", &s)) + return NULL; + + if (strcmp(s, "SCHED_OTHER") == 0) + scheduler = SCHED_OTHER; + else if (strcmp(s, "SCHED_RR") == 0) + scheduler = SCHED_RR; + else if (strcmp(s, "SCHED_FIFO") == 0) + scheduler = SCHED_FIFO; + else if (strcmp(s, "SCHED_BATCH") == 0) + scheduler = SCHED_BATCH; + else { + PyErr_SetString(PyExc_SystemError, "Unknown scheduler"); + return NULL; + } + + return Py_BuildValue("i", scheduler); +} + static struct PyMethodDef PySchedutilsModuleMethods[] = { { .ml_name = "get_affinity", @@ -72,15 +147,30 @@ static struct PyMethodDef PySchedutilsModuleMethods[] = { .ml_flags = METH_VARARGS, }, { + .ml_name = "set_affinity", + .ml_meth = (PyCFunction)set_affinity, + .ml_flags = METH_VARARGS, + }, + { .ml_name = "get_scheduler", .ml_meth = (PyCFunction)get_scheduler, .ml_flags = METH_VARARGS, }, { + .ml_name = "set_scheduler", + .ml_meth = (PyCFunction)set_scheduler, + .ml_flags = METH_VARARGS, + }, + { .ml_name = "schedstr", .ml_meth = (PyCFunction)schedstr, .ml_flags = METH_VARARGS, }, + { + .ml_name = "schedfromstr", + .ml_meth = (PyCFunction)schedfromstr, + .ml_flags = METH_VARARGS, + }, { .ml_name = NULL, }, }; |