wangzhengquan
2020-07-09 5854093bd0622c03576e7a29205d68bbdc264f62
void queue wrapper
1个文件已删除
1个文件已添加
6个文件已修改
322 ■■■■ 已修改文件
README.md 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
queue/include/queue_factory.h 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
queue/include/shm_queue_wrapper.h 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
queue/libshm_queue.a 补丁 | 查看 | 原始文档 | blame | 历史
queue/shm_queue_wrapper.c 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/Makefile 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
test2/test_queue_wrapper 补丁 | 查看 | 原始文档 | blame | 历史
test2/test_queue_wrapper.c 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md
@@ -49,6 +49,7 @@
    return 0;
}
```
## 接口说明
```
@@ -110,7 +111,7 @@
inline int shmqueue_push_nowait(shmqueue_t *shmqueue, void *src_ele) 
/**
 * 入队, 指定时间内入对不成功就返回
 * 入队, 指定时间内入队不成功就返回
 */
inline int shmqueue_push_timeout(shmqueue_t *shmqueue, void *src_ele, struct timespec * timeout) 
/**
@@ -123,7 +124,7 @@
 */
inline int shmqueue_pop_nowait(shmqueue_t *shmqueue, void *dest_ele) 
/**
 * 出队, 指定时间内出对不成功就返回
 * 出队, 指定时间内出队不成功就返回
 */
inline int shmqueue_pop_timeout(shmqueue_t *shmqueue, void *dest_ele, struct timespec * timeout)
queue/include/queue_factory.h
File was deleted
queue/include/shm_queue_wrapper.h
@@ -10,16 +10,7 @@
extern "C" {
#endif
#define MAX_ELE_SIZE 512
typedef struct ele_t {
    char buf[MAX_ELE_SIZE];
} ele_t;
typedef struct shmqueue_t {
    size_t ele_size;
    void *mqueue;
} shmqueue_t;
/**
 * 初始化
@@ -28,114 +19,54 @@
 * @ queue_size 队列大小
 * @ ele_size 队列中元素大小
 */
inline void shmqueue_init(shmqueue_t *shmqueue, int key, int queue_size, int ele_size) {
    if(ele_size > MAX_ELE_SIZE) {
        err_exit(0, "shmqueue_init 元素大小超过设计的最大大小");
    }
    SHMQueue<ele_t> *queue = new SHMQueue<ele_t>(key, queue_size);
    shmqueue->mqueue = (void *)queue;
    shmqueue->ele_size = ele_size;
}
void* shmqueue_init(int key, int queue_size, int ele_size);
/**
 * 销毁
*/
inline void shmqueue_destroy(shmqueue_t *shmqueue) {
    delete (SHMQueue<ele_t> *)shmqueue->mqueue;
}
void shmqueue_destroy(void *shmqueue);
/**
 * 队列元素的个数
 */
inline uint32_t shmqueue_size(shmqueue_t *shmqueue) {
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->size();
}
uint32_t shmqueue_size(void *shmqueue);
/**
 * 是否已满
 */
inline int shmqueue_full(shmqueue_t *shmqueue) {
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->full();
}
int shmqueue_full(void *shmqueue);
/**
 * 是否为空
 */
inline int shmqueue_empty(shmqueue_t *shmqueue) {
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->empty();
}
int shmqueue_empty(void *shmqueue);
/**
 * 入队, 队列满时等待
 */
inline int shmqueue_push(shmqueue_t *shmqueue, void *src_ele) {
    ele_t dest_ele;
    memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push(dest_ele);
}
int shmqueue_push(void *shmqueue, void *src_ele);
/**
 * 入队, 队列满时立即返回
 */
inline int shmqueue_push_nowait(shmqueue_t *shmqueue, void *src_ele) {
    ele_t dest_ele;
    memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_nowait(dest_ele);
}
int shmqueue_push_nowait(void *shmqueue, void *src_ele);
/**
 * 入队, 指定时间内入对不成功就返回
 * 入队, 指定时间内入队不成功就返回
 */
inline int shmqueue_push_timeout(shmqueue_t *shmqueue, void *src_ele, struct timespec * timeout) {
    ele_t dest_ele;
    memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest_ele, timeout);
}
int shmqueue_push_timeout(void *shmqueue, void *src_ele, struct timespec * timeout);
/**
 * 出队, 队列空时等待
 */
inline int shmqueue_pop(shmqueue_t *shmqueue, void *dest_ele) {
    ele_t src_ele;
    bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src_ele);
    if (rv) {
        memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
        return 1;
    } else {
        return 0;
    }
}
int shmqueue_pop(void *shmqueue, void *dest_ele);
/**
 * 出队, 队列空时立即返回
 */
inline int shmqueue_pop_nowait(shmqueue_t *shmqueue, void *dest_ele) {
    ele_t src_ele;
    bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src_ele);
    if (rv) {
        memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
        return 1;
    } else {
        return 0;
    }
}
int shmqueue_pop_nowait(void *shmqueue, void *dest_ele);
/**
 * 出队, 指定时间内出对不成功就返回
 * 出队, 指定时间内出队不成功就返回
 */
