diff options
author | Renato Araujo Oliveira Filho <renato.filho@canonical.com> | 2015-12-02 16:23:27 -0300 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2015-12-16 04:53:01 +0000 |
commit | de4cfc6b53b426799a035fefe81db9d49d3d03ab (patch) | |
tree | 507b42babaf97a83fddde47183ab167be8982da6 | |
parent | 56ac971415fee9bdaa01fc052246ce91fc4374e9 (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.cpp | 13 | ||||
-rw-r--r-- | src/versit/qversitutils_p.h | 2 |
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 |