OSS_INLINE INT32 _dmsStorageData::getMBContext( dmsMBContext ** pContext, UINT16 mbID, UINT32 clLID, INT32 lockType ) { if ( mbID >= DMS_MME_SLOTS ) { return SDB_INVALIDARG ; } if ( (UINT32)DMS_INVALID_CLID == clLID ) { _metadataLatch.get_shared() ; clLID = _dmsMME->_mbList[mbID]._logicalID ; _metadataLatch.release_shared() ; } _latchContext.get() ; if ( _vecContext.size () > 0 ) { *pContext = _vecContext.back () ; _vecContext.pop_back () ; } else { *pContext = SDB_OSS_NEW dmsMBContext ; } _latchContext.release() ; if ( !(*pContext) ) { return SDB_OOM ; } (*pContext)->_clLID = clLID ; (*pContext)->_mbID = mbID ; (*pContext)->_mb = &_dmsMME->_mbList[mbID] ; (*pContext)->_mbStat = &_mbStatInfo[mbID] ; (*pContext)->_latch = &_mblock[mbID] ; if ( SHARED == lockType || EXCLUSIVE == lockType ) { return (*pContext)->mbLock( lockType ) ; } return SDB_OK ; }
OSS_INLINE void _dmsStorageData::releaseMBContext( dmsMBContext *&pContext ) { if ( !pContext ) { return ; } pContext->mbUnlock() ; _latchContext.get() ; if ( _vecContext.size() < DMS_CONTEXT_MAX_SIZE ) { pContext->_reset() ; _vecContext.push_back( pContext ) ; } else { SDB_OSS_DEL pContext ; } _latchContext.release() ; pContext = NULL ; }
/* IXM Tool functions */ BSONObj ixmGetUndefineKeyObj( INT32 fieldNum ) { static BSONObj s_undefineKeys[ IXM_MAX_PREALLOCATED_UNDEFKEY ] ; static BOOLEAN s_init = FALSE ; static ossSpinXLatch s_latch ; if ( FALSE == s_init ) { s_latch.get() ; if ( FALSE == s_init ) { for ( SINT32 i = 0; i < IXM_MAX_PREALLOCATED_UNDEFKEY ; ++i ) { BSONObjBuilder b ; for ( SINT32 j = 0; j <= i; ++j ) { b.appendUndefined("") ; } s_undefineKeys[i] = b.obj() ; } s_init = TRUE ; } s_latch.release() ; } if ( fieldNum > 0 && fieldNum <= IXM_MAX_PREALLOCATED_UNDEFKEY ) { return s_undefineKeys[ fieldNum - 1 ] ; } else { BSONObjBuilder b ; for ( INT32 i = 0; i < fieldNum; ++i ) { b.appendUndefined("") ; } return b.obj() ; } }
HANDLE ossGetSysMutexHandle( SYS_MUTEX_TYPE type ) { static HANDLE s_sysMutexes[ _NumOfFunctions ] = {0} ; static BOOLEAN s_init = FALSE ; static ossSpinXLatch s_latch ; if ( FALSE == s_init ) { s_latch.get() ; if ( FALSE == s_init ) { for ( int i = _SymInitialize; i < _NumOfFunctions ; i++ ) { if ( ! s_sysMutexes[i] ) { if ( i != _SymCleanup ) { s_sysMutexes[i] = CreateMutex( NULL, // default security attr false, // initially not owned NULL ) ; // unnamed mutex } else { s_sysMutexes[i] = s_sysMutexes[ _SymInitialize ] ; } } } s_init = TRUE ; } s_latch.release() ; } if ( type >= _SymInitialize && type < _NumOfFunctions ) { return s_sysMutexes[ (INT32)type ] ; } SDB_ASSERT( FALSE, "Invalid sys mutex type" ) ; return 0 ; }
void unlock() { _isLock = FALSE ; _inLatch.release() ; }
void lock() { _inLatch.get() ; _isLock = TRUE ; }