示例#1
0
文件: hw2.c 项目: dayomi/Homework-1
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);
	}
}
示例#2
0
文件: hw2.c 项目: dayomi/Homework-1
void BufInit(void)
{
	int i = 0;
	Buf* pBuf;

	//init all list
	for( i=0; i<HASH_TBL_SIZE; i++ )
	{
		ppHashHead[i] = NULL;
		ppHashTail[i] = NULL;
	}
	for( i=0; i<3; i++ )
	{
		ppObjListHead[i] = NULL;
		ppObjListTail[i] = NULL;
	}
	pLruListHead = NULL;
	pLruListTail = NULL;

	//create buffers
	for( i=0; i<MAX_BUF_NUM; i++ )
	{
		pBuf = (Buf*)malloc(sizeof(Buf));
		pBuf->pMem = malloc(BLOCK_SIZE);
		pushFree(pBuf);
	}

	//init device
	DevCreateDisk();
	DevOpenDisk();

	//init semaphore
	semaInit();
	semaLock(SEMA_IDX_MAIN);
	semaLock(SEMA_IDX_DAEMON);

	//init daemon
	const int stack_size = 1024;
	char* stack = (char*)malloc(stack_size);
	memset(stack, 0, stack_size);
	char* stack_top = stack + stack_size;

	clone(BufDaemon, stack_top, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_VM, 0);
}
示例#3
0
void node_free(node *n) {
    nodemem -= sizeof(node);
    nnodes -= 1;
    n->type = FREE;
    pushFree((stack *)n, (stack **)(&freelist));
}
示例#4
0
void name_free(namestr *n) {
    namemem -= sizeof(namestr);
    nnames -= 1;
    pushFree((stack *)n, (stack **)(&namefreelist));
}
示例#5
0
void string_free(string *n) {
    stringmem -= slen(n->s) + 1;
    nstrings -= 1;
    pushFree((stack *)n, (stack **)(&stringfreelist));
}