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