src/corelib/thread/qmutex.h
changeset 30 5dc02b23752f
parent 19 fcece45ef507
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    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         : val(reinterpret_cast<quintptr>(m))
       
    99     {
    98     {
   100         Q_ASSERT_X((val & quintptr(1u)) == quintptr(0),
    99         Q_ASSERT_X((reinterpret_cast<quintptr>(m) & quintptr(1u)) == quintptr(0),
   101                    "QMutexLocker", "QMutex pointer is misaligned");
   100                    "QMutexLocker", "QMutex pointer is misaligned");
   102         relock();
   101         if (m) {
       
   102             m->lock();
       
   103             val = reinterpret_cast<quintptr>(m) | quintptr(1u);
       
   104         } else {
       
   105             val = 0;
       
   106         }
   103     }
   107     }
   104     inline ~QMutexLocker() { unlock(); }
   108     inline ~QMutexLocker() { unlock(); }
   105 
   109 
   106     inline void unlock()
   110     inline void unlock()
   107     {
   111     {
   108         if (val) {
   112         if ((val & quintptr(1u)) == quintptr(1u)) {
   109             if ((val & quintptr(1u)) == quintptr(1u)) {
   113             val &= ~quintptr(1u);
   110                 val &= ~quintptr(1u);
   114             mutex()->unlock();
   111                 mutex()->unlock();
       
   112             }
       
   113         }
   115         }
   114     }
   116     }
   115 
   117 
   116     inline void relock()
   118     inline void relock()
   117     {
   119     {