From 4a81c29c476edfa2c1dcb5fecb3a76a295d43384 Mon Sep 17 00:00:00 2001 From: "Bradley T. Hughes" Date: Wed, 28 Sep 2011 12:14:01 +0200 Subject: 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 --- src/corelib/codecs/qsimplecodec.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'src/corelib/codecs') 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(); -- cgit v1.2.3