void CIndexedHuge::EvictThirdLevelChunk(SIndexedThirdLevelSearch* psIndexedThirdLevelSearch)
{
	SIndexedThirdLevelSearch**		ppsIndexedThirdLevelSearch;
	SIndexedSecondLevelSearch*		psIndexedSecondLevelSearch;
	int								iSecondLevelOffset;

	psIndexedSecondLevelSearch = psIndexedThirdLevelSearch->psParent;

	//Clear the second level chunk pointer pointing to this third level chunk.
	iSecondLevelOffset = psIndexedThirdLevelSearch->iSecondLevelOffset;
	ppsIndexedThirdLevelSearch = GetIndexedThirdLevelChunk(psIndexedSecondLevelSearch, iSecondLevelOffset);
	(*ppsIndexedThirdLevelSearch) = NULL;

	//Roll to the next third level chunk if the chunk being evicted was this one.
	if (mpsFirstThirdLevelChunk == psIndexedThirdLevelSearch)
	{
		mpsFirstThirdLevelChunk = psIndexedThirdLevelSearch->psNext;
	}

	EvictCachedObjects(psIndexedThirdLevelSearch);

	SaveThirdLevelChunk(psIndexedThirdLevelSearch);

	memset_fast(psIndexedThirdLevelSearch, 0, sizeof(SIndexedThirdLevelSearch) + (miThirdLevelChunkWidth*sizeof(CIndexedDataDescriptor)));

	miThirdLevelEvictions += miThirdLevelChunkWidth;
}
Example #2
0
/* Interrupt routine to run when the timer expires */
void interrupt isr_timer1(void) {
    /* Fill the screen with a random color */
    memset_fast(lcd_Ram, randInt(0,255), LCD_SIZE);
    
    /* Must acknowledge that the interrupt occured to clear the flag */
    int_Acknowledge = INT_TIMER1;
}
SIndexedSecondLevelSearch* CIndexedHuge::LoadSecondLevelChunk(int iSecondLevelIndex)
{
	SIndexedSecondLevelSearch*		psIndexedSecondLevelSearch;
	int								iPrevLast;
	int								iSize;

	iSize = (sizeof(SIndexedSecondLevelSearch) + (sizeof(SIndexedThirdLevelSearch*) * miSecondLevelChunkWidth));
	if (!mbSecondLevelCacheFull)
	{
		iPrevLast = miLastSecondLevelChunk;
		miLastSecondLevelChunk = IncrementSecondLevelNumber(miLastSecondLevelChunk);
		if ((miLastSecondLevelChunk != 0) || (iPrevLast == -1))
		{
			psIndexedSecondLevelSearch = (SIndexedSecondLevelSearch*)RemapSinglePointer(mpvSecondLevel, miLastSecondLevelChunk * iSize);
			memset_fast(psIndexedSecondLevelSearch, 0, iSize);

			SetSecondLevelChunk(psIndexedSecondLevelSearch, iSecondLevelIndex);
			return psIndexedSecondLevelSearch;
		}

		mbSecondLevelCacheFull = TRUE;
		miLastSecondLevelChunk--;
	}
	miLastSecondLevelChunk = IncrementSecondLevelNumber(miLastSecondLevelChunk);

	psIndexedSecondLevelSearch = (SIndexedSecondLevelSearch*)RemapSinglePointer(mpvSecondLevel, miLastSecondLevelChunk * iSize);
	EvictSecondLevelChunk(psIndexedSecondLevelSearch);

	SetSecondLevelChunk(psIndexedSecondLevelSearch, iSecondLevelIndex);
	return psIndexedSecondLevelSearch;
}
void CNamesIndexedSorterSource::Init(int iWidth, filePos iPosition)
{
	mpcCurrent = (CNamedIndexedBlock*)malloc(iWidth);
	memset_fast(mpcCurrent, 0, iWidth);

	miPosition = iPosition;
	miCount = 0;
}
Example #5
0
void interrupt isr_rtc(void) {
    /* Get the status of the RTC interrupt register */
    uint8_t status = rtc_IntStatus;

    /* If a second passed, increment a counter */
    if(status & RTC_SEC_INT) {
        seconds++;
        memset_fast(lcd_Ram, randInt(0,255), LCD_SIZE);
    }

    /* Acknowledge all outstanding interrupts */
    rtc_IntAcknowledge = status;
}
BOOL CNamedIndexesBlock::Cache(void* pvCache)
{
	if (pvCache)
	{
		mpvCachePos = pvCache;
		memset_fast(pvCache, 0, (size_t)(miBlockChunkSize * miBlockWidth));
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
Example #7
0
void pid_init(pid_instance * S, int32 resetStateFlag)
{

	/* Derived coefficient A0 */
	S->A0 = S->Kp + S->Ki + S->Kd;

	/* Derived coefficient A1 */
	S->A1 = (-S->Kp) - ((float) 2.0 * S->Kd);

	/* Derived coefficient A2 */
	S->A2 = S->Kd;

	/* Check whether state needs reset or not */
	if (resetStateFlag)
	{
		/* Clear the state buffer.  The size will be always 3 samples */
		memset_fast(S->state, 0, 3u * 2);
	}

}
BOOL CNamedIndexesBlock::AddUnsafe(OIndex oi, CChars* szName)
{
	CArrayBlock			avFakeBlock;
	CNamedIndexedBlock	sBlock;
	int					iIndex;

	if (!mpvCachePos)
	{
		return FALSE;
	}

	memset_fast(&sBlock, 0, miBlockWidth);
	sBlock.Set(szName->Text(), oi);
	avFakeBlock.Fake(miBlockWidth, mpvCachePos, (int)miUsedBlocks, (int)miBlockChunkSize);
	
	//It's safe to insert into a faked array because we know there is at least one free element in the chunk
	//That is: miBlockChunkSize - miUsedBlocks >= 1
	iIndex = avFakeBlock.InsertIntoSorted(&CompareNamedIndexedBlock, &sBlock, FALSE);

	if (miUsedBlocks == 0)
	{
		mszFirst.Set(szName);
		mszLast.Set(szName);
	}
	else
	{
		if (iIndex == 0)
		{
			mszFirst.Set(szName);
		}
		else if (iIndex == miUsedBlocks)
		{
			mszLast.Set(szName);
		}
	}

	miUsedBlocks++;
	Dirty();
	return TRUE;
}
BOOL CIndexedHuge::ChangeStrategy(int iSecondLevelWidth, int iThirdLevelWidth, int iNumSecondLevelChunks, int iNumThirdLevelChunks)
{
	int		iSecondLevelCacheSize;
	int		iThirdLevelCacheSize;

	if (miLastOi != INVALID_O_INDEX)
	{
		return FALSE;
	}
	if ((iSecondLevelWidth % iThirdLevelWidth) != 0)
	{
		return FALSE;
	}

	miSecondLevelChunkWidth = iSecondLevelWidth;
	miThirdLevelChunkWidth = iThirdLevelWidth;

	miNumSecondLevelChunks = iNumSecondLevelChunks;
	miNumThirdLevelChunks = iNumThirdLevelChunks;

	SafeFree(mpvSecondLevel);
	SafeFree(mpvThirdLevel);

	iSecondLevelCacheSize = GetSecondLevelCacheByteSize();
	mpvSecondLevel = malloc(iSecondLevelCacheSize);
	memset_fast(mpvSecondLevel, 0, iSecondLevelCacheSize);

	iThirdLevelCacheSize = GetThirdLevelCacheByteSize();
	mpvThirdLevel = malloc(iThirdLevelCacheSize);
	ClearThirdLevelChunks();

	miLastSecondLevelChunk = -1;

	mapFirstLevel.Kill();
	mapFirstLevel.Allocate(&gcSystemAllocator, iNumSecondLevelChunks);
	mapFirstLevel.Zero();

	return TRUE;
}
BOOL CNamedIndexesBlock::Cache(CIndexedFile* pcFile, void* pvCache)
{
	BOOL	bResult;
	void*	pvClear;

	if (IsInFile())
	{
		mpvCachePos = pvCache;
		bResult = pcFile->Read(miDataIndex, pvCache, miUsedBlocks);

		if (IsNotFull())
		{
			pvClear = RemapSinglePointer(pvCache, (size_t)(miBlockWidth * miUsedBlocks));
			memset_fast(pvClear, 0, (size_t)((miBlockChunkSize - miUsedBlocks) * miBlockWidth));
		}

		mbDirty = FALSE;
		return bResult;
	}
	else
	{
		return FALSE;
	}
}
Example #11
0
void pid_reset(pid_instance * S)
{

	/* Clear the state buffer.  The size will be always 3 samples */
	memset_fast(S->state, 0, 3u * 2);
}
void FillCachedElement(void* pvData, int iSize, char c)
{
	memset_fast(pvData, c, iSize-1);
	((char*)pvData)[iSize-1] = '\0';
}
BOOL CNamedIndexesOptimiser::OptimiseBlock(CNamedIndexesBlocks* pcBlocks, CIndexedFile* pcIndexedFile)
{
	int								i;
	CNamesIndexedSorterSource*		pcSource;
	CFileBasic						cDestFile;
	BOOL							bResult;
	filePos							iNumNames;
	CNamedIndexedBlock				cBlock;

	if (!pcIndexedFile)
	{
		return TRUE;
	}

	bResult = AllocateSources(pcBlocks, pcIndexedFile);
	ReturnOnFalse(bResult);
	bResult = LoadInitialSources(pcIndexedFile, pcBlocks->GetDataSize());
	ReturnOnFalse(bResult);

	bResult = OpenDestinationFile(&cDestFile, pcIndexedFile->GetFileName());
	if (!bResult)
	{
		KillSources();
		return FALSE;
	}

	iNumNames = macSources.NumElements() * pcBlocks->GetNumBlocks();
	for (i = 0; i < iNumNames; i++)
	{
		pcSource = GetSmallestSource(pcBlocks->GetNumBlocks());
		if (!pcSource)
		{
			break;
		}

		bResult = cDestFile.WriteData(pcSource->mpcCurrent, pcBlocks->GetDataSize());
		if (!bResult)
		{
			cDestFile.Close();
			cDestFile.Kill();
			KillSources();
			return FALSE;
		}

		bResult = pcSource->ReadNext(pcIndexedFile->GetPrimaryFile(), pcBlocks->GetDataSize());
		if (!bResult)
		{
			cDestFile.Close();
			cDestFile.Kill();
			KillSources();
			return TRIERROR;
		}
	}

	memset_fast(&cBlock, 0, pcBlocks->GetDataSize());
	for (; i < iNumNames; i++)
	{
		cDestFile.WriteData(&cBlock, pcBlocks->GetDataSize());
	}

	cDestFile.Close();
	cDestFile.Kill();
	KillSources();
	return TRUE;
}