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