1 #include "WindowedFifo.h"
6 WindowedFifo::WindowedFifo(unsigned size = 20) {
7 //std::cout << "Create WindowedFifo." << std::endl;
9 _buffer = (char *) _malloc_align(_size, ALIGNMENT_FACTOR);
11 fprintf(stderr,"[WFIFO] Memory allocation failure\n");
23 _isHeadReserved = false;
24 _isTailReserved = false;
31 WindowedFifo::~WindowedFifo() {
44 unsigned WindowedFifo::reserve(void** dest, unsigned len) {
45 char** destination = (char**) dest;
46 //std::cout << "Attempt to reserve " << len << " bytes." << std::endl;
48 //can only reserve one piece at a time
49 if (_isHeadReserved) {
54 //reserve at most as much memory as still available in the buffer
55 unsigned write = (len <= _size - _use ? len : _size - _use);
58 //if wrap-around in buffer: return only buffer for the
59 //contiguous buffer space
60 if (_head + write > _size) {
61 write = _size - _head;
64 _headRoom = (_head + write) == _size ? 0 : _head + write;
65 *destination = &(_buffer[_head]);
66 _isHeadReserved = true;
69 //std::cout << "Reserved " << write << " bytes." << std::endl;
70 _writeReserve = write;
77 void WindowedFifo::release() {
78 if (_isHeadReserved) {
79 //std::cout << "Released " << _headRoom - _head << " bytes." << std::endl;
81 _use += _writeReserve;
82 _isHeadReserved = false;
89 unsigned WindowedFifo::capture(void **dest, unsigned len) {
90 char** destination = (char**) dest;
91 //std::cout << "Attempt to capture " << len << " bytes." << std::endl;
93 if (_isTailReserved) {
94 //std::cout << "Only one attempt to capture allowed." << std::endl;
99 //capture at most as much data as available in the buffer
100 unsigned read = (len <= _use ? len : _use);
103 //if wrap-around in buffer: return only buffer for the
104 //conntiguous buffer space
105 if (_tail + read > _size) {
106 read = _size - _tail;
109 _tailRoom = (_tail + read) == _size ? 0 : _tailRoom = _tail + read;
110 *destination = &(_buffer[_tail]);
111 _isTailReserved = true;
114 //std::cout << "Captured " << read << " bytes." << std::endl;
122 void WindowedFifo::consume() {
123 if (_isTailReserved) {
124 //std::cout << "Consumed " << _tailRoom - _tail << " bytes." << std::endl;
126 _use -= _readReserve;
127 _isTailReserved = false;
134 unsigned WindowedFifo::size() const {
141 unsigned WindowedFifo::unused() const {
148 unsigned WindowedFifo::used() const {
153 * Get the pointer to the start of the queue
155 char *WindowedFifo::getQueuePointer() {
160 * Has completed a dma read process, i.e. has read out of the queue
162 void WindowedFifo::dmaRead(unsigned len) {
166 _blocked = BLOCKED_MAX_NR;
168 _tail = ((unsigned) (_tail + len) % _size);
174 * Start a DMA request, returns the current space one have
176 unsigned WindowedFifo::dmaStart() {
179 // If we go over the end, we only take as much as is on one side!
182 if (_tail + _use > _size) {
183 return _size - _tail;
190 * Is allowed to start a dma request
192 bool WindowedFifo::dmaAllowed() {
193 #ifndef STORE_REQUESTS
206 * Is needed for DMA transfers
208 unsigned WindowedFifo::dmaWrite(const void *source, unsigned len) {
210 char* buffer = (char*) source;
212 if (_head + len < _size) {
213 memcpy(_buffer + _head, buffer, len);
215 // We should never be here!
216 memcpy(_buffer + _head, buffer, _size - _head);
217 memcpy(_buffer, buffer + _size - _head, len - _size + _head);
220 _head = (_head + len) >= _size ? _head + len - _size : _head + len;