From 379f42982b8c57ee6511cb8e498019f454323977 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 07 七月 2020 11:04:39 +0800
Subject: [PATCH] update
---
squeue/include/queue_factory.h | 46 ++++++++++-----
squeue/include/SLinkedLockFreeQueue.h | 34 +++++-----
squeue/mm.c | 27 ++++----
squeue/sem_util.h | 4
squeue/include/lock_free_queue_impl_multiple_producer.h | 3
squeue/include/lock_free_queue_impl.h | 10 +++
squeue/mm.h | 4
test/test_queue.c | 12 +--
test/test_queue | 0
squeue/include/lock_free_queue.h | 4 +
test/test.h | 12 ++-
squeue/include/SAbstractQueue.h | 2
squeue/sem_util.c | 14 ++--
13 files changed, 99 insertions(+), 73 deletions(-)
diff --git a/squeue/include/SAbstractQueue.h b/squeue/include/SAbstractQueue.h
index 19c3d58..a72439f 100644
--- a/squeue/include/SAbstractQueue.h
+++ b/squeue/include/SAbstractQueue.h
@@ -1,8 +1,6 @@
// queue.h -- interface for a queue
#ifndef SAbstractQueue_H_
#define SAbstractQueue_H_
-#include "mm.h"
-#include "pcsem.h"
template <typename T>
class SAbstractQueue
diff --git a/squeue/include/SLinkedLockFreeQueue.h b/squeue/include/SLinkedLockFreeQueue.h
index 66596f2..8225920 100644
--- a/squeue/include/SLinkedLockFreeQueue.h
+++ b/squeue/include/SLinkedLockFreeQueue.h
@@ -2,7 +2,7 @@
#ifndef SLinkedLockFreeQueue_H_
#define SLinkedLockFreeQueue_H_
#include "mm.h"
-#include "pcsem.h"
+#include "sem_util.h"
#include "SAbstractQueue.h"
@@ -102,8 +102,8 @@
Head.store(pointer, std::memory_order_relaxed);
Tail.store(pointer, std::memory_order_relaxed);
- slots = pcsem::init(IPC_PRIVATE, qsize);
- items = pcsem::init(IPC_PRIVATE, 0);
+ slots = SemUtil::get(IPC_PRIVATE, qsize);
+ items = SemUtil::get(IPC_PRIVATE, 0);
}
@@ -111,8 +111,8 @@
SLinkedLockFreeQueue<T>::~SLinkedLockFreeQueue()
{
std::cerr << "SLinkedLockFreeQueue destory" << std::endl;
- pcsem::remove(slots);
- pcsem::remove(items);
+ SemUtil::remove(slots);
+ SemUtil::remove(items);
Node<T> * nodeptr;
@@ -189,12 +189,12 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::add(const T & item)
{
- if (pcsem::dec(slots) == -1) {
+ if (SemUtil::dec(slots) == -1) {
err_exit(errno, "add");
}
if (SLinkedLockFreeQueue<T>::_add(item)) {
- pcsem::inc(items);
+ SemUtil::inc(items);
return true;
}
return false;
@@ -204,7 +204,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::add_nowait(const T & item)
{
- if (pcsem::dec_nowait(slots) == -1) {
+ if (SemUtil::dec_nowait(slots) == -1) {
if (errno == EAGAIN)
return false;
else
@@ -212,7 +212,7 @@
}
if (SLinkedLockFreeQueue<T>::_add(item)) {
- pcsem::inc(items);
+ SemUtil::inc(items);
return true;
}
return false;
@@ -222,7 +222,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::add_timeout(const T & item, struct timespec * timeout)
{
- if (pcsem::dec_timeout(slots, timeout) == -1) {
+ if (SemUtil::dec_timeout(slots, timeout) == -1) {
if (errno == EAGAIN)
return false;
else
@@ -230,7 +230,7 @@
}
if (SLinkedLockFreeQueue<T>::_add(item)){
- pcsem::inc(items);
+ SemUtil::inc(items);
return true;
}
return false;
@@ -285,12 +285,12 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::remove(T & item)
{
- if (pcsem::dec(items) == -1) {
+ if (SemUtil::dec(items) == -1) {
err_exit(errno, "remove");
}
if (SLinkedLockFreeQueue<T>::_remove(item)) {
- pcsem::inc(slots);
+ SemUtil::inc(slots);
return true;
}
return false;
@@ -300,7 +300,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::remove_nowait(T & item)
{
- if (pcsem::dec_nowait(items) == -1) {
+ if (SemUtil::dec_nowait(items) == -1) {
if (errno == EAGAIN)
return false;
else
@@ -308,7 +308,7 @@
}
if (SLinkedLockFreeQueue<T>::_remove(item)) {
- pcsem::inc(slots);
+ SemUtil::inc(slots);
return true;
}
return false;
@@ -318,7 +318,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::remove_timeout(T & item, struct timespec * timeout)
{
- if (pcsem::dec_timeout(items, timeout) == -1) {
+ if (SemUtil::dec_timeout(items, timeout) == -1) {
if (errno == EAGAIN)
return false;
else
@@ -326,7 +326,7 @@
}
if (SLinkedLockFreeQueue<T>::_remove(item)) {
- pcsem::inc(slots);
+ SemUtil::inc(slots);
return true;
}
return false;
diff --git a/squeue/include/lock_free_queue.h b/squeue/include/lock_free_queue.h
index a800228..a8f7801 100644
--- a/squeue/include/lock_free_queue.h
+++ b/squeue/include/lock_free_queue.h
@@ -88,6 +88,8 @@
/// environments this function might return bogus values. See help in method
/// LockFreeQueue::size
inline bool full();
+
+ inline bool empty();
/// @brief push an element at the tail of the queue
/// @param the element to insert in the queue
@@ -139,7 +141,7 @@
inline uint32_t size();
inline bool full();
-
+
inline bool empty();
bool push(const ELEM_T &a_data);
diff --git a/squeue/include/lock_free_queue_impl.h b/squeue/include/lock_free_queue_impl.h
index f11a796..aa182a5 100644
--- a/squeue/include/lock_free_queue_impl.h
+++ b/squeue/include/lock_free_queue_impl.h
@@ -2,6 +2,8 @@
#define __LOCK_FREE_QUEUE_IMPL_H__
#include <assert.h> // assert()
+#include "mm.h"
+#include "sem_util.h"
template <
typename ELEM_T,
@@ -32,6 +34,14 @@
inline bool LockFreeQueue<ELEM_T, Q_TYPE>::full()
{
return m_qImpl.full();
+}
+
+template <
+ typename ELEM_T,
+ template <typename T> class Q_TYPE>
+inline bool LockFreeQueue<ELEM_T, Q_TYPE>::empty()
+{
+ return m_qImpl.empty();
}
template <
diff --git a/squeue/include/lock_free_queue_impl_multiple_producer.h b/squeue/include/lock_free_queue_impl_multiple_producer.h
index e324fcb..959cca8 100644
--- a/squeue/include/lock_free_queue_impl_multiple_producer.h
+++ b/squeue/include/lock_free_queue_impl_multiple_producer.h
@@ -3,8 +3,7 @@
#include <assert.h> // assert()
#include <sched.h> // sched_yield()
-#include "mm.h"
-#include "pcsem.h"
+
template <typename ELEM_T>
int ArrayLockFreeQueueMultipleProducers<ELEM_T>::m_reference = 0;
diff --git a/squeue/include/queue_factory.h b/squeue/include/queue_factory.h
index 6c71d14..b898a86 100644
--- a/squeue/include/queue_factory.h
+++ b/squeue/include/queue_factory.h
@@ -7,17 +7,26 @@
#include "SLinkedLockFreeQueue.h"
namespace QueueFactory{
+ hashtable_t * getHashTable() {
+ static hashtable_t *hashtable = NULL;
+ int first;
+
+ if(hashtable == NULL) {
+ first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
+ if (first)
+ hashtable_init(hashtable);
+ }
+ return hashtable;
+
+ }
template <typename T>
SLinkedLockFreeQueue<T>* createLinkedLockFreeQueue(int key, size_t size) {
- hashtable_t *hashtable;
+
+
SLinkedLockFreeQueue<T> *queue;
- int first;
-
- first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
-
- if (first)
- hashtable_init(hashtable);
+ hashtable_t *hashtable = getHashTable();
+
if ((queue = (SLinkedLockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
queue = new SLinkedLockFreeQueue<T>(size);
@@ -30,14 +39,9 @@
template <typename T>
LockFreeQueue<T>* createArrayLockFreeQueue(int key, size_t size=16) {
- hashtable_t *hashtable;
+
LockFreeQueue<T> *queue;
- int first;
-
- first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
-
- if (first)
- hashtable_init(hashtable);;
+ hashtable_t *hashtable = getHashTable();
//LockFreeQueue<int, 10000> q;
if ((queue = (LockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
queue = new LockFreeQueue<T>(size);
@@ -49,9 +53,21 @@
template <typename T>
- LockFreeQueue<T>* createQueue(int key, size_t size) {
+ LockFreeQueue<T>* createQueue(int key, size_t size = 16) {
return QueueFactory::createArrayLockFreeQueue<T>(key, size);
}
+ /**
+ * destroy queue
+ */
+ template <typename T>
+ void dropQueue(int key) {
+
+ LockFreeQueue<T> *queue = QueueFactory::createQueue<T> (key);
+ delete queue;
+ hashtable_t *hashtable = getHashTable();
+ hashtable_remove(hashtable, key);
+ }
+
}
#endif
diff --git a/squeue/mm.c b/squeue/mm.c
index 4135964..7b39391 100644
--- a/squeue/mm.c
+++ b/squeue/mm.c
@@ -2,7 +2,7 @@
* 绠$悊鍏变韩鍐呭瓨鐨勫垎閰嶏紝涓庨噴鏀�
*/
#include "mm.h"
-#include "pcsem.h"
+#include "sem_util.h"
/* $begin mallocmacros */
@@ -28,7 +28,7 @@
#define MIN_BLOCK_SIZE (ALIGN( (SIZE_T_SIZE << 1) + SIZE_T_SIZE + (PTR_SIZE << 1) ))
-#define MAX(x, y) ((x) > (y)? (x) : (y))
+//#define MAX(x, y) ((x) > (y)? (x) : (y))
/* Pack a size and allocated bit into a word */
#define PACK(size, alloc) ((size) | (alloc)) //line:vm:mm:pack
@@ -77,7 +77,8 @@
static int shmid = -1;
static void *shmp;
-static int mutex = pcsem::init(8899, 1);
+//static int mutex = SemUtil::get(8899, 1);
+static int mutex = SemUtil::get(IPC_PRIVATE, 1);
static void *mem_start_brk; /* points to first byte of heap */
static void *mem_brk; /* points to last byte of heap */
@@ -99,11 +100,11 @@
//fprintf(stderr, "mm_malloc : size=%u\n", size);
/* Search the free list for a fit */
- pcsem::dec(mutex);
+ SemUtil::dec(mutex);
if ((ptr = find_fit(newsize)) != NULL)
{
aptr = place(ptr, newsize);
- pcsem::inc(mutex);
+ SemUtil::inc(mutex);
return aptr;
} else {
fprintf(stderr, "mm_malloc : out of memery\n");
@@ -129,11 +130,11 @@
size_t size = GET_SIZE(HDRP(ptr));
- pcsem::dec(mutex);
+ SemUtil::dec(mutex);
PUT(HDRP(ptr), PACK(size, 0));
PUT(FTRP(ptr), PACK(size, 0));
coalesce(ptr);
- pcsem::inc(mutex);
+ SemUtil::inc(mutex);
}
@@ -214,10 +215,10 @@
{
//宸茬粡鍒濆鍖栬繃浜�
- pcsem::dec(mutex);
+ SemUtil::dec(mutex);
if (shmid != -1){
*addr = shmp;
- pcsem::inc(mutex);
+ SemUtil::inc(mutex);
return false;
}
@@ -246,7 +247,7 @@
if(!first) {
*addr = shmp;
- pcsem::inc(mutex);
+ SemUtil::inc(mutex);
return first;
}
@@ -271,19 +272,19 @@
err_exit(errno, "mm_init extend_heap");
*addr = shmp;
- pcsem::inc(mutex);
+ SemUtil::inc(mutex);
return first;
}
-void mm_deinit(void) {
+void mm_destroy(void) {
if (shmdt(shmp) == -1)
err_exit(errno, "mm_init shmdt");
if (shmctl(shmid, IPC_RMID, 0) == -1)
err_exit(errno, "mm_init shmctl IPC_RMID");
- pcsem::remove(mutex);
+ SemUtil::remove(mutex);
}
/*
* extend_heap - Extend heap with free block and return its block pointer
diff --git a/squeue/mm.h b/squeue/mm.h
index 728099f..0cb9729 100644
--- a/squeue/mm.h
+++ b/squeue/mm.h
@@ -6,7 +6,7 @@
#include "usg_typedef.h"
#include <sys/sem.h>
#include <sys/shm.h>
-#define MAX_HEAP (20*(1<<20)) /* 20 MB */
+#define MAX_HEAP (512*(1<<20)) /* 20 MB */
/* Hard-coded keys for IPC objects */
#define SHM_KEY 0x1234 /* Key for shared memory segment */
@@ -14,7 +14,7 @@
#define OBJ_PERMS (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)
extern bool mm_init(size_t offset, void **addr);
-extern void mm_deinit(void);
+extern void mm_destroy(void);
extern void *mm_malloc (size_t size);
extern void mm_free (void *ptr);
extern void *mm_realloc(void *ptr, size_t size);
diff --git a/squeue/pcsem.c b/squeue/sem_util.c
similarity index 92%
rename from squeue/pcsem.c
rename to squeue/sem_util.c
index a95f10d..d7819a2 100644
--- a/squeue/pcsem.c
+++ b/squeue/sem_util.c
@@ -1,7 +1,7 @@
-#include "pcsem.h"
+#include "sem_util.h"
-int pcsem::init(key_t key, unsigned int value) {
+int SemUtil::get(key_t key, unsigned int value) {
int semid, perms;
perms = S_IRUSR | S_IWUSR;
@@ -70,7 +70,7 @@
set to EINTR if operation was interrupted by a signal handler */
/* Reserve semaphore - decrement it by 1 */
-int pcsem::dec(int semId)
+int SemUtil::dec(int semId)
{
struct sembuf sops;
@@ -85,7 +85,7 @@
return 0;
}
-int pcsem::dec_nowait(int semId)
+int SemUtil::dec_nowait(int semId)
{
struct sembuf sops;
@@ -100,7 +100,7 @@
return 0;
}
-int pcsem::dec_timeout(int semId, struct timespec * timeout)
+int SemUtil::dec_timeout(int semId, struct timespec * timeout)
{
struct sembuf sops;
@@ -118,7 +118,7 @@
/* Release semaphore - increment it by 1 */
-int pcsem::inc(int semId)
+int SemUtil::inc(int semId)
{
struct sembuf sops;
@@ -129,7 +129,7 @@
return semop(semId, &sops, 1);
}
-void pcsem::remove(int semid) {
+void SemUtil::remove(int semid) {
union semun dummy;
if (semctl(semid, 0, IPC_RMID, dummy) == -1)
err_exit(errno, "semctl");
diff --git a/squeue/pcsem.h b/squeue/sem_util.h
similarity index 80%
rename from squeue/pcsem.h
rename to squeue/sem_util.h
index 6b994b5..c4af638 100644
--- a/squeue/pcsem.h
+++ b/squeue/sem_util.h
@@ -4,9 +4,9 @@
#include "usg_common.h"
#include "usg_typedef.h"
-namespace pcsem {
+namespace SemUtil {
- int init(key_t key, unsigned int value);
+ int get(key_t key, unsigned int value);
int dec(int semId);
int dec_nowait(int semId);
int dec_timeout(int semId, struct timespec * timeout);
diff --git a/test/test.h b/test/test.h
index 76aa358..c80ad70 100644
--- a/test/test.h
+++ b/test/test.h
@@ -21,12 +21,14 @@
};
// 閿�姣佸叡浜唴瀛樺拰淇″彿
-void destroy() {
+void destroy(int key) {
- LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (1, 16);
- //queue->~LockFreeQueue();
- delete queue;
- mm_deinit();
+ // LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (1, 16);
+ // //queue->~LockFreeQueue();
+ // delete queue;
+
+ QueueFactory::dropQueue<struct Item>(key);
+ mm_destroy();
}
diff --git a/test/test_queue b/test/test_queue
index bcd2dd9..51f9055 100755
--- a/test/test_queue
+++ b/test/test_queue
Binary files differ
diff --git a/test/test_queue.c b/test/test_queue.c
index 6046902..db760fd 100644
--- a/test/test_queue.c
+++ b/test/test_queue.c
@@ -4,12 +4,12 @@
int main () {
unsigned int i = 0;
-
+ int key = 2;
struct Item item;
- size_t qsize = 1;
- LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (2, qsize);
+ size_t qsize = 16;
+ LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (key, qsize);
// LockFreeQueue<struct Item> queue(16);
for(i = 0; i < qsize; i++) {
@@ -33,14 +33,12 @@
i = 0;
while((queue->pop(item)) ) {
- cout << i << " 鍑洪槦锛�" << item.pic << ", " << item.info << endl;
+ cout << i << " pop锛�" << item.pic << ", " << item.info << endl;
// cout << item.pic << endl;
-
i++;
-
}
- destroy();
+ destroy(key);
}
\ No newline at end of file
--
Gitblit v1.8.0