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>
This commit is contained in:
parent
19b029cd9d
commit
4a81c29c47
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user