C语言 队列缓冲区

此方式使用到了单向链表,写的时候实时分配空间,读了之后释放空间,代码还有不足之处,比如说未加锁机制。

.C文件

/**********************************************************************
 * Copyright (c), 2012~2016 All Rights Reserved
 * @file        
 * @brief 
 * @author      
 * @date        2016/05/23
 * @version     1.0.0
 * @par Revision History:
 *  Date            Author               Notes
 *  2015/5/23       wangzhenghui         file created           
 ********************************************************************/
#include "ring_buffer.h"
#include "string.h"

/********************************************************************
**  Function Name : ring_buffer_init
**  Description   : NONE
**  Input para    : NONE
**  Output para   : NONE
**  Return Value  : NONE
**  Version       : V0.1
**  Author        : wangzhenghui
*******************************************************************/
void buffer_queue_init(struct buffer_queue_t *queue,unsigned short max_size)
{
  queue->max_size = max_size;
  queue->p_head = NULL;
  queue->p_last = NULL;
}
/********************************************************************
**  Function Name : buffer_queue_write
**  Description   : 填充队列
**  Input para    : 
**  Output para   : NONE
**  Return Value  : NONE
**  Version       : V0.1
**  Author        : wangzhenghui
*******************************************************************/
unsigned short buffer_queue_write(struct buffer_queue_t *queue,unsigned char *psrc,unsigned short wr_len)
{
    struct buffer_packet_t *packet = (struct buffer_packet_t *)malloc(sizeof(struct buffer_packet_t));


    if(queue->p_last == NULL)
    {
        queue->p_head = packet;
    }
    else
    {
        queue->p_last->next = packet;
    }
    queue->p_last = packet;

   if(queue->size >= queue->max_size)
   {
       return 0;
   }
   packet->buffer_ptr = (unsigned char *)malloc(sizeof(unsigned char)*wr_len);

   memcpy(packet->buffer_ptr,psrc,wr_len);
   packet->buffer_size = wr_len;
   packet->next = NULL;
   queue->size += packet->buffer_size;

   return wr_len;
}
/********************************************************************
**  Function Name : buffer_queue_read
**  Description   : 从队列中读出数据
**  Input para    : 
**  Output para   : NONE
**  Return Value  : NONE
**  Version       : V0.1
**  Author        : wangzhenghui
*******************************************************************/
unsigned short buffer_queue_read(struct buffer_queue_t *queue,unsigned char *pdest,unsigned short *rd_len)
{
    struct buffer_packet_t *packet;

    packet = queue->p_head;
    if(packet)
    {
        queue->p_head = queue->p_head->next;
        if(queue->p_head == NULL)
        {
            queue->p_last = NULL;
        }
        memcpy(pdest,packet->buffer_ptr,packet->buffer_size);
        queue->size -= packet->buffer_size;
        *rd_len = packet->buffer_size;
        free(packet->buffer_ptr);
        free(packet);
    }
    else
    {
        *rd_len = 0;
    }

   return *rd_len;
}
.h文件

/**********************************************************************
 * Copyright (c), 2012~2016 xxx All Rights Reserved
 * @file        
 * @brief 
 * @author      
 * @date        2016/05/23
 * @version     1.0.0
 * @par Revision History:
 *  Date            Author               Notes
 *  2015/5/23       wangzhenghui         file created           
 ********************************************************************/
#ifndef _BUFFER_QUEUE_H_
#define _BUFFER_QUEUE_H_
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

struct buffer_packet_t
{
    unsigned char           *buffer_ptr;
    unsigned short           buffer_size;
    struct buffer_packet_t  *next;
};

struct buffer_queue_t
{
    struct buffer_packet_t   *p_head,*p_last;
    unsigned short   max_size;
    unsigned short   size;
};
/********************************************************************
**  Function Name : buffer_queue_init
**  Description   : NONE
**  Input para    : NONE
**  Output para   : NONE
**  Return Value  : NONE
**  Version       : V0.1
**  Author        : wangzhenghui
*******************************************************************/
extern void buffer_queue_init(struct buffer_queue_t *p_queue,unsigned short size);
/********************************************************************
**  Function Name : buffer_queue_write
**  Description   : NONE
**  Input para    : NONE
**  Output para   : NONE
**  Return Value  : NONE
**  Version       : V0.1
**  Author        : wangzhenghui
*******************************************************************/
extern unsigned short buffer_queue_write(struct buffer_queue_t *p_queue,unsigned char *p_dest,unsigned short rd_len);

/********************************************************************
**  Function Name : buffer_queue_read
**  Description   : NONE
**  Input para    : NONE
**  Output para   : NONE
**  Return Value  : NONE
**  Version       : V0.1
**  Author        : wangzhenghui
*******************************************************************/
extern unsigned short buffer_queue_read(struct buffer_queue_t *rb,unsigned char *pdest,unsigned short *rd_len);

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif //_BUFFER_QUEUE_H_


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值