commit f4ed3dc6b50f144ac79497008f6904ebcb39cfd4
Author: Georg Baum <[email protected]>
Date: Mon Jul 7 21:35:53 2014 +0200
Make include and bibitem insets threadsafe
Using a mutex to ensure that the generated filenames and ids are still
unique.
diff --git a/src/insets/InsetBibitem.cpp b/src/insets/InsetBibitem.cpp
index 2840ad5..bf3929c 100644
--- a/src/insets/InsetBibitem.cpp
+++ b/src/insets/InsetBibitem.cpp
@@ -41,6 +41,7 @@
#include "support/docstream.h"
#include "support/gettext.h"
#include "support/lstrings.h"
+#include "support/mutex.h"
using namespace std;
using namespace lyx::support;
@@ -49,6 +50,7 @@ namespace lyx {
int InsetBibitem::key_counter = 0;
+static Mutex counter_mutex;
docstring const key_prefix = from_ascii("key-");
@@ -56,8 +58,10 @@ InsetBibitem::InsetBibitem(Buffer * buf, InsetCommandParams
const & p)
: InsetCommand(buf, p)
{
buffer().invalidateBibinfoCache();
- if (getParam("key").empty())
+ if (getParam("key").empty()) {
+ Mutex::Locker lock(&counter_mutex);
setParam("key", key_prefix + convert<docstring>(++key_counter));
+ }
}
@@ -197,6 +201,7 @@ void InsetBibitem::read(Lexer & lex)
if (prefixIs(getParam("key"), key_prefix)) {
int const key =
convert<int>(getParam("key").substr(key_prefix.length()));
+ Mutex::Locker lock(&counter_mutex);
key_counter = max(key_counter, key);
}
}
diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp
index d531662..e3960c4 100644
--- a/src/insets/InsetInclude.cpp
+++ b/src/insets/InsetInclude.cpp
@@ -61,6 +61,7 @@
#include "support/lassert.h"
#include "support/lstrings.h" // contains
#include "support/lyxalgo.h"
+#include "support/mutex.h"
#include "support/bind.h"
@@ -77,6 +78,8 @@ namespace {
docstring const uniqueID()
{
static unsigned int seed = 1000;
+ static Mutex mutex;
+ Mutex::Locker lock(&mutex);
return "file" + convert<docstring>(++seed);
}