if test "$SUNCXX" = "yes"; then
CXX_VERSION=`$CXX -V 2> /dev/null | head -1`
CXXFLAGS="$CXXFLAGS -library=stlport4 -features=tmplife -features=tmplrefstatic"
+KEA_CXXFLAGS="$KEA_CXXFLAGS -mt"
MULTITHREADING_FLAG="-mt"
fi
KEA_CXXFLAGS="$KEA_CXXFLAGS -Wall -Wextra -Wnon-virtual-dtor -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare"
case "$host" in
*-solaris*)
+ KEA_CXXFLAGS="$KEA_CXXFLAGS -pthreads"
MULTITHREADING_FLAG=-pthreads
# In Solaris, IN6ADDR_ANY_INIT and IN6ADDR_LOOPBACK_INIT need -Wno-missing-braces
KEA_CXXFLAGS="$KEA_CXXFLAGS -Wno-missing-braces"
MULTITHREADING_FLAG=
;;
*)
+ KEA_CXXFLAGS="$KEA_CXXFLAGS -pthread"
MULTITHREADING_FLAG=-pthread
;;
esac
done
fi
-LOG4CPLUS_LIBS="$LOG4CPLUS_LIBS -llog4cplus $MULTITHREADING_FLAG"
+LOG4CPLUS_LIBS="$LOG4CPLUS_LIBS -llog4cplus"
AC_SUBST(LOG4CPLUS_LIBS)
AC_SUBST(LOG4CPLUS_INCLUDES)
CPPFLAGS_SAVED=$CPPFLAGS
CPPFLAGS="$LOG4CPLUS_INCLUDES $CPPFLAGS"
LIBS_SAVED="$LIBS"
-LIBS="$LOG4CPLUS_LIBS $LIBS"
+LIBS="$LOG4CPLUS_LIBS $MULTITHREADING_FLAG $LIBS"
AC_CHECK_HEADERS([log4cplus/logger.h],,AC_MSG_ERROR([Missing required header files.]))
AC_LINK_IFELSE(
CPPFLAGS="$CPPFLAGS $CPPFLAGS_BOOST_THREADCONF"
# Can be required by gtest, boost and perhaps still asio
-PTHREAD_LDFLAGS=
-AC_CHECK_LIB(pthread, pthread_create,[ PTHREAD_LDFLAGS=-lpthread ], [])
-AC_SUBST(PTHREAD_LDFLAGS)
-AC_SUBST(MULTITHREADING_FLAG)
+AC_CHECK_LIB(pthread, pthread_create,[ LDFLAGS="$LDFLAGS -lpthread" ], [])
#
# Check availability of gtest, which will be used for unit tests.
GTEST_LDFLAGS="\$(top_builddir)/ext/gtest/libgtest.a"
DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest-source=$GTEST_SOURCE"
GTEST_INCLUDES="-I$GTEST_SOURCE -I$GTEST_SOURCE/include"
- # See $GTEST_SOURCE/include/gtest/internal/gtest-port.h
- # about GTEST_HAS_PTHREAD.
- case "$host" in
- *-solaris*|*-linux*|*-hpux*)
- GTEST_LDADD="$GTEST_LDADD $PTHREAD_LDFLAGS"
- ;;
- esac
fi
if test "$gtest_path" != "no" ; then
GTEST_LDFLAGS="-L$dir/lib"
GTEST_LDADD="-lgtest"
GTEST_FOUND="true"
- # There is no gtest-config script on this
- # system, which is supposed to inform us
- # whether we need pthreads as well (a
- # gtest compile-time option). So we still
- # need to test that manually.
- CPPFLAGS_SAVED="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $GTEST_INCLUDES"
- LDFLAGS_SAVED="$LDFLAGS"
- LDFLAGS="$LDFLAGS $GTEST_LDFLAGS"
- LIBS_SAVED=$LIBS
- LIBS="$LIBS $GTEST_LDADD"
- AC_MSG_CHECKING([Checking whether gtest tests need pthreads])
- # First try to compile without pthreads
- AC_TRY_LINK([
- #include <gtest/gtest.h>
- ],[
- int i = 0;
- char* c = NULL;
- ::testing::InitGoogleTest(&i, &c);
- return (0);
- ],
- [ AC_MSG_RESULT(no) ],
- [
- LIBS="$SAVED_LIBS $GTEST_LDADD $PTHREAD_LDFLAGS"
- # Now try to compile with pthreads
- AC_TRY_LINK([
- #include <gtest/gtest.h>
- ],[
- int i = 0;
- char* c = NULL;
- ::testing::InitGoogleTest(&i, &c);
- return (0);
- ],
- [ AC_MSG_RESULT(yes)
- GTEST_LDADD="$GTEST_LDADD $PTHREAD_LDFLAGS"
- ],
- # Apparently we can't compile it at all
- [ AC_MSG_ERROR(unable to compile with gtest) ])
- ])
- CPPFLAGS=$CPPFLAGS_SAVED
- LDFLAGS=$LDFLAGS_SAVED
- LIBS=$LIBS_SAVED
break
fi
done
# Doesn't seem to be required?
CPPFLAGS="$CPPFLAGS -DBOOST_ASIO_HEADER_ONLY"
#
-# Disable threads: Currently we don't use them.
+# Disable threads: they seems to break things on some systems
CPPFLAGS="$CPPFLAGS -DBOOST_ASIO_DISABLE_THREADS=1"
# We tried to stay header only
ProcessSpawnImpl::spawn() {
// Protect us against SIGCHLD signals
sigset_t sset;
+ sigset_t osset;
sigemptyset(&sset);
sigaddset(&sset, SIGCHLD);
- sigprocmask(SIG_BLOCK, &sset, 0);
+ pthread_sigmask(SIG_BLOCK, &sset, &osset);
+ if (sigismember(&osset, SIGCHLD)) {
+ isc_throw(ProcessSpawnError,
+ "spawn() called from a thread where SIGCHLD is blocked");
+ }
+
// Create the child
pid_t pid = fork();
if (pid < 0) {
} else if (pid == 0) {
// We're in the child process.
- sigprocmask(SIG_UNBLOCK, &sset, 0);
+ sigprocmask(SIG_SETMASK, &osset, 0);
// Run the executable.
if (execvp(executable_.c_str(), args_) != 0) {
// We may end up here if the execvp failed, e.g. as a result
}
// We're in the parent process.
- process_state_.insert(std::pair<pid_t, ProcessState>(pid, ProcessState()));
- sigprocmask(SIG_UNBLOCK, &sset, 0);
+ try {
+ process_state_.insert(
+ std::pair<pid_t, ProcessState>(pid, ProcessState()));
+ } catch(...) {
+ pthread_sigmask(SIG_SETMASK, &osset, 0);
+ throw;
+ }
+ pthread_sigmask(SIG_SETMASK, &osset, 0);
return (pid);
}