BOOL CIndexedFilesEvictedDescriptorList::UpdateDescriptorCache(OIndex oi, void* pvCache) { CIndexedDataDescriptor* pcDescriptor; pcDescriptor = mcDescriptors.Get(oi); if (pcDescriptor) { pcDescriptor->Cache(pvCache); return TRUE; } return FALSE; }
void CIndexedFilesEvictedDescriptorList::NullCachedDescriptors(void) { SMapIterator sIter; OIndex* poi; CIndexedDataDescriptor* pcDesc; BOOL bExists; bExists = mcDescriptors.StartIteration(&sIter, (void**)&poi, (void**)&pcDesc); while (bExists) { pcDesc->Cache(NULL); bExists = mcDescriptors.Iterate(&sIter, (void**)&poi, (void**)&pcDesc); } }
void CIndexedHuge::SaveThirdLevelChunk(SIndexedThirdLevelSearch* psIndexedThirdLevelSearch) { OIndex iFirstChunkOI; filePos iLength; filePos iDescriptorsInFile; int i; CIndexedDataDescriptor* pcDescriptor; OIndex iLastChunkOI; filePos iOffset; filePos iResult; filePos iNumToWrite; BOOL bResult; void** pvCaches; iFirstChunkOI = GetThirdLevelChunkOI(psIndexedThirdLevelSearch); iLength = mpcFile->Size(); iDescriptorsInFile = iLength / sizeof(CIndexedDataDescriptor); iLastChunkOI = -1; for (i = miThirdLevelChunkWidth-1; i >= 0; i--) { pcDescriptor = GetCachedDescriptor(psIndexedThirdLevelSearch, i); if (pcDescriptor->IsAllocated()) { if ((!mbDirtyTesting) || (mbDirtyTesting && pcDescriptor->IsDirty())) { iLastChunkOI = pcDescriptor->GetIndex(); break; } } } if (iLastChunkOI != -1) { pvCaches = (void**)malloc(miThirdLevelChunkWidth * sizeof(void*)); for (i = 0; i < miThirdLevelChunkWidth; i++) { pcDescriptor = GetCachedDescriptor(psIndexedThirdLevelSearch, i); pcDescriptor->Dirty(FALSE); pvCaches[i] = pcDescriptor->GetCache(); pcDescriptor->Cache(NULL); } iOffset = iFirstChunkOI * sizeof(CIndexedDataDescriptor); pcDescriptor = GetCachedDescriptor(psIndexedThirdLevelSearch, 0); iNumToWrite = (filePos)((iLastChunkOI-iFirstChunkOI)+1); if (iLength < iOffset) { bResult = PadFile(iLength, iOffset); } iResult = mpcFile->Write(EFSO_SET, iOffset, pcDescriptor, sizeof(CIndexedDataDescriptor), iNumToWrite); miDiskWrites += iResult; for (i = 0; i < miThirdLevelChunkWidth; i++) { pcDescriptor = GetCachedDescriptor(psIndexedThirdLevelSearch, i); pcDescriptor->Cache(pvCaches[i]); } free(pvCaches); } }