Parcourir la source

[mavericks] disable some thread-related death tests on OS X 10.9

pthread_cond_destroy() doesn't meet the test's assumption.  the mutext test
would still pass, but this is a minor case anyway, so it's probably okay
to just disable both rather introduce more macro variables.
JINMEI Tatuya il y a 11 ans
Parent
commit
c3cf34189e

+ 12 - 1
configure.ac

@@ -218,6 +218,7 @@ AC_HELP_STRING([--disable-setproctitle-check],
 # OS dependent configuration
 # OS dependent configuration
 SET_ENV_LIBRARY_PATH=no
 SET_ENV_LIBRARY_PATH=no
 ENV_LIBRARY_PATH=LD_LIBRARY_PATH
 ENV_LIBRARY_PATH=LD_LIBRARY_PATH
+bind10_undefined_pthread_behavior=no
 
 
 case "$host" in
 case "$host" in
 *-solaris*)
 *-solaris*)
@@ -229,13 +230,20 @@ case "$host" in
 	# Destroying locked mutexes, condition variables being waited
 	# Destroying locked mutexes, condition variables being waited
 	# on, etc. are undefined behavior on Solaris, so we set it as
 	# on, etc. are undefined behavior on Solaris, so we set it as
 	# such here.
 	# such here.
-	AC_DEFINE([HAS_UNDEFINED_PTHREAD_BEHAVIOR], [1], [Does this platform have some undefined pthreads behavior?])
+	bind10_undefined_pthread_behavior=yes
 	;;
 	;;
 *-apple-darwin*)
 *-apple-darwin*)
 	# Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use
 	# Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use
 	# (RFC2292 or RFC3542).
 	# (RFC2292 or RFC3542).
 	CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"
 	CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"
 
 
+	# In OS X 10.9 (and possibly any future versions?) pthread_cond_destroy
+	# doesn't work as documented, which makes some of unit tests fail.
+	osx_version=`/usr/bin/sw_vers -productVersion`
+	if [ test $osx_version = "10.9" ]; then
+		bind10_undefined_pthread_behavior=yes
+	fi
+
 	# libtool doesn't work perfectly with Darwin: libtool embeds the
 	# libtool doesn't work perfectly with Darwin: libtool embeds the
 	# final install path in dynamic libraries and our loadable python
 	# final install path in dynamic libraries and our loadable python
 	# modules always refer to that path even if it's loaded within the
 	# modules always refer to that path even if it's loaded within the
@@ -258,6 +266,9 @@ esac
 AM_CONDITIONAL(SET_ENV_LIBRARY_PATH, test $SET_ENV_LIBRARY_PATH = yes)
 AM_CONDITIONAL(SET_ENV_LIBRARY_PATH, test $SET_ENV_LIBRARY_PATH = yes)
 AC_SUBST(SET_ENV_LIBRARY_PATH)
 AC_SUBST(SET_ENV_LIBRARY_PATH)
 AC_SUBST(ENV_LIBRARY_PATH)
 AC_SUBST(ENV_LIBRARY_PATH)
+if [ test $bind10_undefined_pthread_behavior = "yes" ]; then
+   AC_DEFINE([HAS_UNDEFINED_PTHREAD_BEHAVIOR], [1], [Does this platform have some undefined pthreads behavior?])
+fi
 
 
 # Our experiments have shown Solaris 10 has broken support for the
 # Our experiments have shown Solaris 10 has broken support for the
 # IPV6_USE_MIN_MTU socket option for getsockopt(); it doesn't return the value
 # IPV6_USE_MIN_MTU socket option for getsockopt(); it doesn't return the value

+ 7 - 3
src/lib/util/threads/tests/condvar_unittest.cc

@@ -142,8 +142,13 @@ signalAndWait(CondVar* condvar, Mutex* mutex) {
     condvar->wait(*mutex);
     condvar->wait(*mutex);
 }
 }
 
 
-#ifndef HAS_UNDEFINED_PTHREAD_BEHAVIOR
-TEST_F(CondVarTest, destroyWhileWait) {
+TEST_F(CondVarTest,
+#ifdef HAS_UNDEFINED_PTHREAD_BEHAVIOR
+       DISABLED_destroyWhileWait
+#else
+       destroyWhileWait
+#endif
+) {
     // We'll destroy a CondVar object while the thread is still waiting
     // We'll destroy a CondVar object while the thread is still waiting
     // on it.  This will trigger an assertion failure.
     // on it.  This will trigger an assertion failure.
     if (!isc::util::unittests::runningOnValgrind()) {
     if (!isc::util::unittests::runningOnValgrind()) {
@@ -155,7 +160,6 @@ TEST_F(CondVarTest, destroyWhileWait) {
             }, "");
             }, "");
     }
     }
 }
 }
-#endif // !HAS_UNDEFINED_PTHREAD_BEHAVIOR
 
 
 #ifdef ENABLE_DEBUG
 #ifdef ENABLE_DEBUG
 
 

+ 7 - 3
src/lib/util/threads/tests/lock_unittest.cc

@@ -86,9 +86,14 @@ TEST(MutexTest, lockNonBlocking) {
 
 
 #endif // ENABLE_DEBUG
 #endif // ENABLE_DEBUG
 
 
-#ifndef HAS_UNDEFINED_PTHREAD_BEHAVIOR
 // Destroying a locked mutex is a bad idea as well
 // Destroying a locked mutex is a bad idea as well
-TEST(MutexTest, destroyLocked) {
+TEST(MutexTest,
+#ifdef HAS_UNDEFINED_PTHREAD_BEHAVIOR
+     DISABLED_destroyLocked
+#else
+     destroyLocked
+#endif
+) {
     if (!isc::util::unittests::runningOnValgrind()) {
     if (!isc::util::unittests::runningOnValgrind()) {
         EXPECT_DEATH_IF_SUPPORTED({
         EXPECT_DEATH_IF_SUPPORTED({
             Mutex* mutex = new Mutex;
             Mutex* mutex = new Mutex;
@@ -99,7 +104,6 @@ TEST(MutexTest, destroyLocked) {
         }, "");
         }, "");
     }
     }
 }
 }
-#endif // !HAS_UNDEFINED_PTHREAD_BEHAVIOR
 
 
 // In this test, we try to check if a mutex really locks. We could try that
 // In this test, we try to check if a mutex really locks. We could try that
 // with a deadlock, but that's not practical (the test would not end).
 // with a deadlock, but that's not practical (the test would not end).