SwCache::~SwCache()
{ #ifdef DBG_UTIL
SAL_INFO( "sw.core",
m_aName << "; number of new entries: " << m_nAppend
<< "; number of insert on free places: " << m_nInsertFree
<< "; number of replacements: " << m_nReplace
<< "; number of successful Gets: " << m_nGetSuccess
<< "; number of failed Gets: " << m_nGetFail
<< "; number or reordering (LRU): " << m_nToTop
<< "; number of suppressions: " << m_nDelete
<< "; number of Gets without Index: " << m_nGetSeek
<< "; number of Seek for Get without Index: " << m_nAverageSeekCnt
<< "; number of Flush calls: " << m_nFlushCnt
<< "; number of flushed objects: " << m_nFlushedObjects
<< "; number of Cache expansions: " << m_nIncreaseMax
<< "; number of Cache reductions: " << m_nDecreaseMax);
Check(); #endif
}
CHECK; if ( m_aCacheObjects.size() > m_nCurMax &&
(m_nCurMax <= (m_aCacheObjects.size() - m_aFreePositions.size())) )
{ // Shrink if possible.To do so we need enough free positions. // Unpleasant side effect: positions will be moved and the owner of // these might not find them afterwards
size_t i = 0; while (i < m_aCacheObjects.size())
{
SwCacheObj *pTmpObj = m_aCacheObjects[i].get(); if ( !pTmpObj )
{
m_aCacheObjects.erase( m_aCacheObjects.begin() + i );
} else
{
pTmpObj->SetCachePos( i );
++i;
}
}
m_aFreePositions.clear();
}
CHECK;
}
bool SwCache::Insert(SwCacheObj *const pNew, boolconst isDuplicateOwnerAllowed)
{
CHECK;
OSL_ENSURE( !pNew->GetPrev() && !pNew->GetNext(), "New but not new." ); if (!isDuplicateOwnerAllowed)
{ for (autoconst & rpObj : m_aCacheObjects)
{ // check owner doesn't have a cache object yet; required for SwTextLine
assert(!rpObj || rpObj->GetOwner() != pNew->GetOwner());
(void) rpObj;
}
}
sal_uInt16 nPos; if ( m_aCacheObjects.size() < m_nCurMax )
{ // there is still space; insert directly
INCREMENT( m_nAppend );
nPos = m_aCacheObjects.size();
m_aCacheObjects.emplace_back(pNew);
} elseif ( !m_aFreePositions.empty() )
{ // there are placeholders; use the last of those
INCREMENT( m_nInsertFree ); const sal_uInt16 nFreePos = m_aFreePositions.size() - 1;
nPos = m_aFreePositions[ nFreePos ];
m_aCacheObjects[nPos].reset(pNew);
m_aFreePositions.erase( m_aFreePositions.begin() + nFreePos );
} else
{
INCREMENT( m_nReplace ); // the last of the LRU has to go
SwCacheObj *pObj = m_pLast;
while ( pObj && pObj->IsLocked() )
pObj = pObj->GetPrev(); if ( !pObj )
{
SAL_WARN("sw.core", "SwCache overflow.");
IncreaseMax(100); // embiggen & try again return Insert(pNew, isDuplicateOwnerAllowed);
}
nPos = pObj->GetCachePos(); if ( pObj == m_pLast )
{
m_pLast = pObj->GetPrev();
assert(m_pLast); // must have capacity > 1
} if (pObj == m_pFirst)
{ if (pObj->GetNext())
{
m_pFirst = pObj->GetNext();
} else
{
m_pFirst = pObj->GetPrev();
}
assert(m_pFirst); // must have capacity > 1
} if (pObj == m_pRealFirst)
{
m_pRealFirst = pObj->GetNext();
assert(m_pRealFirst); // must have capacity > 1
} if (pObj->GetPrev())
{
pObj->GetPrev()->SetNext( pObj->GetNext() );
} if (pObj->GetNext())
{
pObj->GetNext()->SetPrev( pObj->GetPrev() );
}
m_aCacheObjects[nPos].reset(pNew);
}
pNew->SetCachePos( nPos );
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.