Make createBufferTmpDir() threadsafe

This must not use thread local storage, since the generated directories are
all in the same parent directory which is unique per running LyX instance.
This commit is contained in:
Georg Baum 2014-07-05 12:31:12 +02:00
parent 0de4bc224a
commit 4bfca60359

View File

@ -97,6 +97,7 @@
#include "support/gzstream.h" #include "support/gzstream.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/lyxalgo.h" #include "support/lyxalgo.h"
#include "support/mutex.h"
#include "support/os.h" #include "support/os.h"
#include "support/Package.h" #include "support/Package.h"
#include "support/PathChanger.h" #include "support/PathChanger.h"
@ -353,13 +354,20 @@ private:
/// Creates the per buffer temporary directory /// Creates the per buffer temporary directory
static FileName createBufferTmpDir() static FileName createBufferTmpDir()
{ {
// FIXME THREAD // FIXME This would be the ideal application for a TempDir class (like
// TempFile but for directories)
string counter;
{
static int count; static int count;
static Mutex mutex;
Mutex::Locker locker(&mutex);
counter = convert<string>(count++);
}
// We are in our own directory. Why bother to mangle name? // We are in our own directory. Why bother to mangle name?
// In fact I wrote this code to circumvent a problematic behaviour // In fact I wrote this code to circumvent a problematic behaviour
// (bug?) of EMX mkstemp(). // (bug?) of EMX mkstemp().
FileName tmpfl(package().temp_dir().absFileName() + "/lyx_tmpbuf" + FileName tmpfl(package().temp_dir().absFileName() + "/lyx_tmpbuf" +
convert<string>(count++)); counter);
if (!tmpfl.createDirectory(0777)) { if (!tmpfl.createDirectory(0777)) {
throw ExceptionMessage(WarningException, _("Disk Error: "), bformat( throw ExceptionMessage(WarningException, _("Disk Error: "), bformat(