avoid bzeroing byte buffers at every allocation for better runtime performance

master
Francisco 4 years ago committed by Francisco Paisana
parent 3265d940ec
commit d2ddcb0d4e

@ -81,63 +81,58 @@ public:
using iterator = uint8_t*; using iterator = uint8_t*;
using const_iterator = const uint8_t*; using const_iterator = const uint8_t*;
uint32_t N_bytes; uint32_t N_bytes = 0;
uint8_t buffer[SRSLTE_MAX_BUFFER_SIZE_BYTES]; uint8_t buffer[SRSLTE_MAX_BUFFER_SIZE_BYTES];
uint8_t* msg; uint8_t* msg = nullptr;
#ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED #ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED
char debug_name[SRSLTE_BUFFER_POOL_LOG_NAME_LEN]; char debug_name[SRSLTE_BUFFER_POOL_LOG_NAME_LEN];
#endif #endif
struct buffer_metadata_t { struct buffer_metadata_t {
uint32_t pdcp_sn = 0; uint32_t pdcp_sn = 0;
buffer_latency_calc tp;
} md; } md;
byte_buffer_t() : N_bytes(0) byte_buffer_t() : msg(&buffer[SRSLTE_BUFFER_HEADER_OFFSET])
{ {
bzero(buffer, SRSLTE_MAX_BUFFER_SIZE_BYTES);
msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET];
#ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED #ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED
bzero(debug_name, SRSLTE_BUFFER_POOL_LOG_NAME_LEN); bzero(debug_name, SRSLTE_BUFFER_POOL_LOG_NAME_LEN);
#endif #endif
} }
byte_buffer_t(const byte_buffer_t& buf) byte_buffer_t(const byte_buffer_t& buf) : msg(&buffer[SRSLTE_BUFFER_HEADER_OFFSET]), md(buf.md), N_bytes(buf.N_bytes)
{ {
bzero(buffer, SRSLTE_MAX_BUFFER_SIZE_BYTES);
msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET];
// copy actual contents // copy actual contents
md = buf.md;
N_bytes = buf.N_bytes;
memcpy(msg, buf.msg, N_bytes); memcpy(msg, buf.msg, N_bytes);
} }
byte_buffer_t& operator=(const byte_buffer_t& buf) byte_buffer_t& operator=(const byte_buffer_t& buf)
{ {
// avoid self assignment // avoid self assignment
if (&buf == this) if (&buf == this)
return *this; return *this;
bzero(buffer, SRSLTE_MAX_BUFFER_SIZE_BYTES);
msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET]; msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET];
N_bytes = buf.N_bytes; N_bytes = buf.N_bytes;
md = buf.md; md = buf.md;
memcpy(msg, buf.msg, N_bytes); memcpy(msg, buf.msg, N_bytes);
return *this; return *this;
} }
void clear() void clear()
{ {
msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET]; msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET];
N_bytes = 0; N_bytes = 0;
md = {}; md = {};
tp.clear();
} }
uint32_t get_headroom() { return msg - buffer; } uint32_t get_headroom() { return msg - buffer; }
// Returns the remaining space from what is reported to be the length of msg // Returns the remaining space from what is reported to be the length of msg
uint32_t get_tailroom() { return (sizeof(buffer) - (msg - buffer) - N_bytes); } uint32_t get_tailroom() { return (sizeof(buffer) - (msg - buffer) - N_bytes); }
std::chrono::microseconds get_latency_us() const { return tp.get_latency_us(); } std::chrono::microseconds get_latency_us() const { return md.tp.get_latency_us(); }
std::chrono::high_resolution_clock::time_point get_timestamp() const { return tp.get_timestamp(); } std::chrono::high_resolution_clock::time_point get_timestamp() const { return md.tp.get_timestamp(); }
void set_timestamp() { tp.set_timestamp(); } void set_timestamp() { md.tp.set_timestamp(); }
void set_timestamp(std::chrono::high_resolution_clock::time_point tp_) { tp.set_timestamp(tp_); } void set_timestamp(std::chrono::high_resolution_clock::time_point tp_) { md.tp.set_timestamp(tp_); }
void append_bytes(uint8_t* buf, uint32_t size) void append_bytes(uint8_t* buf, uint32_t size)
{ {
@ -159,24 +154,19 @@ public:
void* operator new[](size_t sz) = delete; void* operator new[](size_t sz) = delete;
void operator delete(void* ptr); void operator delete(void* ptr);
void operator delete[](void* ptr) = delete; void operator delete[](void* ptr) = delete;
private:
buffer_latency_calc tp;
}; };
struct bit_buffer_t { struct bit_buffer_t {
uint32_t N_bits; uint32_t N_bits = 0;
uint8_t buffer[SRSLTE_MAX_BUFFER_SIZE_BITS]; uint8_t buffer[SRSLTE_MAX_BUFFER_SIZE_BITS];
uint8_t* msg; uint8_t* msg = nullptr;
#ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED #ifdef SRSLTE_BUFFER_POOL_LOG_ENABLED
char debug_name[128]; char debug_name[128];
#endif #endif
bit_buffer_t() : N_bits(0) { msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET]; } bit_buffer_t() : msg(&buffer[SRSLTE_BUFFER_HEADER_OFFSET]) {}
bit_buffer_t(const bit_buffer_t& buf) bit_buffer_t(const bit_buffer_t& buf) : msg(&buffer[SRSLTE_BUFFER_HEADER_OFFSET]), N_bits(buf.N_bits)
{ {
msg = &buffer[SRSLTE_BUFFER_HEADER_OFFSET];
N_bits = buf.N_bits;
memcpy(msg, buf.msg, N_bits); memcpy(msg, buf.msg, N_bits);
} }
bit_buffer_t& operator=(const bit_buffer_t& buf) bit_buffer_t& operator=(const bit_buffer_t& buf)

Loading…
Cancel
Save