Ring buffer

摘要:
#如果ndef_RING_ BUFFER_ H__#定义__RING_缓冲器_ H__//------------------------------------------------------------------------------//外部函数//---------------------------------------------------
#ifndef __RING_BUFFER_H__
#define __RING_BUFFER_H__

//------------------------------------------------------------------------------
//         External functions
//------------------------------------------------------------------------------
void BSP_Lock( void );
void BSP_Unlock( void );

typedef struct
{
  unsigned char * buffer;
  unsigned int capacity;
  unsigned int pointer;
  unsigned int count;
} ring_buffer_t;

ring_buffer_t *ring_buffer_create( unsigned int size );

void ring_buffer_delete( ring_buffer_t *ring_buffer );

void ring_buffer_init( ring_buffer_t *ring_buffer, unsigned char * buffer,
  unsigned int capacity );

void ring_buffer_clear( ring_buffer_t *ring_buffer );

unsigned int ring_buffer_readable( ring_buffer_t *ring_buffer );

unsigned int ring_buffer_writable( ring_buffer_t *ring_buffer );

void ring_buffer_flush( ring_buffer_t *ring_buffer, unsigned int bytes );

unsigned int ring_buffer_read( ring_buffer_t *ring_buffer, unsigned char *data,
  unsigned int length );

unsigned int ring_buffer_write( ring_buffer_t *ring_buffer,
  const unsigned char *data, unsigned int length );

unsigned int ring_buffer_full( ring_buffer_t *ring_buffer );

unsigned int ring_buffer_empty( ring_buffer_t *ring_buffer );

#endif /* __RING_BUFFER_H__ */
#include "ring_buffer.h"

#include <stdlib.h>
#include <string.h>

unsigned int ring_buffer_readable( ring_buffer_t *ring_buffer )
{
  return ring_buffer->count;
}

unsigned int ring_buffer_writable( ring_buffer_t *ring_buffer )
{
  return ring_buffer->capacity - ring_buffer->count;
}

unsigned int ring_buffer_full( ring_buffer_t *ring_buffer )
{
  return ring_buffer->count == ring_buffer->capacity;
}

unsigned int ring_buffer_empty( ring_buffer_t *ring_buffer )
{
  return ring_buffer->count == 0;
}

unsigned int ring_buffer_read( ring_buffer_t *ring_buffer, unsigned char *data,
  unsigned int length )
{
  unsigned int buffer_readable = ring_buffer_readable( ring_buffer );
  unsigned int bytes_read = length;

  if ( bytes_read > buffer_readable )
    bytes_read = buffer_readable;
  if ( bytes_read == 0 )
    return 0;

  // -----------RRRRRRRRRRRR
  if ( ring_buffer->pointer + bytes_read <= ring_buffer->capacity )
    memcpy( data, ring_buffer->buffer + ring_buffer->pointer, bytes_read );
  else // RRRRRR--------------RRRRR
  {
    unsigned int upper = ring_buffer->capacity - ring_buffer->pointer;
    unsigned int lower = bytes_read - upper;
    memcpy( data, ring_buffer->buffer + ring_buffer->pointer, upper );
    memcpy( data + upper, ring_buffer->buffer, lower );
  }

  BSP_Lock( );

  ring_buffer->pointer = ( ring_buffer->pointer + bytes_read )
    % ring_buffer->capacity;

  ring_buffer->count -= bytes_read;

  BSP_Unlock( );

  return bytes_read;
}

unsigned int ring_buffer_write( ring_buffer_t *ring_buffer,
  const unsigned char *data, unsigned int length )
{
  unsigned int bytes_written = length;
  unsigned int buffer_writable = ring_buffer_writable( ring_buffer );
  if ( bytes_written > buffer_writable )
    bytes_written = buffer_writable;
  if ( bytes_written == 0 )
    return 0;

  unsigned int write_position = ( ring_buffer->pointer + ring_buffer->count )
    % ring_buffer->capacity;

  // --------WWWWWWWW---
  if ( write_position + bytes_written <= ring_buffer->capacity )
    memcpy( ring_buffer->buffer + write_position, data, bytes_written );
  else  // WWWWWWW-------WWWW
  {
    unsigned int upper = ring_buffer->capacity - write_position;
    unsigned int lower = bytes_written - upper;
    memcpy( ring_buffer->buffer + write_position, data, upper );
    memcpy( ring_buffer->buffer, data + upper, lower );
  }

  BSP_Lock( );

  ring_buffer->count += bytes_written;

  BSP_Unlock( );

  return bytes_written;
}

