wangzhengquan
2020-07-14 8b4ddf10e71e1c8fabd33c72b282f7da65ff682f
queue/shm_queue_wrapper.c
@@ -21,6 +21,11 @@
   mem_pool_destroy();
}
//移除不包含在keys中的队列
void shm_remove_queues_exclue(void *keys, int length) {
   SHMQueue<ele_t>::remove_queues_exclue((int*)keys, (size_t)length);
}
/**
 * 创建队列
 * @ shmqueue 
@@ -122,27 +127,33 @@
/**
 * 入队, 指定时间内入队不成功就返回
 * timespec {sec秒, nsec纳秒}
 * @sec秒
 * @nsec纳秒
 */
int shmqueue_push_timeout(void * _shmqueue, void *src, int size,  void * _timeout) {
   struct timespec *timeout = (struct timespec *)_timeout;
int shmqueue_push_timeout(void * _shmqueue, void *src, int size,  int sec, int nsec) {
   struct timespec timeout = {sec, nsec};
   shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
   ele_t dest;
   dest.size = size;
   dest.buf = mm_malloc(size);
   memcpy(dest.buf, src, size);
   return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest, timeout);
   return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest, &timeout);
}
/**
 * 出队, 队列空时等待
 */
int shmqueue_pop(void * _shmqueue, void *dest) {
int shmqueue_pop(void * _shmqueue, void **dest, int *size) {
   shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
   ele_t src;
   bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src);
   if (rv) {
      memcpy(dest, src.buf, src.size);
      void * _dest = malloc(src.size);
      memcpy(_dest, src.buf, src.size);
      *dest = _dest;
      *size = src.size;
      mm_free(src.buf);
      return 1;
   } else {
@@ -154,12 +165,16 @@
/**
 * 出队, 队列空时立即返回
 */
int shmqueue_pop_nowait(void * _shmqueue, void *dest) {
int shmqueue_pop_nowait(void * _shmqueue, void **dest, int *size) {
   shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
   ele_t src;
   bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src);
   if (rv) {
      void * _dest = malloc(src.size);
      memcpy(dest, src.buf, src.size);
      *dest = _dest;
      *size = src.size;
      mm_free(src.buf);
      return 1;
   } else {
@@ -169,14 +184,20 @@
/**
 * 出队, 指定时间内出队不成功就返回
 * @sec秒
 * @nsec纳秒
 */
int shmqueue_pop_timeout(void * _shmqueue, void *dest, void * _timeout) {
   struct timespec *timeout = (struct timespec *)_timeout;
int shmqueue_pop_timeout(void * _shmqueue, void **dest, int *size, int sec, int nsec) {
   struct timespec timeout = {sec, nsec};
   shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
   ele_t src;
   bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src, timeout);
   bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src, &timeout);
   if (rv) {
      memcpy(dest, src.buf, src.size);
      void * _dest = malloc(src.size);
      memcpy(_dest, src.buf, src.size);
      *dest = _dest;
      *size = src.size;
      mm_free(src.buf);
      return 1;
   } else {
@@ -184,4 +205,8 @@
   }
}
void shmqueue_free(void *ptr) {
   free(ptr);
}