src/corelib/thread/qmutex.h
changeset 19 fcece45ef507
parent 18 2f34d5167611
child 30 5dc02b23752f
equal deleted inserted replaced
18:2f34d5167611 19:fcece45ef507
    93 
    93 
    94 class Q_CORE_EXPORT QMutexLocker
    94 class Q_CORE_EXPORT QMutexLocker
    95 {
    95 {
    96 public:
    96 public:
    97     inline explicit QMutexLocker(QMutex *m)
    97     inline explicit QMutexLocker(QMutex *m)
    98         : mtx(m)
    98         : val(reinterpret_cast<quintptr>(m))
    99     {
    99     {
   100         Q_ASSERT_X((val & quintptr(1u)) == quintptr(0),
   100         Q_ASSERT_X((val & quintptr(1u)) == quintptr(0),
   101                    "QMutexLocker", "QMutex pointer is misaligned");
   101                    "QMutexLocker", "QMutex pointer is misaligned");
   102         relock();
   102         relock();
   103     }
   103     }
   104     inline ~QMutexLocker() { unlock(); }
   104     inline ~QMutexLocker() { unlock(); }
   105 
   105 
   106     inline void unlock()
   106     inline void unlock()
   107     {
   107     {
   108         if (mtx) {
   108         if (val) {
   109             if ((val & quintptr(1u)) == quintptr(1u)) {
   109             if ((val & quintptr(1u)) == quintptr(1u)) {
   110                 val &= ~quintptr(1u);
   110                 val &= ~quintptr(1u);
   111                 mtx->unlock();
   111                 mutex()->unlock();
   112             }
   112             }
   113         }
   113         }
   114     }
   114     }
   115 
   115 
   116     inline void relock()
   116     inline void relock()
   117     {
   117     {
   118         if (mtx) {
   118         if (val) {
   119             if ((val & quintptr(1u)) == quintptr(0u)) {
   119             if ((val & quintptr(1u)) == quintptr(0u)) {
   120                 mtx->lock();
   120                 mutex()->lock();
   121                 val |= quintptr(1u);
   121                 val |= quintptr(1u);
   122             }
   122             }
   123         }
   123         }
   124     }
   124     }
   125 
   125 
   138 #endif
   138 #endif
   139 
   139 
   140 private:
   140 private:
   141     Q_DISABLE_COPY(QMutexLocker)
   141     Q_DISABLE_COPY(QMutexLocker)
   142 
   142 
   143     union {
   143     quintptr val;
   144         QMutex *mtx;
       
   145         quintptr val;
       
   146     };
       
   147 };
   144 };
   148 
   145 
   149 #else // QT_NO_THREAD
   146 #else // QT_NO_THREAD
   150 
   147 
   151 
   148