Deregister QTextCodec on destruction

QTextCodec automatically deregisters on destruction now.

[ChangeLog][QtCore][QTextCodec] QTextCodec automatically
deregisters on destruction now.

Task-number: QTBUG-56203
Change-Id: Ic9a66c512642c9913aa27ea5167b9f7341e7f0fe
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Igor Mironchik 2018-05-24 15:59:23 +03:00
parent d4349f1acd
commit 03ab94b0e7
3 changed files with 28 additions and 2 deletions

View File

@ -492,6 +492,24 @@ QTextCodec::QTextCodec()
*/
QTextCodec::~QTextCodec()
{
QCoreGlobalData *globalData = QCoreGlobalData::instance();
if (!globalData)
return;
globalData->codecForLocale.testAndSetRelaxed(this, nullptr);
QMutexLocker locker(textCodecsMutex());
globalData->allCodecs.removeOne(this);
auto it = globalData->codecCache.cbegin();
while (it != globalData->codecCache.cend()) {
if (it.value() == this)
it = globalData->codecCache.erase(it);
else
++it;
}
}
/*!

View File

@ -55,7 +55,10 @@ QCoreGlobalData::~QCoreGlobalData()
{
#if QT_CONFIG(textcodec)
codecForLocale = 0;
for (QList<QTextCodec *>::const_iterator it = allCodecs.constBegin(); it != allCodecs.constEnd(); ++it)
QList<QTextCodec *> tmp = allCodecs;
allCodecs.clear();
codecCache.clear();
for (QList<QTextCodec *>::const_iterator it = tmp.constBegin(); it != tmp.constEnd(); ++it)
delete *it;
#endif
}

View File

@ -2429,7 +2429,7 @@ void tst_QTextCodec::userCodec()
QVERIFY(!QTextCodec::availableCodecs().contains("UserCodec"));
QVERIFY(!QTextCodec::codecForName("UserCodec"));
QTextCodec *codec = new UserCodec;
UserCodec *codec = new UserCodec;
executedOnce = true;
QList<QByteArray> availableCodecs = QTextCodec::availableCodecs();
@ -2448,6 +2448,11 @@ void tst_QTextCodec::userCodec()
pcodec = QTextCodec::codecForMib(5000);
QCOMPARE(pcodec, codec);
delete codec;
pcodec = QTextCodec::codecForName("UserCodec");
QCOMPARE(pcodec, nullptr);
}
struct DontCrashAtExit {