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 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); }
void node_free(node *n) { nodemem -= sizeof(node); nnodes -= 1; n->type = FREE; pushFree((stack *)n, (stack **)(&freelist)); }
void name_free(namestr *n) { namemem -= sizeof(namestr); nnames -= 1; pushFree((stack *)n, (stack **)(&namefreelist)); }
void string_free(string *n) { stringmem -= slen(n->s) + 1; nstrings -= 1; pushFree((stack *)n, (stack **)(&stringfreelist)); }