/****************************************************************************** **函数名称: ring_mpush **功 能: 同时插入多个数据 **输入参数: ** rq: 环形队列 ** addr: 数据地址数组 ** num: 数组长度 **输出参数: **返 回: 0:成功 !0:失败 **实现描述: **注意事项: addr指向的地址必须为堆地址 **作 者: # Qifeng.zou # 2015.05.05 # ******************************************************************************/ int ring_mpush(ring_t *rq, void **addr, unsigned int num) { int succ; unsigned int prod_head, prod_next, cons_tail, i; /* > 申请队列空间 */ do { prod_head = rq->prod.head; cons_tail = rq->cons.tail; if (num > (rq->max + cons_tail - prod_head)) { return -1; /* 空间不足 */ } prod_next = prod_head + num; succ = atomic32_cmp_and_set(&rq->prod.head, prod_head, prod_next); } while (0 == succ); /* > 放入队列空间 */ for (i=0; i<num; ++i) { rq->data[(prod_head+i) & rq->mask] = addr[i]; } while (rq->prod.tail != prod_head) { NULL; } rq->prod.tail = prod_next; atomic32_add(&rq->num, num); /* 计数 */ return 0; }
inline int pkt_fifo_put(pkt_fifo_t *fifo, pkt_node_t *node) { uint32_t in = fifo->in; uint32_t size = fifo->size; uint32_t count = atomic32_read(&fifo->count); pkt_buf_t *pkt = fifo->pkt; if (unlikely(count >= size)) { applog(APP_LOG_LEVEL_DEBUG, APP_VPU_LOG_MASK_IO, "pkt_fifo_put count: %u, size: %u, fifo no space for new node\n", count, size); return -1; } memcpy(pkt[in].pkt, node->pkt, node->pkt_len); pkt[in].pkt_len = node->pkt_len; atomic32_add(&fifo->count, 1); in = in + 1; if (unlikely(in >= size)) { in = 0; } fifo->in = in; return 0; }