mirror of https://github.com/sipwise/sems.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.2 KiB
61 lines
1.2 KiB
#ifndef _fifo_buffer_h_
|
|
#define _fifo_buffer_h_
|
|
|
|
#include "sys/uio.h"
|
|
#include "AmThread.h"
|
|
|
|
class fifo_buffer
|
|
{
|
|
unsigned char* data;
|
|
unsigned char* data_end;
|
|
|
|
// write at _p_head
|
|
unsigned char* p_head;
|
|
|
|
// read from p_tail
|
|
unsigned char* p_tail;
|
|
|
|
unsigned int size;
|
|
unsigned int free_space;
|
|
|
|
public:
|
|
fifo_buffer(unsigned int size);
|
|
~fifo_buffer();
|
|
|
|
// returns space occupied in buffer
|
|
unsigned int get_buffered_bytes() {
|
|
return size - free_space;
|
|
}
|
|
|
|
// returns space left in buffer
|
|
unsigned int get_free_space() {
|
|
return free_space;
|
|
}
|
|
|
|
// write at the head of the buffer
|
|
int write(const void* buf, unsigned int len);
|
|
int writev(const struct iovec *iov, int iovcnt);
|
|
|
|
// returns size of linearly readable data
|
|
unsigned int get_read_bs() {
|
|
return (p_tail <= p_head) ?
|
|
(unsigned int)(p_head - p_tail) :
|
|
(unsigned int)(data_end - p_tail);
|
|
}
|
|
|
|
// returns the buffer's tail
|
|
void* get_read_ptr() {
|
|
return p_tail;
|
|
}
|
|
|
|
// moves the tail's pointer by the length passed
|
|
void skip(unsigned int len) {
|
|
p_tail += len;
|
|
if(p_tail >= data_end)
|
|
p_tail = p_tail - data_end + data;
|
|
free_space += len;
|
|
}
|
|
};
|
|
|
|
#endif
|