加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

dpdk多进程ring用法示例

(2019-05-21 15:03:50)
分类: DPDK
多进程通信还是很不错的

服务端(取ring数据)

static const char *_MSG_POOL = "MSG_POOL";
static const char *RING_NAME = "t_ring";

struct rte_ring *t_ring;
struct rte_mempool *message_pool;
volatile int quit = 0;
const char *tmp="abc!";

int
main(int argc, char **argv)
{
    const unsigned flags = 0;
    const unsigned ring_size = 64;
    const unsigned pool_size = 1024;
    const unsigned pool_cache = 32;
    const unsigned priv_data_sz = 0;

    int ret;

    ret = rte_eal_init(argc, argv);
    if (ret < 0)
        rte_exit(EXIT_FAILURE, "Cannot init EAL\n");

    if (rte_eal_process_type() == RTE_PROC_PRIMARY){
     //flags为0:多生产者多消费者
     //flags为RING_F_SP_ENQ:单生产者
     //flags为RING_F_SC_DEQ:单消费者
        t_ring = rte_ring_create(RING_NAME, ring_size, rte_socket_id(), flags);
        //pool_size为mempool元素个数
        //sizeof(tmp)为元素大小
        message_pool = rte_mempool_create(_MSG_POOL, pool_size,
                         sizeof(tmp), pool_cache, priv_data_sz,
                NULL, NULL, NULL, NULL,
                rte_socket_id(), flags);
    } else {
     rte_exit(EXIT_FAILURE, "No primary\n");
    }
    if (t_ring == NULL)
        rte_exit(EXIT_FAILURE, "Problem getting ring\n");
    if (message_pool == NULL)
        rte_exit(EXIT_FAILURE, "Problem getting message pool\n");

    RTE_LOG(INFO, APP, "Finished Process Init.\n");

    for (;;) {
     void *msg;
     if (rte_ring_dequeue(t_ring, &msg) < 0){
     continue;
     }
     printf("core %u: ring %d=%d,Received '%s'\n", rte_lcore_id(), rte_ring_count(t_ring),rte_ring_get_capacity(t_ring),(char *)msg);
     rte_mempool_put(message_pool, msg);
     sleep(1);
    }

    rte_eal_mp_wait_lcore();
    return 0;
}


客户端(发ring数据)
static const char *_MSG_POOL = "MSG_POOL";
static const char *RING_NAME = "t_ring";

struct rte_ring *t_ring;
struct rte_mempool *message_pool;
const char *tmp="abc!";

int
main(int argc, char **argv)
{
  int ret;

  ret = rte_eal_init(argc, argv);
  if (ret < 0)
    rte_exit(EXIT_FAILURE, "Cannot init EAL\n");

  if (rte_eal_process_type() == RTE_PROC_SECONDARY){
   t_ring = rte_ring_lookup(RING_NAME);
   message_pool = rte_mempool_lookup(_MSG_POOL);
  } else {
   rte_exit(EXIT_FAILURE, "No secondary\n");
  }
  if (t_ring == NULL)
    rte_exit(EXIT_FAILURE, "Problem getting ring\n");
  if (message_pool == NULL)
    rte_exit(EXIT_FAILURE, "Problem getting message pool\n");

  RTE_LOG(INFO, APP, "Finished Process Init.\n");

  for (;;) {

   if(rte_ring_full(t_ring)){
   sleep(3);
   continue;
   }

   void *msg = NULL;
   if (rte_mempool_get(message_pool, &msg) < 0){
   RTE_LOG(INFO, APP, "get mempool err\n");
   continue;
   }
  
   snprintf((char *)msg, sizeof(tmp), "%s", tmp);
   if (rte_ring_enqueue(t_ring, msg) < 0) {
   rte_mempool_put(message_pool, msg);
   }
  }

  return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有