| 153 | } |
| 154 | |
| 155 | void DUChainLock::releaseWriteLock() |
| 156 | { |
| 157 | Q_D(DUChainLock); |
| 158 | |
| 159 | Q_ASSERT(currentThreadHasWriteLock()); |
| 160 | |
| 161 | //The order is important here, m_writerRecursion protects m_writer |
| 162 | |
| 163 | //TODO: could testAndSet here |
| 164 | if (d->m_writerRecursion.loadRelaxed() == 1) { |
| 165 | d->m_writer = nullptr; |
| 166 | d->m_writerRecursion = 0; |
| 167 | } else { |
| 168 | d->m_writerRecursion.fetchAndAddOrdered(-1); |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | bool DUChainLock::currentThreadHasWriteLock() const |
| 173 | { |