src/corelib/thread/qreadwritelock.h
changeset 19 fcece45ef507
parent 18 2f34d5167611
equal deleted inserted replaced
18:2f34d5167611 19:fcece45ef507
    94     inline ~QReadLocker()
    94     inline ~QReadLocker()
    95     { unlock(); }
    95     { unlock(); }
    96 
    96 
    97     inline void unlock()
    97     inline void unlock()
    98     {
    98     {
    99         if (q_lock) {
    99         if (q_val) {
   100             if ((q_val & quintptr(1u)) == quintptr(1u)) {
   100             if ((q_val & quintptr(1u)) == quintptr(1u)) {
   101                 q_val &= ~quintptr(1u);
   101                 q_val &= ~quintptr(1u);
   102                 q_lock->unlock();
   102                 readWriteLock()->unlock();
   103             }
   103             }
   104         }
   104         }
   105     }
   105     }
   106 
   106 
   107     inline void relock()
   107     inline void relock()
   108     {
   108     {
   109         if (q_lock) {
   109         if (q_val) {
   110             if ((q_val & quintptr(1u)) == quintptr(0u)) {
   110             if ((q_val & quintptr(1u)) == quintptr(0u)) {
   111                 q_lock->lockForRead();
   111                 readWriteLock()->lockForRead();
   112                 q_val |= quintptr(1u);
   112                 q_val |= quintptr(1u);
   113             }
   113             }
   114         }
   114         }
   115     }
   115     }
   116 
   116 
   117     inline QReadWriteLock *readWriteLock() const
   117     inline QReadWriteLock *readWriteLock() const
   118     { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); }
   118     { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); }
   119 
   119 
   120 private:
   120 private:
   121     Q_DISABLE_COPY(QReadLocker)
   121     Q_DISABLE_COPY(QReadLocker)
   122     union {
   122     quintptr q_val;
   123         QReadWriteLock *q_lock;
       
   124         quintptr q_val;
       
   125     };
       
   126 };
   123 };
   127 
   124 
   128 inline QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock)
   125 inline QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock)
   129     : q_lock(areadWriteLock)
   126     : q_val(reinterpret_cast<quintptr>(areadWriteLock))
   130 {
   127 {
   131     Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0),
   128     Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0),
   132                "QReadLocker", "QReadWriteLock pointer is misaligned");
   129                "QReadLocker", "QReadWriteLock pointer is misaligned");
   133     relock();
   130     relock();
   134 }
   131 }
   141     inline ~QWriteLocker()
   138     inline ~QWriteLocker()
   142     { unlock(); }
   139     { unlock(); }
   143 
   140 
   144     inline void unlock()
   141     inline void unlock()
   145     {
   142     {
   146         if (q_lock) {
   143         if (q_val) {
   147             if ((q_val & quintptr(1u)) == quintptr(1u)) {
   144             if ((q_val & quintptr(1u)) == quintptr(1u)) {
   148                 q_val &= ~quintptr(1u);
   145                 q_val &= ~quintptr(1u);
   149                 q_lock->unlock();
   146                 readWriteLock()->unlock();
   150             }
   147             }
   151         }
   148         }
   152     }
   149     }
   153 
   150 
   154     inline void relock()
   151     inline void relock()
   155     {
   152     {
   156         if (q_lock) {
   153         if (q_val) {
   157             if ((q_val & quintptr(1u)) == quintptr(0u)) {
   154             if ((q_val & quintptr(1u)) == quintptr(0u)) {
   158                 q_lock->lockForWrite();
   155                 readWriteLock()->lockForWrite();
   159                 q_val |= quintptr(1u);
   156                 q_val |= quintptr(1u);
   160             }
   157             }
   161         }
   158         }
   162     }
   159     }
   163 
   160 
   165     { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); }
   162     { return reinterpret_cast<QReadWriteLock *>(q_val & ~quintptr(1u)); }
   166 
   163 
   167 
   164 
   168 private:
   165 private:
   169     Q_DISABLE_COPY(QWriteLocker)
   166     Q_DISABLE_COPY(QWriteLocker)
   170     union{
   167     quintptr q_val;
   171         QReadWriteLock *q_lock;
       
   172         quintptr q_val;
       
   173     };
       
   174 };
   168 };
   175 
   169 
   176 inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock)
   170 inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock)
   177     : q_lock(areadWriteLock)
   171     : q_val(reinterpret_cast<quintptr>(areadWriteLock))
   178 {
   172 {
   179     Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0),
   173     Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0),
   180                "QWriteLocker", "QReadWriteLock pointer is misaligned");
   174                "QWriteLocker", "QReadWriteLock pointer is misaligned");
   181     relock();
   175     relock();
   182 }
   176 }