Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
void GiGraphics::_endPaint()
{
    giInterlockedDecrement(&m_impl->drawRefcnt);
}
Exemplo n.º 3
0
long MgLockRW::unlock(bool forWrite)
{
    giInterlockedDecrement(_counts + (forWrite ? 2 : 1));
    return giInterlockedDecrement(_counts);
}
Exemplo n.º 4
0
void GiGraphics::endPaint()
{
    m_impl->canvas = NULL;
    giInterlockedDecrement(&m_impl->drawRefcnt);
}
Exemplo n.º 5
0
void MgShapeDoc::release()
{
    if (giInterlockedDecrement(&im->refcount) == 0) {
        delete this;
    }
}