From 6da3e92dab82554db8492d2bd7981ecd9ef3fd65 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期四, 23 七月 2020 15:57:34 +0800 Subject: [PATCH] sycronized --- src/queue/mm.c | 7 +++++-- src/libshm_queue.a | 0 demo/queue | 0 src/queue/include/shm_queue.h | 6 +++++- test_socket/dgram_socket_test | 0 src/queue/hashtable.c | 8 +++++++- demo/pub_sub | 0 test_socket/dgram_mod_req_rep | 0 src/queue/include/lock_free_queue.h | 5 +++-- demo/req_rep | 0 10 files changed, 20 insertions(+), 6 deletions(-) diff --git a/demo/pub_sub b/demo/pub_sub index 1cc620d..093adca 100755 --- a/demo/pub_sub +++ b/demo/pub_sub Binary files differ diff --git a/demo/queue b/demo/queue index 43913ed..3676d0e 100755 --- a/demo/queue +++ b/demo/queue Binary files differ diff --git a/demo/req_rep b/demo/req_rep index a32bb1f..a9c3f85 100755 --- a/demo/req_rep +++ b/demo/req_rep Binary files differ diff --git a/src/libshm_queue.a b/src/libshm_queue.a index 92905db..e50435f 100644 --- a/src/libshm_queue.a +++ b/src/libshm_queue.a Binary files differ diff --git a/src/queue/hashtable.c b/src/queue/hashtable.c index 43c59ce..21700ac 100755 --- a/src/queue/hashtable.c +++ b/src/queue/hashtable.c @@ -91,9 +91,12 @@ size_t code = hashcode(key); tailq_entry_t *item; void *oldvalue; + + SemUtil::dec(hashtable->wlock); tailq_header_t *my_tailq_head = hashtable->array[code] ; if ( my_tailq_head == NULL) { + SemUtil::inc(hashtable->wlock); return NULL; } else @@ -108,11 +111,12 @@ /* mm_free the item as we don't need it anymore. */ mm_free(item); - + SemUtil::inc(hashtable->wlock); return oldvalue; } } } + SemUtil::inc(hashtable->wlock); return NULL; } @@ -124,6 +128,7 @@ void hashtable_removeall(hashtable_t *hashtable) { tailq_entry_t *item; + SemUtil::dec(hashtable->wlock); for (int i = 0; i < MAPSIZE; i++) { tailq_header_t *my_tailq_head = hashtable->array[i] ; @@ -139,6 +144,7 @@ mm_free(my_tailq_head); hashtable->array[i] = NULL; } + SemUtil::inc(hashtable->wlock); } /** diff --git a/src/queue/include/lock_free_queue.h b/src/queue/include/lock_free_queue.h index f34079f..0b6c42f 100644 --- a/src/queue/include/lock_free_queue.h +++ b/src/queue/include/lock_free_queue.h @@ -78,7 +78,7 @@ int items; public: - // int mutex; + int mutex; LockFreeQueue(size_t qsize = LOCK_FREE_Q_DEFAULT_SIZE); /// @brief destructor of the class. @@ -151,7 +151,7 @@ // std::cout << "LockFreeQueue init reference=" << reference << std::endl; slots = SemUtil::get(IPC_PRIVATE, qsize); items = SemUtil::get(IPC_PRIVATE, 0); - // mutex = SemUtil::get(IPC_PRIVATE, 1); + mutex = SemUtil::get(IPC_PRIVATE, 1); } template < @@ -163,6 +163,7 @@ LoggerFactory::getLogger().debug("LockFreeQueue desctroy"); SemUtil::remove(slots); SemUtil::remove(items); + SemUtil::remove(mutex); } template < diff --git a/src/queue/include/shm_queue.h b/src/queue/include/shm_queue.h index d853774..30e2e28 100644 --- a/src/queue/include/shm_queue.h +++ b/src/queue/include/shm_queue.h @@ -6,7 +6,7 @@ #include "lock_free_queue.h" #include "logger_factory.h" #include "shm_allocator.h" - +#include "sem_util.h" // default Queue size // #define LOCK_FREE_Q_DEFAULT_SIZE 16 @@ -97,6 +97,7 @@ template < typename ELEM_T > SHMQueue<ELEM_T>::~SHMQueue() { + SemUtil::dec( queue->mutex); queue->reference--; LoggerFactory::getLogger().debug("SHMQueue destructor reference===%d", queue->reference.load()); if(queue->reference.load() == 0) { @@ -104,7 +105,10 @@ hashtable_t *hashtable = mm_get_hashtable(); hashtable_remove(hashtable, KEY); LoggerFactory::getLogger().debug("SHMQueue destructor delete queue"); + } else { + SemUtil::inc(queue->mutex); } + } template < typename ELEM_T > diff --git a/src/queue/mm.c b/src/queue/mm.c index bfd27d9..179f369 100644 --- a/src/queue/mm.c +++ b/src/queue/mm.c @@ -81,7 +81,7 @@ static void *place(void *bp, size_t size); static void *find_fit(size_t size); static void *coalesce(void *bp); -static void rm_fblock(void *bp); +static inline void rm_fblock(void *bp); static void insert_fblock (void *bp); static void *mem_sbrk(int incr); @@ -444,9 +444,12 @@ /** * remove a block form free list */ -static void rm_fblock(void *rbp) +static inline void rm_fblock(void *rbp) { // the successor of the previous block of rbp point to next block of rbp +// err_msg(0, "SUCCRP(PREV_FBLKP(rbp) %p\n", SUCCRP(PREV_FBLKP(rbp)) ); +// err_msg(0, "NEXT_FBLKP(rbp)%p\n", NEXT_FBLKP(rbp) ); + PUT_PTR(SUCCRP(PREV_FBLKP(rbp)), NEXT_FBLKP(rbp)); // the predecessor of then next block of rbp point to previous block of rbp PUT_PTR(PREDRP(NEXT_FBLKP(rbp)), PREV_FBLKP(rbp)); diff --git a/test_socket/dgram_mod_req_rep b/test_socket/dgram_mod_req_rep index f31e2b9..2643d2f 100755 --- a/test_socket/dgram_mod_req_rep +++ b/test_socket/dgram_mod_req_rep Binary files differ diff --git a/test_socket/dgram_socket_test b/test_socket/dgram_socket_test index 9752490..56cbe94 100755 --- a/test_socket/dgram_socket_test +++ b/test_socket/dgram_socket_test Binary files differ -- Gitblit v1.8.0