diff options
author | Bradley T. Hughes <bradley.hughes@nokia.com> | 2011-09-28 12:14:01 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-27 11:12:38 +0200 |
commit | 4a81c29c476edfa2c1dcb5fecb3a76a295d43384 (patch) | |
tree | 14edaddac1e1afe38e16c65584883d40cb7da60c /src/corelib/codecs/qsimplecodec.cpp | |
parent | 19b029cd9d8540b6d6628feb9201b75679f1dbd2 (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.cpp | 17 |
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(); |