summaryrefslogtreecommitdiffstats
path: root/src/corelib/codecs
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-02-16 22:06:42 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2010-02-16 22:06:42 (GMT)
commitec3dc06b5fbf7ef37e0836992f6d7a3fd49c5891 (patch)
tree195c66ded290b2ebb4b2398c8967666eb0e7c2aa /src/corelib/codecs
parent95d3bd3fc993d7c8c1fe92960c617a3392d87f66 (diff)
parent9e5e97f3b5eaa9cda471be44a5c59b51561393b6 (diff)
downloadQt-ec3dc06b5fbf7ef37e0836992f6d7a3fd49c5891.zip
Qt-ec3dc06b5fbf7ef37e0836992f6d7a3fd49c5891.tar.gz
Qt-ec3dc06b5fbf7ef37e0836992f6d7a3fd49c5891.tar.bz2
Merge branch '4.6' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into 4.6-integration
* '4.6' of scm.dev.nokia.troll.no:qt/oslo-staging-2: (26 commits) QLocalSocket::isValid on Windows must check for broken connection fix pipe handle leak in qlocalsocket_win.cpp GraphicsViewBenchmark: Run app in full screen mode on small desktops. Fix Thai text on Windows 7 Fix License headers. QTextCodec::codecForName. Insert in the cache in all cases. Prevented calling the pixmap filter implementations with null pixmaps. Make it possible to run benchmarks with the "-graphicssystem" switch. Add support for running the GraphicsViewBenchmark application manually. Bump version to 4.6.3. Fixed a GLX warning that occured with some Intel chipsets under X11. Fixed compile for maemo6. Cleanup QEglContext & EGLDisplays Moved 'hasAlpha' property from GL2 engine to GL paint device. Remove useless qDebug in QTextCodec autotest QTextCodec: Symbian has codec for UCS2, only fallback to UTF16 if UCS2 codec cannot be loaded Add caching to QTextCodec::codecForName and QTextCodec::codecForMib Add benchmark for QTextCodec Fix several bugs with GL texture cache Compile fix for OpenGL ES. ...
Diffstat (limited to 'src/corelib/codecs')
-rw-r--r--src/corelib/codecs/qtextcodec.cpp52
1 files changed, 43 insertions, 9 deletions
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index ff40af5..c0aa342 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -80,6 +80,7 @@
#endif // QT_NO_CODECS
#include "qlocale.h"
#include "qmutex.h"
+#include "qhash.h"
#include <stdlib.h>
#include <ctype.h>
@@ -172,6 +173,7 @@ static QTextCodec *createForMib(int mib)
}
static QList<QTextCodec*> *all = 0;
+static int clearCaches = 0; // flags specifying if caches should be invalided: 0x1 codecForName, 0x2 codecForMib
#ifdef Q_DEBUG_TEXTCODEC
static bool destroying_is_ok = false;
#endif
@@ -935,6 +937,7 @@ QTextCodec::~QTextCodec()
QMutexLocker locker(textCodecsMutex());
#endif
all->removeAll(this);
+ clearCaches = 0x1 | 0x2;
}
}
@@ -961,17 +964,33 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name)
#endif
setup();
+ static QHash <QByteArray, QTextCodec *> cache;
+ if (clearCaches & 0x1) {
+ cache.clear();
+ clearCaches &= ~0x1;
+ }
+ QTextCodec *codec = cache.value(name);
+ if (codec)
+ return codec;
+
for (int i = 0; i < all->size(); ++i) {
QTextCodec *cursor = all->at(i);
- if (nameMatch(cursor->name(), name))
+ if (nameMatch(cursor->name(), name)) {
+ cache.insert(name, cursor);
return cursor;
+ }
QList<QByteArray> aliases = cursor->aliases();
for (int y = 0; y < aliases.size(); ++y)
- if (nameMatch(aliases.at(y), name))
+ if (nameMatch(aliases.at(y), name)) {
+ cache.insert(name, cursor);
return cursor;
+ }
}
- return createForName(name);
+ codec = createForName(name);
+ if (codec)
+ cache.insert(name, codec);
+ return codec;
}
@@ -986,19 +1005,34 @@ QTextCodec* QTextCodec::codecForMib(int mib)
#endif
setup();
- // Qt 3 used 1000 (mib for UCS2) as its identifier for the utf16 codec. Map
- // this correctly for compatibility.
- if (mib == 1000)
- mib = 1015;
+ static QHash <int, QTextCodec *> cache;
+ if (clearCaches & 0x2) {
+ cache.clear();
+ clearCaches &= ~0x2;
+ }
+ QTextCodec *codec = cache.value(mib);
+ if (codec)
+ return codec;
QList<QTextCodec*>::ConstIterator i;
for (int i = 0; i < all->size(); ++i) {
QTextCodec *cursor = all->at(i);
- if (cursor->mibEnum() == mib)
+ if (cursor->mibEnum() == mib) {
+ cache.insert(mib, cursor);
return cursor;
+ }
}
- return createForMib(mib);
+ codec = createForMib(mib);
+
+ // Qt 3 used 1000 (mib for UCS2) as its identifier for the utf16 codec. Map
+ // this correctly for compatibility.
+ if (!codec && mib == 1000)
+ return codecForMib(1015);
+
+ if (codec)
+ cache.insert(mib, codec);
+ return codec;
}
/*!