From: Georg Baum Date: Mon, 5 Jan 2015 20:44:37 +0000 (+0100) Subject: Fix multithreading crash (bug #9366) X-Git-Tag: 2.1.3~27 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=f067babf6e9832259b93aec65aa3874351e51280;p=features.git 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. --- 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