summaryrefslogtreecommitdiffstats
path: root/src/corelib/codecs/qsimplecodec.cpp
diff options
context:
space:
mode:
authorBradley T. Hughes <bradley.hughes@nokia.com>2011-09-28 12:14:01 +0200
committerQt by Nokia <qt-info@nokia.com>2011-10-27 11:12:38 +0200
commit4a81c29c476edfa2c1dcb5fecb3a76a295d43384 (patch)
tree14edaddac1e1afe38e16c65584883d40cb7da60c /src/corelib/codecs/qsimplecodec.cpp
parent19b029cd9d8540b6d6628feb9201b75679f1dbd2 (diff)
Use load() when constructing QSimpleCodec's reverse map
The implicit casting results in unnecessary volatile loads. The test-and-set-ordered doesn't need full ordering, test-and-set-release is enough to ensure that the memory initialization done by buildReverseMap() and test-and-set happen in program order. Change-Id: I168b504271aeba050d6b8396becbdeb3ef938213 Reviewed-by: Olivier Goffart <ogoffart@kde.org>
Diffstat (limited to 'src/corelib/codecs/qsimplecodec.cpp')
-rw-r--r--src/corelib/codecs/qsimplecodec.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/corelib/codecs/qsimplecodec.cpp b/src/corelib/codecs/qsimplecodec.cpp
index 728ebbb7f8..d24b4d4cfd 100644
--- a/src/corelib/codecs/qsimplecodec.cpp
+++ b/src/corelib/codecs/qsimplecodec.cpp
@@ -622,7 +622,7 @@ QSimpleTextCodec::QSimpleTextCodec(int i) : forwardIndex(i), reverseMap(0)
QSimpleTextCodec::~QSimpleTextCodec()
{
- delete reverseMap;
+ delete reverseMap.load();
}
static QByteArray *buildReverseMap(int forwardIndex)
@@ -674,10 +674,13 @@ QByteArray QSimpleTextCodec::convertFromUnicode(const QChar *in, int length, Con
const char replacement = (state && state->flags & ConvertInvalidToNull) ? 0 : '?';
int invalid = 0;
- if (!reverseMap){
- QByteArray *tmp = buildReverseMap(this->forwardIndex);
- if (!reverseMap.testAndSetOrdered(0, tmp))
- delete tmp;
+ QByteArray *rmap = reverseMap.load();
+ if (!rmap){
+ rmap = buildReverseMap(this->forwardIndex);
+ if (!reverseMap.testAndSetRelease(0, rmap)) {
+ delete rmap;
+ rmap = reverseMap.load();
+ }
}
QByteArray r(length, Qt::Uninitialized);
@@ -685,8 +688,8 @@ QByteArray QSimpleTextCodec::convertFromUnicode(const QChar *in, int length, Con
int u;
const QChar* ucp = in;
unsigned char* rp = (unsigned char *)r.data();
- const unsigned char* rmp = (const unsigned char *)reverseMap->constData();
- int rmsize = (int) reverseMap->size();
+ const unsigned char* rmp = (const unsigned char *)rmap->constData();
+ int rmsize = (int) rmap->size();
while(i--)
{
u = ucp->unicode();