inline int shmqueue_pop_timeout(shmqueue_t *shmqueue, void *dest_ele, struct timespec * timeout) {
    ele_t src_ele;
    bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src_ele, timeout);
    if (rv) {
        memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
        return 1;
    } else {
        return 0;
    }
}
int shmqueue_pop_timeout(void *shmqueue, void *dest_ele, struct timespec * timeout);
queue/libshm_queue.a
Binary files differ
queue/shm_queue_wrapper.c
New file
@@ -0,0 +1,138 @@
#include "shm_queue_wrapper.h"
#define MAX_ELE_SIZE 512
typedef struct ele_t {
    char buf[MAX_ELE_SIZE];
} ele_t;
typedef struct shmqueue_t {
    size_t ele_size;
    void *mqueue;
} shmqueue_t;
/**
 * 初始化
 * @ shmqueue
 * @ key 标识共享队列的唯一key
 * @ queue_size 队列大小
 * @ ele_size 队列中元素大小
 */
void* shmqueue_init( int key, int queue_size, int ele_size) {
    if(ele_size > MAX_ELE_SIZE) {
        err_exit(0, "shmqueue_init : the element size is supper than max element buffer size");
    }
    shmqueue_t *shmqueue = (shmqueue_t*)malloc(sizeof(shmqueue_t));
    SHMQueue<ele_t> *queue = new SHMQueue<ele_t>(key, queue_size);
    shmqueue->mqueue = (void *)queue;
    shmqueue->ele_size = ele_size;
    return (void *)shmqueue;
}
/**
 * 销毁
*/
void shmqueue_destroy(void * _shmqueue) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    delete (SHMQueue<ele_t> *)shmqueue->mqueue;
    delete _shmqueue;
}
/**
 * 队列元素的个数
 */
uint32_t shmqueue_size(void * _shmqueue) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->size();
}
/**
 * 是否已满
 */
int shmqueue_full(void * _shmqueue) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->full();
}
/**
 * 是否为空
 */
int shmqueue_empty(void * _shmqueue) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->empty();
}
/**
 * 入队, 队列满时等待
 */
int shmqueue_push(void * _shmqueue, void *src_ele) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    ele_t dest_ele;
    memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push(dest_ele);
}
/**
 * 入队, 队列满时立即返回
 */
int shmqueue_push_nowait(void * _shmqueue, void *src_ele) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    ele_t dest_ele;
    memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_nowait(dest_ele);
}
/**
 * 入队, 指定时间内入队不成功就返回
 */
int shmqueue_push_timeout(void * _shmqueue, void *src_ele, struct timespec * timeout) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    ele_t dest_ele;
    memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
    return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest_ele, timeout);
}
/**
 * 出队, 队列空时等待
 */
int shmqueue_pop(void * _shmqueue, void *dest_ele) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    ele_t src_ele;
    bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src_ele);
    if (rv) {
        memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
        return 1;
    } else {
        return 0;
    }
}
/**
 * 出队, 队列空时立即返回
 */
int shmqueue_pop_nowait(void * _shmqueue, void *dest_ele) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    ele_t src_ele;
    bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src_ele);
    if (rv) {
        memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
        return 1;
    } else {
        return 0;
    }
}
/**
 * 出队, 指定时间内出队不成功就返回
 */
int shmqueue_pop_timeout(void * _shmqueue, void *dest_ele, struct timespec * timeout) {
    shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
    ele_t src_ele;
    bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src_ele, timeout);
    if (rv) {
        memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
        return 1;
    } else {
        return 0;
    }
}
test/Makefile
@@ -14,7 +14,7 @@
include $(ROOT)/Make.defines.$(PLATFORM)
 
PROGS =    test_queue single_productor single_consumer multiple_queue_productor multiple_queue_consumer test_timeout test_queue_wrapper
PROGS =    test_queue single_productor single_consumer multiple_queue_productor multiple_queue_consumer test_timeout
build: $(PROGS)
test2/test_queue_wrapper
Binary files differ
test2/test_queue_wrapper.c
@@ -13,14 +13,13 @@
    int key = 2;
 
    size_t qsize = 16;
      shmqueue_t queue;
    shmqueue_init(&queue, key, qsize, sizeof(message_t));
    void * queue = shmqueue_init( key, qsize, sizeof(message_t));
    message_t item;
    // LockFreeQueue<struct Item> queue(16);
    for(i = 0; i < qsize; i++) {
        sprintf(item.method, "hello"); 
        item.code = i ; 
        if(shmqueue_push(&queue, (void *)&item)) {
        if(shmqueue_push(queue, (void *)&item)) {
              printf("push:%d %s\n", item.code, item.method );
        }
    }
@@ -28,14 +27,14 @@
    struct timespec timeout = {1, 0};
    i = 0;
    while((shmqueue_pop_timeout(&queue, (void *)&item, &timeout)) ) {
    while((shmqueue_pop_timeout(queue, (void *)&item, &timeout)) ) {
        printf("pop:%d %s\n", item.code, item.method );
       // cout <<  item.pic << endl;
        i++;
    }
    //销毁队列
    shmqueue_destroy(&queue);
    shmqueue_destroy(queue);
}