| | |
| | | |
| | | newsize = ALIGN(size + (SIZE_T_SIZE << 1) + (PTR_SIZE << 1) ); |
| | | |
| | | //fprintf(stderr, "mm_malloc : size=%u\n", size); |
| | | /* Search the free list for a fit */ |
| | | SemUtil::dec(mutex); |
| | | if ((ptr = find_fit(newsize)) != NULL) |
| | |
| | | } else { |
| | | SemUtil::inc(mutex); |
| | | err_msg(0, "mm_malloc : out of memery\n"); |
| | | LoggerFactory::getLogger()->fatal("mm_malloc : out of memery\n"); |
| | | // abort(); |
| | | exit(1); |
| | | |
| | | return NULL; |
| | | } |
| | | |
| | |
| | | |
| | | /* |
| | | * mm_init - Initialize the memory manager, M unit |
| | | * @return 是否第一次创建 |
| | | */ |
| | | bool mm_init(size_t heap_size) |
| | | { |
| | |
| | | first = false; |
| | | shmid = shmget(SHM_KEY, 0, 0); |
| | | } |
| | | |
| | | if (shmid == -1) |
| | | err_exit(errno, "mm_init shmget"); |
| | | shmp = shmat(shmid, key_addr, 0); |
| | |
| | | return first; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @return 是否真正销毁成功 |
| | | */ |
| | | 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到共享内存上 |
| | | // 多个进程attach在共享内存上 |
| | | if (shmid_ds.shm_nattch > 1) { |
| | | //detache |
| | | if (shmdt(shmp) == -1) { |
| | |
| | | SemUtil::inc(mutex); |
| | | return false; |
| | | } else { |
| | | |
| | | // 只有当前一个进程attach到共享内存上 |
| | | hashtable_destroy(hashtable); |
| | | //detache |
| | | if (shmdt(shmp) == -1) { |
| | |
| | | err_exit(errno, "mm_destroy shmctl IPC_RMID"); |
| | | else |
| | | LoggerFactory::getLogger()->debug("shared memory destroy\n"); |
| | | |
| | | LoggerFactory::getLogger()->debug( "mm_destroy: real destroy."); |
| | | |
| | | SemUtil::inc(mutex); |
| | | SemUtil::remove(mutex); |
| | |
| | | |
| | | void mm_free_by_key(int key) { |
| | | void *ptr; |
| | | |
| | | ptr = hashtable_get(hashtable, key); |
| | | if(ptr != NULL) { |
| | | mm_free(ptr); |