Esempio n. 1
0
/******************************************************************************
 **函数名称: 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;
}
Esempio n. 2
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;
}