Ejemplo n.º 1
0
EXPORT void _lib_unlock( W lockno )
{
	MUnlock(&LibLock, lockno);
}
Ejemplo n.º 2
0
void CGBLGuard::Switch(EState newstate)
{
    if(newstate==m_current) return;
    switch(newstate) {
    case eNone:
        if ( m_current!=eMain ) {
            Switch(eMain);
        }
        _ASSERT(m_current==eMain);
        //LOCK_POST(8, &m_Locks << ":: switch 'main' to 'none'");
        MUnlock();
        m_current=eNone;
        return;
      
    case eBoth:
        if ( m_current!=eMain ) {
            Switch(eMain);
        }
        _ASSERT(m_current==eMain);
        //LOCK_POST(9, &m_Locks << ":: switch 'main' to 'both'");
        if ( m_Locks->m_SlowTraverseMode>0 ) {
            PLock();
        }
        m_current=eBoth;
        return;
      
    case eLocal:
        if ( m_current!=eBoth ) {
            Switch(eBoth);
        }
        _ASSERT(m_current==eBoth);
        //LOCK_POST(10, &m_Locks << ":: switch 'both' to 'local'");
        if(m_Locks->m_SlowTraverseMode==0) {
            PLock();
        }
        try {
            m_Locks->m_SlowTraverseMode++;
            MUnlock();
        }
        catch( exception& ) {
            m_Locks->m_SlowTraverseMode--;
            if(m_Locks->m_SlowTraverseMode==0) {
                PUnlock();
            }
            throw;
        }
        m_current=eLocal;
        return;
    case eMain:
        switch(m_current) {
        case eNone:
            m_select=-1;
            //LOCK_POST(11, &m_Locks << ":: switch 'none' to 'main'");
            MLock();
            m_current=eMain;
            return;
        case eBoth:
            //LOCK_POST(12, &m_Locks << ":: switch 'both' to 'main'");
            if(m_Locks->m_SlowTraverseMode>0) {
                PUnlock();
            }
            m_select=-1;
            m_current=eMain;
            return;
        case eLocal:
            //LOCK_POST(13, &m_Locks << ":: switch 'local' to 'none2main'");
            PUnlock();
            m_current=eNoneToMain;
        case eNoneToMain:
            //LOCK_POST(14, &m_Locks << ":: switch 'none2main' to 'main'");
            MLock();
            m_Locks->m_SlowTraverseMode--;
            m_select=-1;
            m_current=eMain;
            return;
        default:
            break;
        }
    default:
        break;
    }
    NCBI_THROW(CLoaderException, eOtherError,
        "CGBLGuard::Switch - state desynchronized");
}