Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-58917

Data race on QReadWriteLock's freelist

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • P3: Somewhat important
    • None
    • 5.9
    • Core: Threads
    • 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;

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            Unassigned Unassigned
            dfaure_kdab David Faure
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes