diff options
Diffstat (limited to 'src/corelib/codecs')
-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(); |