chan_ringbuffer.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #ifndef __CHAN_RINGBUFFER_H__
  2. #define __CHAN_RINGBUFFER_H__
  3. #include <pthread.h>
  4. /** * The size of a ring buffer.
  5. * Due to the design only <tt> RING_BUFFER_SIZE-1 </tt> items
  6. * can be contained in the buffer.
  7. * The buffer size must be a power of two.
  8. */
  9. #define CHAN_RING_BUFFER_SIZE 0x80
  10. #if (CHAN_RING_BUFFER_SIZE & (CHAN_RING_BUFFER_SIZE - 1)) != 0
  11. #error "RING_BUFFER_SIZE must be a power of two"
  12. #endif
  13. /**
  14. * Used as a modulo operator
  15. * as <tt> a % b = (a & (b ? 1)) </tt>
  16. * where \c a is a positive index in the buffer and
  17. * \c b is the (power of two) size of the buffer.
  18. */
  19. #define CHAN_RING_BUFFER_MASK (CHAN_RING_BUFFER_SIZE-1)
  20. /** * The type which is used to hold the size
  21. * and the indicies of the buffer.
  22. * Must be able to fit \c RING_BUFFER_SIZE .
  23. */
  24. //typedef uint8_t ring_buffer_size_t;
  25. typedef int chan_ring_buffer_size_t;
  26. typedef struct tag_chan_ring_buffer_element{
  27. char c;
  28. }chan_ring_buffer_element_t;
  29. /**
  30. * Simplifies the use of <tt>struct ring_buffer_t</tt>.
  31. */
  32. typedef struct chan_ring_buffer_t chan_ring_buffer_t;
  33. /**
  34. * Structure which holds a ring buffer.
  35. * The buffer contains a buffer array
  36. * as well as metadata for the ring buffer.
  37. */
  38. struct chan_ring_buffer_t {
  39. /** Buffer memory. */
  40. chan_ring_buffer_element_t buffer[CHAN_RING_BUFFER_SIZE];
  41. /** Index of tail. */
  42. chan_ring_buffer_size_t tail_index;
  43. /** Index of head. */
  44. chan_ring_buffer_size_t head_index;
  45. };
  46. void chan_ring_buffer_init(chan_ring_buffer_t *buffer);
  47. void chan_ring_buffer_queue(chan_ring_buffer_t *buffer, chan_ring_buffer_element_t data);
  48. void chan_ring_buffer_queue_arr(chan_ring_buffer_t *buffer, const chan_ring_buffer_element_t*data, chan_ring_buffer_size_t size);
  49. chan_ring_buffer_size_t chan_ring_buffer_dequeue(chan_ring_buffer_t *buffer, chan_ring_buffer_element_t* data);
  50. chan_ring_buffer_size_t chan_ring_buffer_dequeue_arr(chan_ring_buffer_t *buffer, chan_ring_buffer_element_t* data, chan_ring_buffer_size_t len);
  51. chan_ring_buffer_size_t chan_ring_buffer_peek(chan_ring_buffer_t *buffer, chan_ring_buffer_element_t* data, chan_ring_buffer_size_t index);
  52. chan_ring_buffer_size_t chan_ring_buffer_num_items(chan_ring_buffer_t *buffer);
  53. chan_ring_buffer_size_t chan_ring_buffer_is_empty(chan_ring_buffer_t *buffer);
  54. chan_ring_buffer_size_t chan_ring_buffer_is_full(chan_ring_buffer_t *buffer);
  55. #endif