mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-09-19 22:40:26 +00:00
Make theWordList() thread safe.
Without this, you get crashes in a few second when you set the autosave interval to one second and edit quickly (typing new words etc). The reason is that the cloned buffer wants to insert words into the word list and remove them again, but it lives in a different thread.
This commit is contained in:
parent
e64954e7d3
commit
f5cf3705d5
@ -18,6 +18,8 @@
|
|||||||
#include "support/lassert.h"
|
#include "support/lassert.h"
|
||||||
#include "support/weighted_btree.h"
|
#include "support/weighted_btree.h"
|
||||||
|
|
||||||
|
#include <QThreadStorage>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -26,26 +28,37 @@ namespace lyx {
|
|||||||
|
|
||||||
///
|
///
|
||||||
typedef map<string, WordList *> GlobalWordList;
|
typedef map<string, WordList *> GlobalWordList;
|
||||||
GlobalWordList theGlobalWordList;
|
// Each thread uses its own word list, but only the one of the GUI thread is
|
||||||
|
// used to do real work. The others are only neded to prevent simultanous
|
||||||
|
// write access e.g. from a cloned buffer and a true document buffer.
|
||||||
|
QThreadStorage<GlobalWordList *> theGlobalWordList;
|
||||||
|
|
||||||
|
|
||||||
WordList * theWordList(string const & lang)
|
WordList * theWordList(string const & lang)
|
||||||
{
|
{
|
||||||
GlobalWordList::iterator it = theGlobalWordList.find(lang);
|
if (!theGlobalWordList.hasLocalData())
|
||||||
if (it != theGlobalWordList.end())
|
theGlobalWordList.setLocalData(new GlobalWordList);
|
||||||
|
GlobalWordList * globalWordList = theGlobalWordList.localData();
|
||||||
|
GlobalWordList::iterator it = globalWordList->find(lang);
|
||||||
|
if (it != globalWordList->end())
|
||||||
return it->second;
|
return it->second;
|
||||||
else
|
else {
|
||||||
theGlobalWordList[lang] = new WordList;
|
WordList * wl = new WordList;
|
||||||
return theGlobalWordList[lang];
|
(*globalWordList)[lang] = wl;
|
||||||
|
return wl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void WordList::cleanupWordLists()
|
void WordList::cleanupWordLists()
|
||||||
{
|
{
|
||||||
GlobalWordList::const_iterator it = theGlobalWordList.begin();
|
if (!theGlobalWordList.hasLocalData())
|
||||||
for (; it != theGlobalWordList.end(); ++it)
|
return;
|
||||||
|
GlobalWordList * globalWordList = theGlobalWordList.localData();
|
||||||
|
GlobalWordList::const_iterator it = globalWordList->begin();
|
||||||
|
for (; it != globalWordList->end(); ++it)
|
||||||
delete it->second;
|
delete it->second;
|
||||||
theGlobalWordList.clear();
|
globalWordList->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ What's new
|
|||||||
|
|
||||||
* INTERNALS
|
* INTERNALS
|
||||||
|
|
||||||
|
- Improve thread-safety
|
||||||
|
|
||||||
|
|
||||||
* DOCUMENTATION AND LOCALIZATION
|
* DOCUMENTATION AND LOCALIZATION
|
||||||
|
Loading…
Reference in New Issue
Block a user