summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@canonical.com>2015-12-02 16:23:27 -0300
committerKonstantin Ritt <ritt.ks@gmail.com>2015-12-16 04:53:01 +0000
commitde4cfc6b53b426799a035fefe81db9d49d3d03ab (patch)
tree507b42babaf97a83fddde47183ab167be8982da6
parent56ac971415fee9bdaa01fc052246ce91fc4374e9 (diff)
QtVersit: Fix crash on access to static variable in multiple threads.
Create a mutex to control access to static variables to ensure they are modified in a thread-safe manner Change-Id: I8b8cba23c807522e4251ea7fb14563eea8d5c1b3 Reviewed-by: Christopher Adams <chris.adams@jollamobile.com> Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
-rw-r--r--src/versit/qversitutils.cpp13
-rw-r--r--src/versit/qversitutils_p.h2
2 files changed, 9 insertions, 6 deletions
diff --git a/src/versit/qversitutils.cpp b/src/versit/qversitutils.cpp
index e042bac07..076784467 100644
--- a/src/versit/qversitutils.cpp
+++ b/src/versit/qversitutils.cpp
@@ -49,15 +49,14 @@ QT_BEGIN_NAMESPACE_VERSIT
QTextCodec* VersitUtils::m_previousCodec = 0;
QList<QByteArrayMatcher>* VersitUtils::m_newlineList = 0;
QByteArray VersitUtils::m_encodingMap[256];
+QBasicMutex VersitUtils::m_staticLock;
/*!
* Encode \a ch with \a codec, without adding an byte-order mark
*/
QByteArray VersitUtils::encode(char ch, QTextCodec* codec)
{
- if (codec != m_previousCodec) {
- changeCodec(codec);
- }
+ changeCodec(codec);
return m_encodingMap[(int)ch];
}
@@ -75,9 +74,6 @@ QByteArray VersitUtils::encode(const QByteArray& ba, QTextCodec* codec)
*/
QList<QByteArrayMatcher>* VersitUtils::newlineList(QTextCodec* codec)
{
- if (m_newlineList != 0 && codec == m_previousCodec) {
- return m_newlineList;
- }
changeCodec(codec);
return m_newlineList;
}
@@ -86,6 +82,11 @@ QList<QByteArrayMatcher>* VersitUtils::newlineList(QTextCodec* codec)
* Update the cached tables of pregenerated encoded text with \a codec.
*/
void VersitUtils::changeCodec(QTextCodec* codec) {
+ QMutexLocker readWriterLocker(&VersitUtils::m_staticLock);
+
+ if (VersitUtils::m_newlineList != 0 && codec == VersitUtils::m_previousCodec)
+ return;
+
// Build m_encodingMap
QChar qch;
QTextCodec::ConverterState state(QTextCodec::IgnoreHeader);
diff --git a/src/versit/qversitutils_p.h b/src/versit/qversitutils_p.h
index 1f51259f9..dd07b3730 100644
--- a/src/versit/qversitutils_p.h
+++ b/src/versit/qversitutils_p.h
@@ -48,6 +48,7 @@
#include <QtCore/qbytearray.h>
#include <QtCore/qbytearraymatcher.h>
#include <QtCore/qlist.h>
+#include <QtCore/QMutex>
#include <QtVersit/qversitproperty.h>
@@ -81,6 +82,7 @@ private:
static QByteArray m_encodingMap[256];
// List of different newline delimeters, encoded with m_previousCodec
static QList<QByteArrayMatcher>* m_newlineList;
+ static QBasicMutex m_staticLock;
};
QT_END_NAMESPACE_VERSIT