refactor mac::ue cc_used_buffers_map class to use new circular_map container

This commit is contained in:
Francisco 2021-04-01 14:15:43 +01:00 committed by Francisco Paisana
parent 696de22a28
commit 8fda69a3dd
2 changed files with 22 additions and 28 deletions

View File

@ -15,6 +15,7 @@
#include "mac_metrics.h" #include "mac_metrics.h"
#include "srsran/adt/circular_array.h" #include "srsran/adt/circular_array.h"
#include "srsran/adt/circular_map.h"
#include "srsran/common/block_queue.h" #include "srsran/common/block_queue.h"
#include "srsran/common/mac_pcap.h" #include "srsran/common/mac_pcap.h"
#include "srsran/common/mac_pcap_net.h" #include "srsran/common/mac_pcap_net.h"
@ -59,7 +60,7 @@ private:
srslog::basic_logger* logger; srslog::basic_logger* logger;
srsran::pdu_queue* shared_pdu_queue; srsran::pdu_queue* shared_pdu_queue;
srsran::circular_array<std::pair<tti_point, uint8_t*>, SRSRAN_FDD_NOF_HARQ * 8> pdu_map; srsran::static_circular_map<uint32_t, uint8_t*, SRSRAN_FDD_NOF_HARQ * 8> pdu_map;
}; };
class cc_buffer_handler class cc_buffer_handler

View File

@ -24,7 +24,7 @@
namespace srsenb { namespace srsenb {
cc_used_buffers_map::cc_used_buffers_map(srsran::pdu_queue& shared_pdu_queue_) : cc_used_buffers_map::cc_used_buffers_map(srsran::pdu_queue& shared_pdu_queue_) :
pdu_map(), shared_pdu_queue(&shared_pdu_queue_), logger(&srslog::fetch_basic_logger("MAC")) shared_pdu_queue(&shared_pdu_queue_), logger(&srslog::fetch_basic_logger("MAC"))
{} {}
bool cc_used_buffers_map::push_pdu(tti_point tti, uint32_t len) bool cc_used_buffers_map::push_pdu(tti_point tti, uint32_t len)
@ -32,23 +32,22 @@ bool cc_used_buffers_map::push_pdu(tti_point tti, uint32_t len)
if (not has_tti(tti)) { if (not has_tti(tti)) {
return false; return false;
} }
auto& pdu_pair = pdu_map[tti.to_uint()]; uint8_t* buffer = pdu_map[tti.to_uint()];
if (len > 0) { if (len > 0) {
shared_pdu_queue->push(pdu_pair.second, len); shared_pdu_queue->push(buffer, len);
} else { } else {
shared_pdu_queue->deallocate(pdu_pair.second); shared_pdu_queue->deallocate(buffer);
logger->error("Error pushing PDU: null length"); logger->error("Error pushing PDU: null length");
} }
// clear entry in map // clear entry in map
pdu_pair.first = tti_point(); pdu_map.erase(tti.to_uint());
pdu_pair.second = nullptr;
return len > 0; return len > 0;
} }
uint8_t* cc_used_buffers_map::request_pdu(tti_point tti, uint32_t len) uint8_t* cc_used_buffers_map::request_pdu(tti_point tti, uint32_t len)
{ {
if (pdu_map[tti.to_uint()].second != nullptr) { if (pdu_map.has_space(tti.to_uint())) {
logger->error("UE buffers: buffer for tti=%d already allocated", tti.to_uint()); logger->error("UE buffers: could not allocate buffer for tti=%d", tti.to_uint());
return nullptr; return nullptr;
} }
@ -58,8 +57,8 @@ uint8_t* cc_used_buffers_map::request_pdu(tti_point tti, uint32_t len)
return nullptr; return nullptr;
} }
pdu_map[tti.to_uint()].first = tti; bool inserted = pdu_map.insert(tti.to_uint(), pdu);
pdu_map[tti.to_uint()].second = pdu; srsran_assert(inserted, "Failure to allocate new buffer");
return pdu; return pdu;
} }
@ -69,29 +68,26 @@ void cc_used_buffers_map::clear_old_pdus(tti_point current_tti)
tti_point max_tti{current_tti - old_tti_threshold}; tti_point max_tti{current_tti - old_tti_threshold};
for (auto& pdu_pair : pdu_map) { for (auto& pdu_pair : pdu_map) {
if (pdu_pair.second != nullptr and pdu_pair.first < max_tti) { tti_point t(pdu_pair.first);
logger->warning("UE buffers: Removing old buffer tti=%d, interval=%d", if (t < max_tti) {
pdu_pair.first.to_uint(), logger->warning("UE buffers: Removing old buffer tti=%d, interval=%d", t.to_uint(), current_tti - t);
current_tti - pdu_pair.first); remove_pdu(t);
remove_pdu(pdu_pair.first);
} }
} }
} }
void cc_used_buffers_map::remove_pdu(tti_point tti) void cc_used_buffers_map::remove_pdu(tti_point tti)
{ {
auto& pdu_pair = pdu_map[tti.to_uint()]; uint8_t* buffer = pdu_map[tti.to_uint()];
assert(pdu_pair.second != nullptr && "cannot remove inexistent PDU");
// return pdus back to the queue // return pdus back to the queue
shared_pdu_queue->deallocate(pdu_pair.second); shared_pdu_queue->deallocate(buffer);
// clear entry in map // clear entry in map
pdu_pair.first = tti_point(); pdu_map.erase(tti.to_uint());
pdu_pair.second = nullptr;
} }
bool cc_used_buffers_map::try_deallocate_pdu(tti_point tti) bool cc_used_buffers_map::try_deallocate_pdu(tti_point tti)
{ {
if (pdu_map[tti.to_uint()].second != nullptr) { if (has_tti(tti)) {
remove_pdu(tti); remove_pdu(tti);
return true; return true;
} }
@ -100,20 +96,17 @@ bool cc_used_buffers_map::try_deallocate_pdu(tti_point tti)
void cc_used_buffers_map::clear() void cc_used_buffers_map::clear()
{ {
for (auto& pdu : pdu_map) { pdu_map.clear();
try_deallocate_pdu(pdu.first);
}
} }
uint8_t*& cc_used_buffers_map::operator[](tti_point tti) uint8_t*& cc_used_buffers_map::operator[](tti_point tti)
{ {
assert(has_tti(tti) && "Trying to access buffer that does not exist"); return pdu_map[tti.to_uint()];
return pdu_map[tti.to_uint()].second;
} }
bool cc_used_buffers_map::has_tti(tti_point tti) const bool cc_used_buffers_map::has_tti(tti_point tti) const
{ {
return pdu_map[tti.to_uint()].first == tti and pdu_map[tti.to_uint()].second != nullptr; return pdu_map.contains(tti.to_uint()) and pdu_map[tti.to_uint()] != nullptr;
} }
//////////////// ////////////////