From c5fce4ded24da1624abf6574ed0dbf762a5079e8 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 2 Aug 2011 18:07:32 -0500 Subject: [PATCH] check individually for some for sched_ functions --- Lib/test/test_posix.py | 4 ++-- Modules/posixmodule.c | 30 ++++++++++++++++++++++++++++++ configure | 2 +- configure.in | 2 +- pyconfig.h.in | 9 +++++++++ 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 1c2a4da3c77..a0fefbc98a7 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -851,7 +851,7 @@ class PosixTester(unittest.TestCase): self.assertRaises(OSError, posix.sched_get_priority_min, -23) self.assertRaises(OSError, posix.sched_get_priority_max, -23) - @requires_sched_h + @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler") def test_get_and_set_scheduler_and_param(self): possible_schedulers = [sched for name, sched in posix.__dict__.items() if name.startswith("SCHED_")] @@ -882,7 +882,7 @@ class PosixTester(unittest.TestCase): param = posix.sched_param(sched_priority=-large) self.assertRaises(OverflowError, posix.sched_setparam, 0, param) - @requires_sched_h + @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function") def test_sched_rr_get_interval(self): interval = posix.sched_rr_get_interval(0) self.assertIsInstance(interval, float) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d4ba9cf8c19..d7a03cef61b 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4585,6 +4585,8 @@ posix_sched_get_priority_min(PyObject *self, PyObject *args) return PyLong_FromLong(min); } +#ifdef HAVE_SCHED_SETSCHEDULER + PyDoc_STRVAR(posix_sched_getscheduler__doc__, "sched_getscheduler(pid)\n\n\ Get the scheduling policy for the process with a PID of *pid*.\n\ @@ -4604,6 +4606,10 @@ posix_sched_getscheduler(PyObject *self, PyObject *args) return PyLong_FromLong(policy); } +#endif + +#if defined(HAVE_SCHED_SETSCHEDULER) || defined(HAVE_SCHED_SETPARAM) + static PyObject * sched_param_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { @@ -4656,6 +4662,10 @@ convert_sched_param(PyObject *param, struct sched_param *res) return 1; } +#endif + +#ifdef HAVE_SCHED_SETSCHEDULER + PyDoc_STRVAR(posix_sched_setscheduler__doc__, "sched_setscheduler(pid, policy, param)\n\n\ Set the scheduling policy, *policy*, for *pid*.\n\ @@ -4677,6 +4687,10 @@ posix_sched_setscheduler(PyObject *self, PyObject *args) Py_RETURN_NONE; } +#endif + +#ifdef HAVE_SCHED_SETPARAM + PyDoc_STRVAR(posix_sched_getparam__doc__, "sched_getparam(pid) -> sched_param\n\n\ Returns scheduling parameters for the process with *pid* as an instance of the\n\ @@ -4724,6 +4738,10 @@ posix_sched_setparam(PyObject *self, PyObject *args) Py_RETURN_NONE; } +#endif + +#ifdef HAVE_SCHED_RR_GET_INTERVAL + PyDoc_STRVAR(posix_sched_rr_get_interval__doc__, "sched_rr_get_interval(pid) -> float\n\n\ Return the round-robin quantum for the process with PID *pid* in seconds."); @@ -4741,6 +4759,8 @@ posix_sched_rr_get_interval(PyObject *self, PyObject *args) return PyFloat_FromDouble((double)interval.tv_sec + 1e-9*interval.tv_nsec); } +#endif + PyDoc_STRVAR(posix_sched_yield__doc__, "sched_yield()\n\n\ Voluntarily relinquish the CPU."); @@ -10054,11 +10074,21 @@ static PyMethodDef posix_methods[] = { #ifdef HAVE_SCHED_H {"sched_get_priority_max", posix_sched_get_priority_max, METH_VARARGS, posix_sched_get_priority_max__doc__}, {"sched_get_priority_min", posix_sched_get_priority_min, METH_VARARGS, posix_sched_get_priority_min__doc__}, +#ifdef HAVE_SCHED_SETPARAM {"sched_getparam", posix_sched_getparam, METH_VARARGS, posix_sched_getparam__doc__}, +#endif +#ifdef HAVE_SCHED_SETSCHEDULER {"sched_getscheduler", posix_sched_getscheduler, METH_VARARGS, posix_sched_getscheduler__doc__}, +#endif +#ifdef HAVE_SCHED_RR_GET_INTERVAL {"sched_rr_get_interval", posix_sched_rr_get_interval, METH_VARARGS, posix_sched_rr_get_interval__doc__}, +#endif +#ifdef HAVE_SCHED_SETPARAM {"sched_setparam", posix_sched_setparam, METH_VARARGS, posix_sched_setparam__doc__}, +#endif +#ifdef HAVE_SCHED_SETSCHEDULER {"sched_setscheduler", posix_sched_setscheduler, METH_VARARGS, posix_sched_setscheduler__doc__}, +#endif {"sched_yield", posix_sched_yield, METH_NOARGS, posix_sched_yield__doc__}, #ifdef HAVE_SCHED_SETAFFINITY {"sched_setaffinity", posix_sched_setaffinity, METH_VARARGS, posix_sched_setaffinity__doc__}, diff --git a/configure b/configure index c4b28d602d9..c96306d6479 100755 --- a/configure +++ b/configure @@ -9339,7 +9339,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ select sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ - sched_setaffinity \ + sched_setaffinity sched_setscheduler sched_setparam sched_rr_get_interval \ sigaction sigaltstack siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ diff --git a/configure.in b/configure.in index ae1caa69672..ec9a24a08fd 100644 --- a/configure.in +++ b/configure.in @@ -2537,7 +2537,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ select sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ - sched_setaffinity \ + sched_setaffinity sched_setscheduler sched_setparam sched_rr_get_interval \ sigaction sigaltstack siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ diff --git a/pyconfig.h.in b/pyconfig.h.in index 0544ba3d225..eed1ff78ac5 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -653,9 +653,18 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H +/* Define to 1 if you have the `sched_rr_get_interval' function. */ +#undef HAVE_SCHED_RR_GET_INTERVAL + /* Define to 1 if you have the `sched_setaffinity' function. */ #undef HAVE_SCHED_SETAFFINITY +/* Define to 1 if you have the `sched_setparam' function. */ +#undef HAVE_SCHED_SETPARAM + +/* Define to 1 if you have the `sched_setscheduler' function. */ +#undef HAVE_SCHED_SETSCHEDULER + /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT