summaryrefslogtreecommitdiffstats
path: root/src/render/backend/stringtoint.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-02-15 12:42:27 +0100
committerSean Harmer <sean.harmer@kdab.com>2016-02-20 12:20:47 +0000
commit6e6ccb6179d79691e09021e33f06ef25748b4fc9 (patch)
treeecd4a09c2f103ef2ba84ba5b87b9fa8e9a26bca1 /src/render/backend/stringtoint.cpp
parent98e554e08b778307e51188bb01545ca0bf415325 (diff)
StringToInt: use QReadWriteLock plus temporary vector
Change-Id: I4bc421358ce209f7fedc1a5205f64d5b27df9ec8 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/backend/stringtoint.cpp')
-rw-r--r--src/render/backend/stringtoint.cpp43
1 files changed, 38 insertions, 5 deletions
diff --git a/src/render/backend/stringtoint.cpp b/src/render/backend/stringtoint.cpp
index e8753c1bd..2b5a0bb83 100644
--- a/src/render/backend/stringtoint.cpp
+++ b/src/render/backend/stringtoint.cpp
@@ -39,6 +39,7 @@
#include "stringtoint_p.h"
#include <QMutex>
+#include <QReadWriteLock>
QT_BEGIN_NAMESPACE
@@ -49,27 +50,59 @@ namespace Render {
namespace {
QMutex mutex;
+QReadWriteLock readLock;
} // anonymous
QVector<QString> StringToInt::m_stringsArray = QVector<QString>();
+QVector<QString> StringToInt::m_pendingStringsArray = QVector<QString>();
+int StringToInt::m_calls = 0;
int StringToInt::lookupId(const QString &str)
{
- QMutexLocker lock(&mutex);
- const int idx = StringToInt::m_stringsArray.indexOf(str);
+ // Note: how do we protect against the case where
+ // we are synching the two arrays ?
+ QReadLocker readLocker(&readLock);
+ int idx = StringToInt::m_stringsArray.indexOf(str);
+
if (Q_UNLIKELY(idx < 0)) {
- StringToInt::m_stringsArray.push_back(str);
- return StringToInt::m_stringsArray.size() - 1;
+ QMutexLocker lock(&mutex);
+
+ // If not found in m_stringsArray, maybe it's in the pending array
+ if ((idx = StringToInt::m_pendingStringsArray.indexOf(str)) >= 0) {
+ idx += StringToInt::m_stringsArray.size();
+ } else {
+ // If not, we add it to the m_pendingStringArray
+ StringToInt::m_pendingStringsArray.push_back(str);
+ idx = StringToInt::m_stringsArray.size() + m_pendingStringsArray.size() - 1;
+ }
+
+ // We sync the two arrays every 20 calls
+ if (StringToInt::m_calls % 20 == 0 && StringToInt::m_pendingStringsArray.size() > 0) {
+ // Unlock reader to writeLock
+ // since a read lock cannot be locked for writing
+ readLocker.unlock();
+ QWriteLocker writeLock(&readLock);
+
+ StringToInt::m_stringsArray += StringToInt::m_pendingStringsArray;
+ StringToInt::m_pendingStringsArray.clear();
+ StringToInt::m_calls = 0;
+ }
}
return idx;
}
QString StringToInt::lookupString(int idx)
{
- QMutexLocker lock(&mutex);
+ QReadLocker readLocker(&readLock);
if (Q_LIKELY(StringToInt::m_stringsArray.size() > idx))
return StringToInt::m_stringsArray.at(idx);
+
+ // Maybe it's in the pending array then
+ QMutexLocker lock(&mutex);
+ if (StringToInt::m_stringsArray.size() + StringToInt::m_pendingStringsArray.size() > idx)
+ return StringToInt::m_pendingStringsArray.at(idx - StringToInt::m_stringsArray.size());
+
return QString();
}