void ring_buffer_flush( ring_buffer_t *ring_buffer, unsigned int length )
{
  // we can't flush more bytes than there are
  BSP_Lock( );

  if ( length > (unsigned int) ring_buffer->count )
    length = ring_buffer->count;

  ring_buffer->count -= length;
  ring_buffer->pointer = ( ring_buffer->pointer + length );
  ring_buffer->pointer %= ring_buffer->capacity;

  BSP_Unlock( );
}

void ring_buffer_clear( ring_buffer_t *ring_buffer )
{
  BSP_Lock( );

  ring_buffer->count = 0;
  ring_buffer->pointer = 0;

  BSP_Unlock( );
}

void ring_buffer_init( ring_buffer_t *ring_buffer, unsigned char * buffer,
  unsigned int capacity )
{
  ring_buffer->buffer = buffer;
  ring_buffer->capacity = capacity;
  ring_buffer_clear( ring_buffer );
}

ring_buffer_t * ring_buffer_create( unsigned int size )
{
  void * p = malloc( sizeof(ring_buffer_t) + size );
  ring_buffer_t *ring_buffer = (ring_buffer_t *) p;
  if ( ring_buffer == NULL )
    return NULL;

  ring_buffer->capacity = size;
  ring_buffer_clear( ring_buffer );

  return ring_buffer;
}

void ring_buffer_delete( ring_buffer_t *ring_buffer )
{
  free( ring_buffer );
}

免责声明:文章转载自《Ring buffer》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇操作系统-进程(5)进程通信机制Cesium球心坐标与本地坐标系经纬转换的数学原理—矩阵变换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Java 读取ANSI文件中文乱码问题解决方式[转]

Filefile=newFile(路径);InputStreamin=newjava.io.FileInputStream(文件);BufferedReader读取器=新的BufferedReader(读取);FileInputStreamin=newFileInputStream(文件);byte[]b=新字节[3];内容如下(b);...

vue+jspdf+html2canvas导出PDF文件

没有废话。首先,查看最终打印结果。我说最后打印的pdf文件看起来像这样。pdf文件的分页是通过设置jspdf实现的,但我暂时无法对文件内容进行分页。因为我们首先将需要打印的元素转换为画布,然后将画布转换为图像,然后将图像转换为pdf文件。...

如何在Android模拟器上安装apk文件

如本实例的“mishop_2.0.20130911_1.1.1.apk”3.执行控制台命令,进行安装。切换到D盘,输入D:,然后点击Enter,即切换到D盘,输入cd,找到platform-tools的文件地址,即adb.exe的文件路径。,粘贴在控制台中。...

linux系统redhat7.9安装R

1.查看系统信息[root@localhosthome]#cat/etc/redhat-releaseRedHatEnterpriseLinuxServerrelease7.9(Maipo)[root@localhosthome]#lsb_release aLSB版本::core-4.1-amd64:core-4.1-noarch:ccxx-4.1-amd6...

CentOS7上使用history删除部分历史记录

使用history命令删除登录后创建的历史记录,但保留原始记录。如果未执行history命令,则直接使用history-r命令将文件中的历史刷新到此处的缓存中,并且不会保存以前操作的记录。修改后,执行:history-c以清除当前会话历史中的历史缓存-r以读取~/。bash_您可以看到历史文件中的历史记录已在缓存中更新。...

Nginx 对客户端请求的限制

本文记录了Nginx静态web服务器对客户端请求的限制的配置项。附加了禁止GET方法和HEAD方法的配置。limit_ exceptGET{allow192.168.1.0/32;denyall;}2) 最大HTTP请求包语法:client_max_body_sizesize;默认值:client_max_body_size1m;配置块:当http、服务器和...