From 946fa8031fcf42a8d92897a5953c5052671be901 Mon Sep 17 00:00:00 2001 From: "mark.dickinson" Date: Fri, 20 Nov 2009 19:30:22 +0000 Subject: [PATCH] Issue #7272: Add configure test to detect whether sem_open works properly, and use this to skip test_multiprocessing on platforms where sem_open raises a signal. This should fix some FreeBSD buildbot failures for test_multiprocessing. git-svn-id: http://svn.python.org/projects/python/trunk@76432 6015fed2-1504-0410-9fe1-9d1591cc4771 --- Lib/test/test_multiprocessing.py | 2 +- Modules/_multiprocessing/multiprocessing.c | 5 +- Modules/_multiprocessing/multiprocessing.h | 2 +- configure | 85 ++++++++++++++++++++++++++++++ configure.in | 35 ++++++++++++ setup.py | 3 +- 6 files changed, 127 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py index 29c7ff961b..b16629b69a 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -17,7 +17,7 @@ import copy import socket import random import logging -import test_support +from test import test_support from StringIO import StringIO diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c index 9008f31a18..cb6725bc33 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -250,7 +250,8 @@ init_multiprocessing(void) Py_INCREF(&ConnectionType); PyModule_AddObject(module, "Connection", (PyObject*)&ConnectionType); -#if defined(MS_WINDOWS) || defined(HAVE_SEM_OPEN) +#if defined(MS_WINDOWS) || \ + (defined(HAVE_SEM_OPEN) && !defined(HAVE_BROKEN_POSIX_SEMAPHORES)) /* Add SemLock type to module */ if (PyType_Ready(&SemLockType) < 0) return; @@ -297,7 +298,7 @@ init_multiprocessing(void) Py_DECREF(temp); Py_DECREF(value); return; } \ Py_DECREF(value) -#ifdef HAVE_SEM_OPEN +#if defined(HAVE_SEM_OPEN) && !defined(HAVE_BROKEN_POSIX_SEMAPHORES) ADD_FLAG(HAVE_SEM_OPEN); #endif #ifdef HAVE_SEM_TIMEDWAIT diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h index 7a79d6ed01..7c98ca782f 100644 --- a/Modules/_multiprocessing/multiprocessing.h +++ b/Modules/_multiprocessing/multiprocessing.h @@ -27,7 +27,7 @@ # include # include # include /* htonl() and ntohl() */ -# ifdef HAVE_SEM_OPEN +# if defined(HAVE_SEM_OPEN) && !defined(HAVE_BROKEN_POSIX_SEMAPHORES) # include typedef sem_t *SEM_HANDLE; # endif diff --git a/configure b/configure index cb8001cdbb..aae7494c67 100755 --- a/configure +++ b/configure @@ -23782,6 +23782,91 @@ fi LIBS_SAVE=$LIBS LIBS="$LIBS $LIBM" +# For multiprocessing module, check that sem_open +# actually works. For FreeBSD versions <= 7.2, +# the kernel module that provides POSIX semaphores +# isn't loaded by default, so an attempt to call +# sem_open results in a 'Signal 12' error. +{ echo "$as_me:$LINENO: checking whether POSIX semaphores are enabled" >&5 +echo $ECHO_N "checking whether POSIX semaphores are enabled... $ECHO_C" >&6; } +if test "${ac_cv_posix_semaphores_enabled+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_posix_semaphores_enabled=yes +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +#include +#include + +int main(void) { + sem_t *a = sem_open("/autoconf", O_CREAT, S_IRUSR|S_IWUSR, 0); + if (a == SEM_FAILED) { + perror("sem_open"); + return 1; + } + sem_close(a); + return 0; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_posix_semaphores_enabled=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_posix_semaphores_enabled=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +fi + +{ echo "$as_me:$LINENO: result: $ac_cv_posix_semaphores_enabled" >&5 +echo "${ECHO_T}$ac_cv_posix_semaphores_enabled" >&6; } +if test $ac_cv_posix_semaphores_enabled = no +then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_BROKEN_POSIX_SEMAPHORES 1 +_ACEOF + +fi + + # Multiprocessing check for broken sem_getvalue { echo "$as_me:$LINENO: checking for broken sem_getvalue" >&5 echo $ECHO_N "checking for broken sem_getvalue... $ECHO_C" >&6; } diff --git a/configure.in b/configure.in index c3a167847a..48043ada74 100644 --- a/configure.in +++ b/configure.in @@ -3387,6 +3387,41 @@ fi LIBS_SAVE=$LIBS LIBS="$LIBS $LIBM" +# For multiprocessing module, check that sem_open +# actually works. For FreeBSD versions <= 7.2, +# the kernel module that provides POSIX semaphores +# isn't loaded by default, so an attempt to call +# sem_open results in a 'Signal 12' error. +AC_MSG_CHECKING(whether POSIX semaphores are enabled) +AC_CACHE_VAL(ac_cv_posix_semaphores_enabled, +AC_TRY_RUN([ +#include +#include +#include +#include +#include + +int main(void) { + sem_t *a = sem_open("/autoconf", O_CREAT, S_IRUSR|S_IWUSR, 0); + if (a == SEM_FAILED) { + perror("sem_open"); + return 1; + } + sem_close(a); + return 0; +} +], ac_cv_posix_semaphores_enabled=yes, + ac_cv_posix_semaphores_enabled=no, + ac_cv_posix_semaphores_enabled=yes) +) +AC_MSG_RESULT($ac_cv_posix_semaphores_enabled) +if test $ac_cv_posix_semaphores_enabled = no +then + AC_DEFINE(HAVE_BROKEN_POSIX_SEMAPHORES, 1, + [Define if the Posix semaphores do not work on your system]) +fi + + # Multiprocessing check for broken sem_getvalue AC_MSG_CHECKING(for broken sem_getvalue) AC_CACHE_VAL(ac_cv_broken_sem_getvalue, diff --git a/setup.py b/setup.py index 0a4dc52a55..75ff11fc0c 100644 --- a/setup.py +++ b/setup.py @@ -1315,7 +1315,8 @@ class PyBuildExt(build_ext): multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c', '_multiprocessing/socket_connection.c' ] - if sysconfig.get_config_var('HAVE_SEM_OPEN'): + if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not + sysconfig.get_config_var('HAVE_BROKEN_POSIX_SEMAPHORES')): multiprocessing_srcs.append('_multiprocessing/semaphore.c') if sysconfig.get_config_var('WITH_THREAD'): -- 2.11.4.GIT