Details
-
Bug
-
Resolution: Done
-
P3: Somewhat important
-
None
-
5.9
-
None
Description
Running tst_qreadwritelock tsan (from clang 3.9.1) says
WARNING: ThreadSanitizer: data race (pid=25661)
Read of size 4 at 0x7d6400019f6c by thread T49:
#0 QReadWriteLock::unlock() /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:423:16 (libQt5Core.so.5+0x0000000e76d9)
#1 WriteLockLoopThread::run() /d/qt/5/kdab/qtbase-dev/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp:556:24 (tst_qreadwritelock+0x0000004a83d0)
#2 QThreadPrivate::start(void*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qthread_unix.cpp:368:10 (libQt5Core.so.5+0x00000010001f)
Previous write of size 4 at 0x7d6400019f6c by thread T47:
#0 QReadWriteLock::tryLockForWrite(int) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:357:34 (libQt5Core.so.5+0x0000000e6ce1)
#1 QReadWriteLock::lockForWrite() /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:294:5 (libQt5Core.so.5+0x0000000e6b9d)
#2 WriteLockLoopThread::run() /d/qt/5/kdab/qtbase-dev/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp:553:24 (tst_qreadwritelock+0x0000004a8349)
#3 QThreadPrivate::start(void*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qthread_unix.cpp:368:10 (libQt5Core.so.5+0x00000010001f)
line 423 is "if (d->writerCount)", mutex-protected,
line 357 is "val->writerCount = 1", not mutex-protected, but presumably published (i.e. release semantics) by the d_ptr.testAndSetOrdered atomic operation that follows? This makes me wonder if it's a false positive, but I'm not sure.
This is followed by
WARNING: ThreadSanitizer: data race (pid=25661)
Read of size 4 at 0x7d6400019f7c by thread T49:
#0 QReadWriteLockPrivate::release() /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:634:23 (libQt5Core.so.5+0x0000000e66b3)
#1 QReadWriteLock::unlock() /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:439:16 (libQt5Core.so.5+0x0000000e79ae)
#2 WriteLockLoopThread::run() /d/qt/5/kdab/qtbase-dev/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp:556:24 (tst_qreadwritelock+0x0000004a83d0)
#3 QThreadPrivate::start(void*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qthread_unix.cpp:368:10 (libQt5Core.so.5+0x00000010001f)
Previous write of size 4 at 0x7d6400019f7c by thread T47:
#0 QReadWriteLockPrivate::allocate() /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:624:11 (libQt5Core.so.5+0x0000000e647c)
#1 QReadWriteLock::tryLockForWrite(int) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:355:24 (libQt5Core.so.5+0x0000000e6ca9)
#2 QReadWriteLock::lockForWrite() /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qreadwritelock.cpp:294:5 (libQt5Core.so.5+0x0000000e6b9d)
#3 WriteLockLoopThread::run() /d/qt/5/kdab/qtbase-dev/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp:553:24 (tst_qreadwritelock+0x0000004a8349)
#4 QThreadPrivate::start(void*) /d/qt/5/kdab/qtbase-dev/src/corelib/thread/qthread_unix.cpp:368:10 (libQt5Core.so.5+0x00000010001f)
line 634 is freelist->release(id);
line 624 is d->id = i;