From 8c42a659c0cc9178d1f1305acb41dfbf4a8697ef Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 22 十月 2020 16:20:26 +0800
Subject: [PATCH] update
---
src/queue/mm.c | 125 +++++++++++++++++++++++------------------
1 files changed, 71 insertions(+), 54 deletions(-)
diff --git a/src/queue/mm.c b/src/queue/mm.c
index b09aa73..f09fbab 100644
--- a/src/queue/mm.c
+++ b/src/queue/mm.c
@@ -304,73 +304,90 @@
return hashtable;
}
+void * mm_get_by_key(int key) {
+ return hashtable_get(hashtable, key);
+}
+
+void mm_free_by_key(int key) {
+ void *ptr;
+ ptr = hashtable_get(hashtable, key);
+ if(ptr != NULL) {
+ mm_free(ptr);
+ hashtable_remove(hashtable, key);
+ }
+}
+
+
+int mm_alloc_key() {
+ return hashtable_alloc_key(hashtable);
+}
/*
* mm_init - Initialize the memory manager
*/
-bool mm_init2(size_t offset, void **addr)
-{
+// bool mm_init2(size_t offset, void **addr)
+// {
- //宸茬粡鍒濆鍖栬繃浜�
- SemUtil::dec(mutex);
- if (shmid != -1){
- *addr = shmp;
- SemUtil::inc(mutex);
- return false;
- }
+// //宸茬粡鍒濆鍖栬繃浜�
+// SemUtil::dec(mutex);
+// if (shmid != -1){
+// *addr = shmp;
+// SemUtil::inc(mutex);
+// return false;
+// }
- bool first = true;
+// 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");
+// 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;
+// 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(!first) {
+// *addr = shmp;
+// SemUtil::inc(mutex);
+// return first;
+// }
- if ((mem_sbrk(initsize)) == (void *) - 1)
- err_exit(errno, "mm_init mem_sbrk");
+// 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((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));
+// 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");
+// /**
+// * 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;
-}
+// *addr = shmp;
+// SemUtil::inc(mutex);
+// return first;
+// }
@@ -385,13 +402,13 @@
if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) {
- //LoggerFactory::getLogger().debug("shm_nattch=%d\n", shmid_ds.shm_nattch);
+ //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");
+ LoggerFactory::getLogger()->debug("shared memory destroy\n");
SemUtil::inc(mutex);
SemUtil::remove(mutex);
--
Gitblit v1.8.0