diff options
Diffstat (limited to 'gnuradio-runtime/lib/buffer_reader_sm.cc')
-rw-r--r-- | gnuradio-runtime/lib/buffer_reader_sm.cc | 85 |
1 files changed, 7 insertions, 78 deletions
diff --git a/gnuradio-runtime/lib/buffer_reader_sm.cc b/gnuradio-runtime/lib/buffer_reader_sm.cc index 9e0fac584f..c0d4b07d65 100644 --- a/gnuradio-runtime/lib/buffer_reader_sm.cc +++ b/gnuradio-runtime/lib/buffer_reader_sm.cc @@ -26,13 +26,14 @@ namespace gr { buffer_reader_sm::~buffer_reader_sm() {} -int buffer_reader_sm::items_available() +int buffer_reader_sm::items_available() const { int available = 0; if ((nitems_read() - sample_delay()) != d_buffer->nitems_written()) { if (d_buffer->d_write_index == d_read_index) { - if ((nitems_read() - sample_delay()) != d_buffer->nitems_written()) { + if ((nitems_read() - sample_delay()) != + (d_buffer->nitems_written() + link()->history() - 1)) { available = d_buffer->d_bufsize - d_read_index; } } else { @@ -55,87 +56,15 @@ int buffer_reader_sm::items_available() bool buffer_reader_sm::input_blkd_cb_ready(int items_required) const { - gr::thread::scoped_lock(*d_buffer->mutex()); - - return (((d_buffer->d_bufsize - d_read_index) < (uint32_t)items_required) && - (d_buffer->d_write_index < d_read_index)); + return d_buffer->input_blkd_cb_ready(items_required, d_read_index); } bool buffer_reader_sm::input_blocked_callback(int items_required, int items_avail) { - // Maybe adjust read pointers from min read index? - // This would mean that *all* readers must be > (passed) the write index - if (((d_buffer->d_bufsize - d_read_index) < (uint32_t)items_required) && - (d_buffer->d_write_index < d_read_index)) { - - // Update items available before going farther as it could be stale - items_avail = items_available(); - - // Find reader with the smallest read index that is greater than the - // write index - uint32_t min_reader_index = std::numeric_limits<uint32_t>::max(); - uint32_t min_read_idx = std::numeric_limits<uint32_t>::max(); - for (size_t idx = 0; idx < d_buffer->d_readers.size(); ++idx) { - if (d_buffer->d_readers[idx]->d_read_index > d_buffer->d_write_index) { - // Record index of reader with minimum read-index - if (d_buffer->d_readers[idx]->d_read_index < min_read_idx) { - min_read_idx = d_buffer->d_readers[idx]->d_read_index; - min_reader_index = idx; - } - } - } - - // Note items_avail might be zero, that's okay. - items_avail += d_read_index - min_read_idx; - int gap = min_read_idx - d_buffer->d_write_index; - if (items_avail > gap) { - return false; - } - -#ifdef BUFFER_DEBUG - std::ostringstream msg; - msg << "[" << d_buffer << ";" << this << "] " - << "input_blocked_callback() WR_idx: " << d_buffer->d_write_index - << " -- WR items: " << d_buffer->nitems_written() - << " -- BUFSIZE: " << d_buffer->d_bufsize << " -- RD_idx: " << min_read_idx; - for (size_t idx = 0; idx < d_buffer->d_readers.size(); ++idx) { - if (idx != min_reader_index) { - msg << " -- OTHER_RDR: " << d_buffer->d_readers[idx]->d_read_index; - } - } - - msg << " -- GAP: " << gap << " -- items_required: " << items_required - << " -- items_avail: " << items_avail; - GR_LOG_DEBUG(d_logger, msg.str()); -#endif - - // Shift existing data down to make room for blocked data at end of buffer - uint32_t move_data_size = d_buffer->d_write_index * d_buffer->d_sizeof_item; - char* dest = d_buffer->d_base + (items_avail * d_buffer->d_sizeof_item); - std::memmove(dest, d_buffer->d_base, move_data_size); - - // Next copy the data from the end of the buffer back to the beginning - uint32_t avail_data_size = items_avail * d_buffer->d_sizeof_item; - char* src = d_buffer->d_base + (min_read_idx * d_buffer->d_sizeof_item); - std::memcpy(d_buffer->d_base, src, avail_data_size); - - // Now adjust write pointer - d_buffer->d_write_index += items_avail; - - // Finally adjust all reader pointers - for (size_t idx = 0; idx < d_buffer->d_readers.size(); ++idx) { - if (idx == min_reader_index) { - d_buffer->d_readers[idx]->d_read_index = 0; - } else { - d_buffer->d_readers[idx]->d_read_index += items_avail; - d_buffer->d_readers[idx]->d_read_index %= d_buffer->d_bufsize; - } - } - - return true; - } + // Update items available before going farther as it could be stale + items_avail = items_available(); - return false; + return d_buffer->input_blocked_callback(items_required, items_avail, d_read_index); } buffer_reader_sm::buffer_reader_sm(buffer_sptr buffer, |