Ejemplo n.º 1
0
BOOL CIndexedHuge::Get(CIndexedDataDescriptor* pcDescriptor, OIndex oi)
{
	CIndexedDataDescriptor*			pcDescriptorInCache;

	if (oi > miLastOi)
	{
		return FALSE;
	}

	pcDescriptorInCache = PrivateGetDescriptor(oi);
	if (!pcDescriptorInCache->IsAllocated())
	{
		return FALSE;
	}

	memcpy(pcDescriptor, pcDescriptorInCache, sizeof(CIndexedDataDescriptor));
	return TRUE;
}
Ejemplo n.º 2
0
BOOL CIndexedHuge::Set(CIndexedDataDescriptor* pacDescriptors, int iNumDescriptors)
{
	int					i;
	BOOL				bDirtyTesting;
	CIndexedDataDescriptor*	pcDescriptor;

	bDirtyTesting = mbDirtyTesting;
	mbDirtyTesting = FALSE;
	for (i = 0; i < iNumDescriptors; i++)
	{
		pcDescriptor = &pacDescriptors[i];
		if (pcDescriptor->IsAllocated())
		{
			Set(pcDescriptor);
		}
	}
	mbDirtyTesting = bDirtyTesting;
	return TRUE;
}
Ejemplo n.º 3
0
void CIndexedHuge::EvictCachedObjects(SIndexedThirdLevelSearch* psIndexedThirdLevelSearch)
{
	int						i;
	CIndexedDataDescriptor*	pcDescriptor;

	if ((mpcIndexedData) && (mpcIndexedData->IsCaching()))
	{
		for (i = 0; i < miThirdLevelChunkWidth; i++)
		{
			pcDescriptor = GetCachedDescriptor(psIndexedThirdLevelSearch, i);
			if (pcDescriptor->IsAllocated())
			{
				mpcIndexedData->EvictFromCache(pcDescriptor);

				miObjectEvictions++;
			}
		}
	}
}
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;
}
BOOL CIndexedFilesEvictedDescriptorList::SetDescriptor(OIndex oi, CIndexedDataDescriptor* pcDescriptor, BOOL bNoEviction)
{
	CIndexedDataDescriptor* pcExistingDescriptor;
	BOOL					bUpdated;

	pcExistingDescriptor = mcDescriptors.Get(oi);
	if (!pcExistingDescriptor)
	{
		mbDescriptorsWritten = FALSE;
		return mcDescriptors.Put(oi, pcDescriptor);
	}
	else
	{
		bUpdated = pcExistingDescriptor->Update(pcDescriptor);
		if (bUpdated)
		{
			mbDescriptorsWritten = FALSE;
		}
		return TRUE;
	}
}
Ejemplo n.º 7
0
BOOL CIndexedHuge::PadFile(filePos iLength, filePos iOffset)
{
	CIndexedDataDescriptor	cZero;
	filePos					iDiff;
	filePos					i;
	filePos					iResult;
	filePos					iStart;

	iDiff = (iOffset - iLength) / sizeof(CIndexedDataDescriptor);
	iStart = iLength / sizeof(CIndexedDataDescriptor);
	cZero.Init(INVALID_O_INDEX, 0);
	for (i = 0; i < iDiff; i++)
	{
		iResult = mpcFile->Write(EFSO_SET, (iStart + i) * sizeof(CIndexedDataDescriptor), &cZero, sizeof(CIndexedDataDescriptor), 1);
		miDiskWrites += iResult;
		if (iResult != 1)
		{
			return FALSE;
		}
	}
	return TRUE;
}
Ejemplo n.º 8
0
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);
	}
}