From 3710ce88088c00599c5b108456f6dde9a4d981bc Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期三, 08 七月 2020 18:09:58 +0800 Subject: [PATCH] commmit --- test/single_productor.c | 28 +++++--- test/test_queue | 0 squeue/include/shm_queue.h | 6 + test/test.h | 5 + squeue/include/shm_allocator.h | 74 ++++++++++++++++++++++++ test/multiple_queue_productor.c | 4 test/single_consumer | 0 test/test.c | 0 test/single_productor | 0 test/single_consumer.c | 8 +- test/test_queue.c | 53 +++++++++++++++++ 11 files changed, 157 insertions(+), 21 deletions(-) diff --git a/squeue/include/shm_allocator.h b/squeue/include/shm_allocator.h new file mode 100644 index 0000000..f9e838b --- /dev/null +++ b/squeue/include/shm_allocator.h @@ -0,0 +1,74 @@ +#ifndef __SHM_ALLOCATOR_H__ +#define __SHM_ALLOCATOR_H__ +#include "usg_common.h" +#include "mm.h" +#include <new> +#include <cstdlib> // for exit() +#include <climits> // for UNIX_MAX +#include <cstddef> + + + +template<class T> class SHMAllocator +{ +public: + typedef T value_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + + SHMAllocator() {}; + ~SHMAllocator() {}; + template<class U> SHMAllocator(const SHMAllocator<U>& t) { }; + template<class U> struct rebind { typedef SHMAllocator<U> other; }; + + pointer allocate(size_type n, const void* hint=0) { +// fprintf(stderr, "allocate n=%u, hint= %p\n",n, hint); + return((T*) (mm_malloc(n * sizeof(T)))); + } + + void deallocate(pointer p, size_type n) { +// fprintf(stderr, "dealocate n=%u" ,n); + mm_free((void*)p); + } + + void construct(pointer p, const T& value) { + ::new(p) T(value); + } + + void construct(pointer p) + { + ::new(p) T(); + } + + void destroy(pointer p) { + p->~T(); + } + + pointer address(reference x) { + return (pointer)&x; + } + + const_pointer address(const_reference x) { + return (const_pointer)&x; + } + + size_type max_size() const { + return size_type(UINT_MAX/sizeof(T)); + } +}; + + +// template<class charT, class traits = char _traits<charT>, +// class Allocator = allocator<charT> > + + + + +typedef std::basic_string<char, std::char_traits<char>, SHMAllocator<char> > shmstring; + +#endif \ No newline at end of file diff --git a/squeue/include/shm_queue.h b/squeue/include/shm_queue.h index 8177e1a..0bcc3db 100644 --- a/squeue/include/shm_queue.h +++ b/squeue/include/shm_queue.h @@ -1,7 +1,7 @@ #ifndef __SHM_QUEUE_H__ #define __SHM_QUEUE_H__ -#include <usg_common.h> +#include "usg_common.h" #include "mm.h" #include "hashtable.h" #include "lock_free_queue.h" @@ -181,4 +181,6 @@ return queue->operator[](i); } -#endif // _LOCK_FREE_QUEUE_H__ + + +#endif diff --git a/test/multiple_queue_productor.c b/test/multiple_queue_productor.c index f01652e..c3024fb 100644 --- a/test/multiple_queue_productor.c +++ b/test/multiple_queue_productor.c @@ -18,8 +18,8 @@ // cerr << "productor key="<<targ->key << endl; err_msg(0, "productor key = %d\n", targ->key ); - // LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (targ->key, qsize); - SHMQueue<struct Item> *queue = new SHMQueue<struct Item>(targ->key, qsize); + // LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (targ->key, qsize); + SHMQueue<struct Item> *queue = new SHMQueue<struct Item>(targ->key, qsize); /* Transfer blocks of data from stdin to shared memory */ int end = targ->end; struct Item item; diff --git a/test/single_consumer b/test/single_consumer index 9e60a3e..eb83102 100755 --- a/test/single_consumer +++ b/test/single_consumer Binary files differ diff --git a/test/single_consumer.c b/test/single_consumer.c index 29ae0bc..8a39c24 100644 --- a/test/single_consumer.c +++ b/test/single_consumer.c @@ -18,15 +18,15 @@ signal(SIGINT, sigint_handler); // SHMQueue<struct Item, 3> *queue = new SHMQueue<struct Item, 3>(qsize); - SHMQueue<struct Item> *queue = new SHMQueue<struct Item>(key, qsize); + SHMQueue<item_t> *queue = new SHMQueue<item_t>(key, qsize); //LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (key, qsize); /* Transfer blocks of data from shared memory to stdout */ struct timespec timeout = {10, 0}; - struct Item item; - while(!stop && queue->pop(item)) { - cout << "鍑洪槦锛�" << item.pic << ", " << item.info << endl; + item_t item; + while(!stop && queue->pop_timeout(item, &timeout)) { + cout << "鍑洪槦锛�" << item << endl; //cout << item.pic << endl; //sleep(1); } diff --git a/test/single_productor b/test/single_productor index 020041c..7dcfc82 100755 --- a/test/single_productor +++ b/test/single_productor Binary files differ diff --git a/test/single_productor.c b/test/single_productor.c index af6b3b4..71c7d9f 100644 --- a/test/single_productor.c +++ b/test/single_productor.c @@ -15,6 +15,7 @@ signal(SIGINT, sigint_handler); int qsize = 16; + /* Create set containing two semaphores; initialize so that writer has first access to shared memory. */ int start = 0; @@ -24,22 +25,27 @@ start = atoi(argv[1]); end = atoi(argv[2]); } - //LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (key, qsize); - SHMQueue<struct Item> *queue = new SHMQueue<struct Item>(key, qsize); + //LockFreeQueue<item_t> *queue = QueueFactory::createQueue<item_t> (key, qsize); + SHMQueue<item_t> *queue = new SHMQueue<item_t>(key, qsize); /* Transfer blocks of data from stdin to shared memory */ - struct Item item; - struct timespec timeout = {5, 0}; + //item_t item; + char item[1024]; + struct timespec timeout = {10, 0}; int i = start; - item.pic = i; - item.info = i; + // item.pic = i; + // item.info = i; //while((end == -1 || (i < end) ) && (queue->add(item)) ) { - while(!stop && (queue->push(item)) ) { - item.pic = i; - item.info = i; - - cout << "鍏ラ槦锛�" << item.pic << ", " << item.info << endl; + while(!stop ) { + // item.pic = i; + // item.info = i; + //item = i + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + sprintf(item, "(%d)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", i); + if(queue->push_timeout(item, &timeout)) + cout << "鍏ラ槦锛�" << item << endl; + else + break; // cout << item.pic << endl; i++; diff --git a/test/test.c b/test/test.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/test.c diff --git a/test/test.h b/test/test.h index e2309bc..664eb0f 100644 --- a/test/test.h +++ b/test/test.h @@ -1,6 +1,8 @@ #include "usg_common.h" #include "usg_typedef.h" #include "shm_queue.h" +#include "shm_allocator.h" +#include <sstream> //#include "queue_factory.h" #include <pthread.h> @@ -12,6 +14,9 @@ }; + +typedef shmstring item_t; + struct Targ { int key; int start; diff --git a/test/test_queue b/test/test_queue index c321a31..ca75da2 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 fbc6e45..cb6ade7 100644 --- a/test/test_queue.c +++ b/test/test_queue.c @@ -1,7 +1,8 @@ #include "test.h" + using namespace std; -int main () { +void testStruct() { unsigned int i = 0; int key = 2; @@ -39,6 +40,54 @@ } delete queue; - mm_destroy(); +} +void testString() { + unsigned int i = 0; + std::ostringstream outstr; + int key = 2; + + shmstring item; + + size_t qsize = 16; + //LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (key, qsize); + SHMQueue<shmstring> *queue = new SHMQueue<shmstring>(key, 16); + // LockFreeQueue<struct Item> queue(16); + for(i = 0; i < qsize; i++) { + outstr.seekp(0); + outstr << "hello " << i ; + if(queue->push(outstr.str().c_str())) { + cout << i << " push锛�" << outstr.str() << endl; + } + } + + // for(i = 0; i < qsize; i++) { + + // //queue.dequeue(item); + + // item = (*queue)[i]; + // cout << "i=" << i << ":" << item << endl; + // } + + + + struct timespec timeout = {1, 0}; + + i = 0; + while((queue->pop_timeout(item, &timeout)) ) { + cout << i << " pop锛�" << item << endl; + // cout << item.pic << endl; + i++; + } + + delete queue; +} + + +int main () { + testString(); + + + mm_destroy(); + return 0; } \ No newline at end of file -- Gitblit v1.8.0