diff options
author | Samuel Rødal <samuel.rodal@digia.com> | 2012-11-26 15:39:40 (GMT) |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-28 12:29:35 (GMT) |
commit | a7965832a46af1c9d58c6aca38084b6436f48302 (patch) | |
tree | 89624616c7538dbe8453a12dab6292e0e683d111 | |
parent | 27055ae6b5102a5a81aafdb98c6f769a1cbb9084 (diff) | |
download | Qt-a7965832a46af1c9d58c6aca38084b6436f48302.zip Qt-a7965832a46af1c9d58c6aca38084b6436f48302.tar.gz Qt-a7965832a46af1c9d58c6aca38084b6436f48302.tar.bz2 |
Fixed crash in tst_qglthreads.
QGLTextureCache has a read write locker to protect texture lookups.
However, even calling QCache::object() might modify the cache, causing
race conditions, since it modifies the priority order of the objects in
the cache. Therefore, we need to protect it with a QWriteLocker instead
of a QReadLocker.
Task-number: QTBUG-22560
Change-Id: I46fffc624ace27e25fb100f865e1df0a19b9093d
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
(cherry picked from commit 6633dbbac49f4ce8a89b67090fdffaa8c8126eb5)
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r-- | src/opengl/qgl_p.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h index b5d17e8..5fe6678 100644 --- a/src/opengl/qgl_p.h +++ b/src/opengl/qgl_p.h @@ -696,7 +696,8 @@ int QGLTextureCache::maxCost() QGLTexture* QGLTextureCache::getTexture(QGLContext *ctx, qint64 key) { - QReadLocker locker(&m_lock); + // Can't be a QReadLocker since QCache::object() modifies the cache (reprioritizes the object) + QWriteLocker locker(&m_lock); const QGLTextureCacheKey cacheKey = {key, QGLContextPrivate::contextGroup(ctx)}; return m_cache.object(cacheKey); } |