EXPORT void _lib_unlock( W lockno ) { MUnlock(&LibLock, lockno); }
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"); }