From f067babf6e9832259b93aec65aa3874351e51280 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Mon, 5 Jan 2015 21:44:37 +0100 Subject: [PATCH] Fix multithreading crash (bug #9366) This minimal fix makes the crash go away on my machine. A much more complete fix is in master (and will be futher extended), but for 2.1.x we'll do only minimal changes. --- src/Language.cpp | 6 ++++++ src/Language.h | 2 +- src/support/lstrings.h | 13 +++++++++++++ status.21x | 3 +++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Language.cpp b/src/Language.cpp index e6f7f9ed6a..6b624fc21b 100644 --- a/src/Language.cpp +++ b/src/Language.cpp @@ -38,6 +38,12 @@ Language const * latex_language = 0; Language const * reset_language = 0; +std::string const Language::babel() const +{ + return deep_copy(babel_); +} + + bool Language::isPolyglossiaExclusive() const { return babel().empty() && !polyglossia().empty() && requires().empty(); diff --git a/src/Language.h b/src/Language.h index c912326a89..7b6410d168 100644 --- a/src/Language.h +++ b/src/Language.h @@ -35,7 +35,7 @@ public: /// LyX language name std::string const & lang() const { return lang_; } /// Babel language name - std::string const & babel() const { return babel_; } + std::string const babel() const; /// polyglossia language name std::string const & polyglossia() const { return polyglossia_name_; } /// polyglossia language options diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 20a73c4a4d..3a69df4cdb 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -24,6 +24,19 @@ namespace lyx { namespace support { +/// Helper to enforce creating a deep copy of lyx::docstring or std::string +/// even if std::basic_string uses copy-on-write as in GNU libstdc++. +/// \sa https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21334 +template +typename std::basic_string +deep_copy(typename std::basic_string const & src) +{ + typedef typename std::basic_string String; + // Use constructor with two arguments to support strings with embedded + // \0 characters + return String(src.c_str(), src.length()); +} + /// Compare \p s and \p s2, ignoring the case. /// Does not depend on the locale. int compare_no_case(docstring const & s, docstring const & s2); diff --git a/status.21x b/status.21x index b591ba20cc..7f199e4251 100644 --- a/status.21x +++ b/status.21x @@ -158,6 +158,9 @@ What's new - Fix logic of "Maintain aspect ratio" checkbox in the graphics dialog (bug 9357). +- Fix most frequent reason for crash while editing with open view source + window (bug 9336). + * INTERNALS -- 2.39.5