| | |
| | | return first; |
| | | } |
| | | |
| | | |
| | | bool mm_destroy(void) { |
| | | struct shmid_ds shmid_ds; |
| | | |
| | | |
| | | SemUtil::dec(mutex); |
| | | |
| | | if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) { |
| | | //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch); |
| | | // 只有当前一个进程attach到共享内存上 |
| | | if(shmid_ds.shm_nattch == 1) { |
| | | |
| | | hashtable_destroy(hashtable); |
| | | //detache |
| | | if (shmdt(shmp) == -1) { |
| | | LoggerFactory::getLogger()->error(errno, "mm_destroy shmdt"); |
| | | SemUtil::inc(mutex); |
| | | return false; |
| | | } |
| | | |
| | | //remove shared memery |
| | | if (shmctl(shmid, IPC_RMID, 0) == -1) |
| | | err_exit(errno, "mm_destroy shmctl IPC_RMID"); |
| | | else |
| | | LoggerFactory::getLogger()->debug("shared memory destroy\n"); |
| | | |
| | | SemUtil::inc(mutex); |
| | | SemUtil::remove(mutex); |
| | | return true; |
| | | |
| | | } else { |
| | | SemUtil::inc(mutex); |
| | | return false; |
| | | } |
| | | |
| | | } else { |
| | | err_msg(errno, "mm_destroy shmctl IPC_STAT"); |
| | | SemUtil::inc(mutex); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | hashtable_t * mm_get_hashtable() { |
| | | return hashtable; |
| | | } |
| | |
| | | int mm_alloc_key() { |
| | | return hashtable_alloc_key(hashtable); |
| | | } |
| | | /* |
| | | * mm_init - Initialize the memory manager |
| | | */ |
| | | // bool mm_init2(size_t offset, void **addr) |
| | | // { |
| | | |
| | | // //已经初始化过了 |
| | | // SemUtil::dec(mutex); |
| | | // if (shmid != -1){ |
| | | // *addr = shmp; |
| | | // SemUtil::inc(mutex); |
| | | // return false; |
| | | // } |
| | | |
| | | // bool first = true; |
| | | |
| | | |
| | | // shmid = shmget(SHM_KEY, MAX_HEAP, IPC_CREAT | IPC_EXCL | OBJ_PERMS); |
| | | // if (shmid == -1 && errno == EEXIST) { |
| | | // first = false; |
| | | // shmid = shmget(SHM_KEY, 0, 0); |
| | | // } |
| | | // if (shmid == -1) |
| | | // err_exit(errno, "mm_init shmget"); |
| | | // shmp = shmat(shmid, key_addr, 0); |
| | | // if ((long)shmp == -1) |
| | | // err_exit(errno, "mm_init shmat"); |
| | | |
| | | // mem_start_brk = (void*)ALIGN((size_t)((char *)shmp + offset + ALIGNMENT)); |
| | | // mem_max_addr = (void *)((char *)shmp+ MAX_HEAP); |
| | | // mem_max_size = (char *)mem_max_addr - (char*)mem_start_brk; |
| | | // mem_brk = mem_start_brk; |
| | | // void *free_listp; |
| | | // /* Create the initial empty heap */ |
| | | // int initsize = ALIGN(3 * SIZE_T_SIZE + 2 * PTR_SIZE); |
| | | // heap_listp = (char *)mem_start_brk + initsize - 2 * SIZE_T_SIZE - 2 * PTR_SIZE; |
| | | |
| | | // if(!first) { |
| | | // *addr = shmp; |
| | | // SemUtil::inc(mutex); |
| | | // return first; |
| | | // } |
| | | |
| | | |
| | | // if ((mem_sbrk(initsize)) == (void *) - 1) |
| | | // err_exit(errno, "mm_init mem_sbrk"); |
| | | |
| | | // PUT((char *)mem_start_brk + initsize - SIZE_T_SIZE, PACK(0, 1)); /* Epilogue header */ |
| | | // /*PUT(HDRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1)); |
| | | // PUT(FTRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1));*/ |
| | | |
| | | // PUT(HDRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1)); |
| | | // PUT(FTRP(heap_listp), PACK(initsize - SIZE_T_SIZE, 1)); |
| | | |
| | | // /** |
| | | // * here the heap_listp can be look as a ancher which concat the header and tail of free-list to form a ring, and the heap_list itself will never be used as a free block |
| | | // */ |
| | | // PUT_PTR(SUCCRP(heap_listp), heap_listp); |
| | | // PUT_PTR(PREDRP(heap_listp), heap_listp); |
| | | // /* Extend the empty heap with a free block of CHUNKSIZE bytes */ |
| | | // if ((free_listp = extend_heap(mem_max_size - initsize - ALIGNMENT)) == NULL) |
| | | // err_exit(errno, "mm_init extend_heap"); |
| | | |
| | | // *addr = shmp; |
| | | // SemUtil::inc(mutex); |
| | | // return first; |
| | | // } |
| | | |
| | | |
| | | |
| | | bool mm_destroy(void) { |
| | | struct shmid_ds shmid_ds; |
| | | //detache |
| | | SemUtil::dec(mutex); |
| | | if (shmdt(shmp) == -1) { |
| | | err_msg(errno, "mm_destroy shmdt"); |
| | | SemUtil::inc(mutex); |
| | | } |
| | | |
| | | |
| | | if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) { |
| | | //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch); |
| | | if(shmid_ds.shm_nattch == 0) { |
| | | //remove shared memery |
| | | if (shmctl(shmid, IPC_RMID, 0) == -1) |
| | | err_exit(errno, "mm_destroy shmctl IPC_RMID"); |
| | | else |
| | | LoggerFactory::getLogger()->debug("shared memory destroy\n"); |
| | | |
| | | SemUtil::inc(mutex); |
| | | SemUtil::remove(mutex); |
| | | return true; |
| | | |
| | | } else { |
| | | SemUtil::inc(mutex); |
| | | } |
| | | return false; |
| | | } else { |
| | | err_msg(errno, "mm_destroy shmctl IPC_STAT"); |
| | | SemUtil::inc(mutex); |
| | | return false; |
| | | } |
| | | |
| | | |
| | | } |
| | | /* |
| | | * extend_heap - Extend heap with free block and return its block pointer |
| | | */ |