bool MgLockRW::lock(bool forWrite, int timeout) { bool ret = false; if (1 == giInterlockedIncrement(_counts)) { // first locked giInterlockedIncrement(_counts + (forWrite ? 2 : 1)); ret = true; } else { ret = !forWrite && 0 == _counts[2]; // for read and not locked for write for (int i = 0; i < timeout && !ret; i += 25) { giSleep(25); ret = forWrite ? (!_counts[1] && !_counts[2]) : !_counts[2]; } if (ret) { giInterlockedIncrement(_counts + (forWrite ? 2 : 1)); } else { giInterlockedDecrement(_counts); } } return ret; }
void GiGraphics::_endPaint() { giInterlockedDecrement(&m_impl->drawRefcnt); }
long MgLockRW::unlock(bool forWrite) { giInterlockedDecrement(_counts + (forWrite ? 2 : 1)); return giInterlockedDecrement(_counts); }
void GiGraphics::endPaint() { m_impl->canvas = NULL; giInterlockedDecrement(&m_impl->drawRefcnt); }
void MgShapeDoc::release() { if (giInterlockedDecrement(&im->refcount) == 0) { delete this; } }