BOOL CIndexedFilesEvictedDescriptorList::IsDirty(OIndex oi) { CIndexedDataDescriptor* pcKeyDescriptor; SIndexedCacheDescriptor* psDataDescriptor; pcKeyDescriptor = mcDescriptors.Get(oi); if (pcKeyDescriptor) { if (pcKeyDescriptor->GetCache()) { psDataDescriptor = (SIndexedCacheDescriptor*)RemapSinglePointer(pcKeyDescriptor->GetCache(), -(int)(sizeof(SIndexedCacheDescriptor))); if (psDataDescriptor->iFlags & CACHE_DESCRIPTOR_FLAG_DIRTY) { return TRUE; } } } return FALSE; }
BOOL CIndexedData::IsDirty(OIndex oi) { CIndexedDataDescriptor cKeyDescriptor; SIndexedCacheDescriptor* psDataDescriptor; BOOL bInMemory; bInMemory = mcIndices.GetIfInMemory(&cKeyDescriptor, oi); if (bInMemory) { if (cKeyDescriptor.GetCache()) { psDataDescriptor = (SIndexedCacheDescriptor*)RemapSinglePointer(cKeyDescriptor.GetCache(), -(int)(sizeof(SIndexedCacheDescriptor))); if (psDataDescriptor->iFlags & CACHE_DESCRIPTOR_FLAG_DIRTY) { return TRUE; } } } return FALSE; }
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); } }