src/queue/hashtable.c | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/queue/include/mem_pool.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/queue/include/mm.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/queue/include/shm_queue.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/queue/mm.c | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/queue/shm_mm.c | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/socket/shm_socket.c | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
test_socket/dgram_mod_req_rep.c | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/queue/hashtable.c
@@ -300,7 +300,7 @@ while(_hashtable_get(hashtable, key) != NULL) { key++; } // 占用key _hashtable_put(hashtable, key, (void *)1); SemUtil::inc(hashtable->wlock); return key; src/queue/include/mem_pool.h
@@ -34,6 +34,15 @@ return ptr; } static inline void mem_pool_free (void *ptr) { mm_free(ptr); // notify malloc SemUtil::set(mem_pool_cond, 1); } template <typename T> static inline T* mem_pool_attach(int key) { void *ptr; @@ -51,30 +60,17 @@ } static inline void mem_pool_free_by_key(int key) { void *ptr; // T* tptr; hashtable_t *hashtable = mm_get_hashtable(); ptr = hashtable_get(hashtable, key); if(ptr != NULL) { mm_free(ptr); hashtable_remove(hashtable, key); } return mm_free_by_key(key); } static inline void mem_pool_free (void *ptr) { mm_free(ptr); // notify malloc SemUtil::set(mem_pool_cond, 1); } static inline void *mem_pool_realloc (void *ptr, size_t size) { return mm_realloc(ptr, size); } static inline int mem_pool_alloc_key() { hashtable_t *hashtable = mm_get_hashtable(); return hashtable_alloc_key(hashtable); return mm_alloc_key(); } src/queue/include/mm.h
@@ -11,6 +11,13 @@ extern void *mm_malloc (size_t size); extern void mm_free (void *ptr); extern void *mm_realloc(void *ptr, size_t size); extern void * mm_get_by_key(int key); extern void mm_free_by_key(int key); extern int mm_alloc_key() ; extern hashtable_t * mm_get_hashtable(); // extern int mm_checkheap(int verbose); src/queue/include/shm_queue.h
@@ -103,12 +103,11 @@ SemUtil::dec(queue->mutex); queue->reference--; // LoggerFactory::getLogger().debug("SHMQueue destructor reference===%d", // queue->reference.load()); if (queue->reference.load() == 0) { // delete queue; delete queue; hashtable_t *hashtable = mm_get_hashtable(); hashtable_remove(hashtable, KEY); // LoggerFactory::getLogger().debug("SHMQueue destructor delete queue\n"); // printf("SHMQueue destructor delete queue\n"); } else { SemUtil::inc(queue->mutex); } src/queue/mm.c
@@ -304,6 +304,23 @@ 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 */ src/queue/shm_mm.c
@@ -11,6 +11,5 @@ } int shm_alloc_key() { hashtable_t *hashtable = mm_get_hashtable(); return hashtable_alloc_key(hashtable); return mm_alloc_key(); } src/socket/shm_socket.c
@@ -17,6 +17,15 @@ int _shm_close_stream_socket(shm_socket_t *socket, bool notifyRemote); static inline int _shm_socket_check_key(shm_socket_t *socket) { void *tmp_ptr = mm_get_by_key(socket->port); if (tmp_ptr!= NULL && tmp_ptr != (void *)1 && !socket->force_bind ) { err_exit(0, "key %d has already been in used!", socket->port); return 0; } return 1; } SHMQueue<shm_msg_t> *_attach_remote_queue(int port); shm_socket_t *shm_open_socket(shm_socket_type_t socket_type) { @@ -67,9 +76,7 @@ socket->port = port; } else { if (hashtable_get(hashtable, socket->port) != NULL && !socket->force_bind) { err_exit(0, "key %d has already been in used!", socket->port); } _shm_socket_check_key(socket); } socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); @@ -137,6 +144,7 @@ return NULL; } int shm_connect(shm_socket_t *socket, int port) { if (socket->socket_type != SHM_SOCKET_STREAM) { err_exit(0, "can not invoke shm_connect method with a socket which is not " @@ -150,10 +158,7 @@ if (socket->port == -1) { socket->port = hashtable_alloc_key(hashtable); } else { if (hashtable_get(hashtable, socket->port) != NULL && !socket->force_bind ) { err_exit(0, "key %d has already been in used!", socket->port); } _shm_socket_check_key(socket); } socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); @@ -249,10 +254,7 @@ socket->port = hashtable_alloc_key(hashtable); } else { if (hashtable_get(hashtable, socket->port) != NULL) { if(!socket->force_bind) err_exit(0, "key %d has already been in used!", socket->port); } _shm_socket_check_key(socket); } socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); @@ -306,10 +308,7 @@ socket->port = hashtable_alloc_key(hashtable); } else { if (hashtable_get(hashtable, socket->port) != NULL) { if(!socket->force_bind) err_exit(0, "key %d has already been in used!", socket->port); } _shm_socket_check_key(socket); } socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); @@ -351,6 +350,8 @@ return -1; } // ============================================================================================================ /** * 绑定key到队列,但是并不会创建队列。如果没有对应指定key的队列提示错误并退出 */ test_socket/dgram_mod_req_rep.c
@@ -146,7 +146,9 @@ port = atoi(argv[2]); if (strcmp("server", argv[1]) == 0) { server(port); int temp = shm_alloc_key(); printf("tmp=%d\n", temp); server(temp); } if (strcmp("client", argv[1]) == 0)