void DUChainLock::releaseWriteLock()
{
  Q_ASSERT(currentThreadHasWriteLock());

  //The order is important here, m_writerRecursion protects m_writer
  
  if(d->m_writerRecursion == 1)
  {
    d->m_writer = 0;
    d->m_writerRecursion = 0;
  }else{
    d->m_writerRecursion.fetchAndAddOrdered(-1);
  }
}
Example #2
0
void DUChainLock::releaseWriteLock()
{
  Q_ASSERT(currentThreadHasWriteLock());

  //The order is important here, m_writerRecursion protects m_writer

  //TODO: could testAndSet here
  if (d->m_writerRecursion.load() == 1) {
    d->m_writer = nullptr;
    d->m_writerRecursion = 0;
  } else {
    d->m_writerRecursion.fetchAndAddOrdered(-1);
  }
}