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);
	}
}