Use std::call_once only if it is actually available

This commit is contained in:
Enrico Forestieri 2016-08-07 04:58:41 +02:00
parent e57e008e88
commit 41e409f8f7
2 changed files with 40 additions and 0 deletions

View File

@ -247,6 +247,33 @@ AC_DEFUN([LYX_CXX_USE_REGEX],
]) ])
dnl Usage: LYX_CXX_USE_CALL_ONCE
dnl check whether we can use std::call_once and set the
dnl LYX_USE_STD_CALL_ONCE macro and conditional accordingly.
AC_DEFUN([LYX_CXX_USE_CALL_ONCE],
[AC_MSG_CHECKING([for std::call_once availability])
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS"
AC_TRY_LINK(
[
#include <mutex>
static std::once_flag flag;
], [
std::call_once(flag, [](){ return; });
], [lyx_std_call_once=yes], [lyx_std_call_once=no])
CXXFLAGS=$save_CXXFLAGS
CPPFLAGS=$save_CPPFLAGS
AC_MSG_RESULT([$lyx_std_call_once])
if test $lyx_std_call_once = yes ; then
AC_DEFINE([LYX_USE_STD_CALL_ONCE], 1, [define to 1 if std::call_once is supported by the compiler])
fi
AM_CONDITIONAL([LYX_USE_STD_CALL_ONCE], test $lyx_std_call_once = yes)
])
dnl Usage: LYX_LIB_STDCXX: set lyx_cv_lib_stdcxx to yes if the STL library is libstdc++. dnl Usage: LYX_LIB_STDCXX: set lyx_cv_lib_stdcxx to yes if the STL library is libstdc++.
AC_DEFUN([LYX_LIB_STDCXX], AC_DEFUN([LYX_LIB_STDCXX],
[AC_CACHE_CHECK([whether STL is libstdc++], [AC_CACHE_CHECK([whether STL is libstdc++],
@ -284,6 +311,7 @@ LYX_CXX_CXX11_FLAGS
LYX_LIB_STDCXX LYX_LIB_STDCXX
LYX_LIB_STDCXX_CXX11_ABI LYX_LIB_STDCXX_CXX11_ABI
LYX_CXX_USE_REGEX LYX_CXX_USE_REGEX
LYX_CXX_USE_CALL_ONCE
AC_LANG_POP(C++) AC_LANG_POP(C++)
if test $lyx_cv_lib_stdcxx = "yes" ; then if test $lyx_cv_lib_stdcxx = "yes" ; then

View File

@ -93,12 +93,24 @@ lyx::Converter const * setConverter(string const & from)
} }
// Show the error only once // Show the error only once
#ifdef LYX_USE_STD_CALL_ONCE
// This is thread-safe.
static once_flag flag; static once_flag flag;
call_once(flag, [&](){ call_once(flag, [&](){
LYXERR0("PreviewLoader::startLoading()\n" LYXERR0("PreviewLoader::startLoading()\n"
<< "No converter from \"" << from << "No converter from \"" << from
<< "\" format has been defined."); << "\" format has been defined.");
}); });
#else
// This is not thread-safe.
static bool first = true;
if (first) {
first = false;
LYXERR0("PreviewLoader::startLoading()\n"
<< "No converter from \"" << from
<< "\" format has been defined.");
}
#endif
return 0; return 0;
} }