diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index 36e08853f0..7bddfb09da 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -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 + 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++. AC_DEFUN([LYX_LIB_STDCXX], [AC_CACHE_CHECK([whether STL is libstdc++], @@ -284,6 +311,7 @@ LYX_CXX_CXX11_FLAGS LYX_LIB_STDCXX LYX_LIB_STDCXX_CXX11_ABI LYX_CXX_USE_REGEX +LYX_CXX_USE_CALL_ONCE AC_LANG_POP(C++) if test $lyx_cv_lib_stdcxx = "yes" ; then diff --git a/src/graphics/PreviewLoader.cpp b/src/graphics/PreviewLoader.cpp index f8c1d7e6c3..88f49b013e 100644 --- a/src/graphics/PreviewLoader.cpp +++ b/src/graphics/PreviewLoader.cpp @@ -93,12 +93,24 @@ lyx::Converter const * setConverter(string const & from) } // Show the error only once +#ifdef LYX_USE_STD_CALL_ONCE + // This is thread-safe. static once_flag flag; call_once(flag, [&](){ LYXERR0("PreviewLoader::startLoading()\n" << "No converter from \"" << from << "\" 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; }