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); } }
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); } }
void BufSync(void) { Buf* pBuf; while( (pBuf = popDirty()) != NULL ) { //write to device. DevWriteBlock(pBuf->blkno, (char*)pBuf->pMem); removeDirty(pBuf->blkno); insertClean(pBuf); } }
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; }