[Libreoffice-commits] .: configure.in sal/inc set_soenv.in solenv/gbuild solenv/inc
Stephan Bergmann
sbergmann at kemper.freedesktop.org
Fri Sep 30 06:37:17 PDT 2011
configure.in | 53 ++++++++++++++++++++++++++++++++++++++-
sal/inc/rtl/instance.hxx | 2 -
set_soenv.in | 1
solenv/gbuild/gbuild.mk | 4 ++
solenv/gbuild/platform/macosx.mk | 4 ++
solenv/inc/settings.mk | 4 ++
solenv/inc/unxmacx.mk | 3 ++
7 files changed, 69 insertions(+), 2 deletions(-)
New commits:
commit 979e2c8f8b9325a5c75bfc1f388aa8f69b988d2c
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Fri Sep 30 15:36:14 2011 +0200
-fthreadsafe-statics uses a single lock on Mac OS X and thus leads to deadlock.
diff --git a/configure.in b/configure.in
index 2bf85ec..ac30704 100644
--- a/configure.in
+++ b/configure.in
@@ -3471,6 +3471,57 @@ fi
AC_SUBST(WITH_STLPORT)
dnl ===================================================================
+dnl thread-safe statics
+dnl ===================================================================
+AC_MSG_CHECKING([whether $CXX supports thread safe statics])
+unset HAVE_THREADSAFE_STATICS
+if test "$GCC" = "yes"; then
+ save_CXXFLAGS=$CXXFLAGS
+ CXXFLAGS="$CXXFLAGS -fthreadsafe-statics"
+ AC_LANG_PUSH([C++])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,)],[HAVE_THREADSAFE_STATICS=TRUE],[])
+ AC_LANG_POP([C++])
+ CXXFLAGS=$save_CXXFLAGS
+ if test "$HAVE_THREADSAFE_STATICS" = "TRUE"; then
+ dnl Some C++ runtimes use a single lock for all static variables, which
+ dnl can cause deadlock in multi-threaded applications. This is not
+ dnl easily tested here; for POSIX-based systems, if executing the
+ dnl following C++ program does not terminate then the tool chain
+ dnl apparently has this problem:
+ dnl
+ dnl #include <pthread.h>
+ dnl int h() { return 0; }
+ dnl void * g(void * unused) {
+ dnl static int n = h();
+ dnl return &n;
+ dnl }
+ dnl int f() {
+ dnl pthread_t t;
+ dnl pthread_create(&t, 0, g, 0);
+ dnl pthread_join(t, 0);
+ dnl return 0;
+ dnl }
+ dnl int main() {
+ dnl static int n = f();
+ dnl return n;
+ dnl }
+ dnl
+ dnl Mac OS X up to at least 10.7.1 is known to have this problem:
+ if test "$_os" = "Darwin"; then
+ unset HAVE_THREADSAFE_STATICS
+ AC_MSG_RESULT([broken (i.e., no)])
+ else
+ AC_MSG_RESULT([yes])
+ fi
+ else
+ AC_MSG_RESULT([no])
+ fi
+else
+ AC_MSG_RESULT([unknown (assuming no)])
+fi
+AC_SUBST(HAVE_THREADSAFE_STATICS)
+
+dnl ===================================================================
dnl visibility and c++0x features
dnl ===================================================================
if test "$GCC" = "yes"; then
@@ -3508,7 +3559,7 @@ if test "$GCC" = "yes"; then
fi
AC_MSG_CHECKING([whether $CC supports -std=c++0x without Language Defect 757])
- save_CXXFLAGS=$CFLAGS
+ save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS -std=c++0x"
AC_LANG_PUSH([C++])
diff --git a/sal/inc/rtl/instance.hxx b/sal/inc/rtl/instance.hxx
index 7080cec..bcb1791 100644
--- a/sal/inc/rtl/instance.hxx
+++ b/sal/inc/rtl/instance.hxx
@@ -386,7 +386,7 @@ namespace rtl {
using the outer class
(the one that derives from this base class)
*/
-#if (__GNUC__ >= 4)
+#if defined HAVE_THREADSAFE_STATICS
template<typename T, typename Unique>
class Static {
public:
diff --git a/set_soenv.in b/set_soenv.in
index 5e05ab1..036e282 100755
--- a/set_soenv.in
+++ b/set_soenv.in
@@ -1773,6 +1773,7 @@ ToFile( "HAVE_LD_HASH_STYLE","@HAVE_LD_HASH_STYLE@","e" );
ToFile( "WITH_LINKER_HASH_STYLE","@WITH_LINKER_HASH_STYLE@","e" );
ToFile( "HAVE_LD_BSYMBOLIC_FUNCTIONS",
"@HAVE_LD_BSYMBOLIC_FUNCTIONS@","e" );
+ToFile( "HAVE_THREADSAFE_STATICS", "@HAVE_THREADSAFE_STATICS@", "e" );
ToFile( "HAVE_CXX0X", "@HAVE_CXX0X@", "e" );
ToFile( "CXX", $CXX, "e" );
ToFile( "MINGWCXX", "@MINGWCXX@", "e" );
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
index 88a1588..393a257 100644
--- a/solenv/gbuild/gbuild.mk
+++ b/solenv/gbuild/gbuild.mk
@@ -259,6 +259,10 @@ ifeq ($(strip $(ENABLE_GRAPHITE)),TRUE)
gb_GLOBALDEFS += -DENABLE_GRAPHITE
endif
+ifeq ($(HAVE_THREADSAFE_STATICS),TRUE)
+gb_GLOBALDEFS += -DHAVE_THREADSAFE_STATICS
+endif
+
gb_GLOBALDEFS := $(sort $(gb_GLOBALDEFS))
include $(GBUILDDIR)/Deliver.mk
diff --git a/solenv/gbuild/platform/macosx.mk b/solenv/gbuild/platform/macosx.mk
index b9347d1..ba1438a 100644
--- a/solenv/gbuild/platform/macosx.mk
+++ b/solenv/gbuild/platform/macosx.mk
@@ -109,6 +109,10 @@ ifeq ($(HAVE_GCC_NO_LONG_DOUBLE),TRUE)
gb_CXXFLAGS += -Wno-long-double
endif
+ifneq ($(HAVE_THREADSAFE_STATICS),TRUE)
+gb_CXXFLAGS += -fno-threadsafe-statics
+endif
+
# these are to get g++ to switch to Objective-C++ mode
# (see toolkit module for a case where it is necessary to do it this way)
gb_OBJCXXFLAGS := -x objective-c++ -fobjc-exceptions
diff --git a/solenv/inc/settings.mk b/solenv/inc/settings.mk
index 6030f13..553d665 100644
--- a/solenv/inc/settings.mk
+++ b/solenv/inc/settings.mk
@@ -1195,6 +1195,10 @@ CFLAGS+=-DENABLE_LAYOUT_EXPERIMENTAL=0
CDEFS+=-DGSTREAMER
.ENDIF
+.IF "$(HAVE_THREADSAFE_STATICS)" == "TRUE"
+CDEFS += -DHAVE_THREADSAFE_STATICS
+.END
+
# compose flags and defines for GUI
.IF "$(TARGETTYPE)"=="GUI"
CDEFS+= $(CDEFSGUI)
diff --git a/solenv/inc/unxmacx.mk b/solenv/inc/unxmacx.mk
index 17575ad..18fd01e 100644
--- a/solenv/inc/unxmacx.mk
+++ b/solenv/inc/unxmacx.mk
@@ -113,6 +113,9 @@ CFLAGSCXX=-pipe -malign-natural -fsigned-char $(ARCH_FLAGS) -Wno-ctor-dtor-priva
.IF "$(HAVE_GCC_NO_LONG-DOUBLE)" == "TRUE"
CFLAGSCXX+= -Wno-long-double
.ENDIF
+.IF "$(HAVE_THREADSAFE_STATICS)" != "TRUE"
+CFLAGSCXX += -fno-threadsafe-statics
+.ENDIF
PICSWITCH:=-fPIC
# Other flags
More information about the Libreoffice-commits
mailing list