Ejemplo n.º 1
0
int BufDaemon()
{
	Buf* pBuf;

	while(1)
	{
		semaLock(SEMA_IDX_DAEMON);
		while( countFree() <= ((MAX_BUF_NUM / 10) * 3) )
		{
			pBuf = popLru();
			removeHash(pBuf->blkno);
			if( existDirty(pBuf->blkno) )
			{
				//write to device.
				DevWriteBlock(pBuf->blkno, (char*)pBuf->pMem);
				removeDirty(pBuf->blkno);
			}
			else
			{
				removeClean(pBuf->blkno);
			}
			free(pBuf->pMem);
			memset(pBuf, 0, sizeof(Buf));
			pBuf->pMem = malloc(BLOCK_SIZE);
			pushFree(pBuf);
		}
		semaUnlock(SEMA_IDX_MAIN);
	}
}
Ejemplo n.º 2
0
void BufSync(void) {
	Buf* iterator;
	Buf* temp;
	for (iterator = ppObjListHead[BUF_LIST_DIRTY]; iterator != NULL; iterator = temp) {
		temp = iterator->poNext;
		DevWriteBlock(iterator->blkno, iterator->pMem);
		iterator->state = BUF_STATE_CLEAN;
		BufDeleteBuf(iterator);
		BufInsertToTail(iterator, iterator->blkno, BUF_LIST_CLEAN);
	}
}
Ejemplo n.º 3
0
void BufSync(void)
{
	Buf* pBuf;

	while( (pBuf = popDirty()) != NULL )
	{
		//write to device.
		DevWriteBlock(pBuf->blkno, (char*)pBuf->pMem);
		removeDirty(pBuf->blkno);
		insertClean(pBuf);
	}
}
Ejemplo n.º 4
0
void InsertObjectIntoObjFreeList(Buf* pBuf) {
	// 비어있는 리스트에 추가하려는 경우
	if (ppObjListTail[BUF_LIST_FREE] == NULL) {
		ppObjListHead[BUF_LIST_FREE] = pBuf;
		ppObjListTail[BUF_LIST_FREE] = pBuf;
		pBuf->poPrev = pBuf->poNext = NULL;
	}
	else {
		ppObjListHead[BUF_LIST_FREE]->poPrev = pBuf;
		pBuf->poNext = ppObjListHead[BUF_LIST_FREE];
		pBuf->poPrev = NULL;
		ppObjListHead[BUF_LIST_FREE] = pBuf;
	}
	
	if (pBuf->state == BUF_STATE_DIRTY) {
		DevWriteBlock(pBuf->blkno, pBuf->pMem);
	}
	
	pBuf->state = -1;
	pBuf->blkno = BLKNO_INVALID;
	pBuf->phPrev = pBuf->phNext = pBuf->plPrev = pBuf->plNext = NULL;
}