5G-MAG Reference Tools - MBMS Modem
Public Member Functions | Private Attributes | List of all members
MultichannelRingbuffer Class Reference

#include <MultichannelRingbuffer.h>

Collaboration diagram for MultichannelRingbuffer:
Collaboration graph

Public Member Functions

 MultichannelRingbuffer (size_t size, size_t channels)
 
virtual ~MultichannelRingbuffer ()
 
size_t free_size ()
 
size_t used_size ()
 
size_t capacity ()
 
void clear ()
 
std::vector< void * > read_head ()
 
std::vector< void * > write_head (size_t *writeable)
 
void commit (size_t written)
 
void read (std::vector< char * > dest, size_t bytes)
 

Private Attributes

std::vector< char * > _buffers
 
size_t _size
 
size_t _channels
 
size_t _head
 
size_t _used
 
std::mutex _mutex
 

Detailed Description

Definition at line 28 of file MultichannelRingbuffer.h.

Constructor & Destructor Documentation

◆ MultichannelRingbuffer()

MultichannelRingbuffer::MultichannelRingbuffer ( size_t  size,
size_t  channels 
)
explicit

Definition at line 25 of file MultichannelRingbuffer.cpp.

26  : _size( size )
27  , _channels( channels )
28  , _used( 0 )
29  , _head( 0 )
30 {
31  for (auto ch = 0; ch < _channels; ch++) {
32  auto buf = (char*)srsran_vec_malloc( _size);
33  //auto buf = (char*)malloc(_size);
34  if (buf == nullptr) {
35  throw "Could not allocate memory";
36  }
37  _buffers.push_back(buf);
38  }
39  spdlog::debug("Created {}-channel ringbuffer with size {}", _channels, _size );
40 }
std::vector< char * > _buffers

◆ ~MultichannelRingbuffer()

MultichannelRingbuffer::~MultichannelRingbuffer ( )
virtual

Definition at line 42 of file MultichannelRingbuffer.cpp.

43 {
44  for (auto buffer : _buffers) {
45  if (buffer) free(buffer);
46  }
47 }

Member Function Documentation

◆ capacity()

size_t MultichannelRingbuffer::capacity ( )
inline

Definition at line 35 of file MultichannelRingbuffer.h.

35 { std::lock_guard<std::mutex> lock(_mutex);return _size; }

◆ clear()

void MultichannelRingbuffer::clear ( )
inline

Definition at line 37 of file MultichannelRingbuffer.h.

37 {std::lock_guard<std::mutex> lock(_mutex); _head = _used = 0; };

◆ commit()

auto MultichannelRingbuffer::commit ( size_t  written)

Definition at line 84 of file MultichannelRingbuffer.cpp.

85 {
86  assert(written >= 0);
87  assert(written <= free_size());
88  std::lock_guard<std::mutex> lock(_mutex);
89  _used += written;
90 // _mutex.unlock();
91 }

◆ free_size()

size_t MultichannelRingbuffer::free_size ( )
inline

Definition at line 33 of file MultichannelRingbuffer.h.

33 { std::lock_guard<std::mutex> lock(_mutex); return _size - _used; }

◆ read()

auto MultichannelRingbuffer::read ( std::vector< char * >  dest,
size_t  bytes 
)

Definition at line 93 of file MultichannelRingbuffer.cpp.

94 {
95  assert(dest.size() >= _channels);
96  assert(size <= used_size());
97  assert(size >= 0);
98 
99  std::lock_guard<std::mutex> lock(_mutex);
100  auto end = (_head + size) % _size;
101 
102  if (end <= _head) {
103  auto first_part = _size - _head;
104  auto second_part = size - first_part;
105  for (auto ch = 0; ch < _channels; ch++) {
106  memcpy(dest[ch], _buffers[ch] + _head, first_part);
107  memcpy(dest[ch] + first_part, _buffers[ch], second_part);
108  }
109  } else {
110  for (auto ch = 0; ch < _channels; ch++) {
111  memcpy(dest[ch], _buffers[ch] + _head, size);
112  }
113  }
114  _head = (_head + size) % _size;
115  _used -= size;
116 }

◆ read_head()

auto MultichannelRingbuffer::read_head ( )

Definition at line 49 of file MultichannelRingbuffer.cpp.

50 {
51 // _mutex.lock();
52  std::lock_guard<std::mutex> lock(_mutex);
53  std::vector<void*> buffers(_channels, nullptr);
54  for (auto ch = 0; ch < _channels; ch++) {
55  buffers[ch] = (void*)(_buffers[ch]); // Return the beggining of the buffer;
56  }
57  _head = 0;
58  _used = 0;
59  return buffers;
60 }

◆ used_size()

size_t MultichannelRingbuffer::used_size ( )
inline

Definition at line 34 of file MultichannelRingbuffer.h.

34 { std::lock_guard<std::mutex> lock(_mutex); return _used; }

◆ write_head()

auto MultichannelRingbuffer::write_head ( size_t *  writeable)

Definition at line 62 of file MultichannelRingbuffer.cpp.

63 {
64 // _mutex.lock();
65  std::lock_guard<std::mutex> lock(_mutex);
66  std::vector<void*> buffers(_channels, nullptr);
67  if (_size == _used) { // In this case we return a nullptr. Because read_head and read functions we should never see a situation where we try to read this returned nullptr. Usually never reach exactly te end of the buffer.
68  *writeable = 0;
69  } else {
70  auto tail = (_head + _used) % _size;
71  if (tail < _head) {
72  *writeable = _head - tail;
73  } else {
74  *writeable = _size - tail;
75  }
76  for (auto ch = 0; ch < _channels; ch++) {
77  buffers[ch] = (void*)(_buffers[ch] + tail);
78  }
79  }
80 
81  return buffers;
82 }

Member Data Documentation

◆ _buffers

std::vector<char*> MultichannelRingbuffer::_buffers
private

Definition at line 46 of file MultichannelRingbuffer.h.

◆ _channels

size_t MultichannelRingbuffer::_channels
private

Definition at line 48 of file MultichannelRingbuffer.h.

◆ _head

size_t MultichannelRingbuffer::_head
private

Definition at line 49 of file MultichannelRingbuffer.h.

◆ _mutex

std::mutex MultichannelRingbuffer::_mutex
private

Definition at line 51 of file MultichannelRingbuffer.h.

◆ _size

size_t MultichannelRingbuffer::_size
private

Definition at line 47 of file MultichannelRingbuffer.h.

◆ _used

size_t MultichannelRingbuffer::_used
private

Definition at line 50 of file MultichannelRingbuffer.h.


The documentation for this class was generated from the following files: