From b7d4a72ea10f0a7d0cf40f45c858c9464b673952 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 7 Apr 2021 20:31:10 +0100 Subject: [PATCH] adt - fix circular map clear() and erase(it) functions --- lib/include/srsran/adt/circular_map.h | 14 +++++++++----- lib/include/srsran/mac/pdu_queue.h | 2 +- srsenb/hdr/stack/mac/ue.h | 28 +++++++++++++-------------- srsenb/src/stack/mac/ue.cc | 8 ++++++++ 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/lib/include/srsran/adt/circular_map.h b/lib/include/srsran/adt/circular_map.h index f726a76e7..bf49a5369 100644 --- a/lib/include/srsran/adt/circular_map.h +++ b/lib/include/srsran/adt/circular_map.h @@ -184,20 +184,24 @@ public: iterator erase(iterator it) { - srsran_assert(it.idx < N, "Iterator out-of-bounds (%zd >= %zd)", it.idx, N); + srsran_assert(it.idx < N and it.ptr == this, "Iterator out-of-bounds (%zd >= %zd)", it.idx, N); iterator next = it; ++next; - it->~obj_t(); - present[it->first] = false; + present[it.idx] = false; + get_obj_(it.idx).~obj_t(); --count; return next; } void clear() { - for (auto it = begin(); it != end();) { - it = erase(it); + for (size_t i = 0; i < N; ++i) { + if (present[i]) { + present[i] = false; + get_obj_(i).~obj_t(); + } } + count = 0; } T& operator[](K id) diff --git a/lib/include/srsran/mac/pdu_queue.h b/lib/include/srsran/mac/pdu_queue.h index f107f6c3f..74e60a09f 100644 --- a/lib/include/srsran/mac/pdu_queue.h +++ b/lib/include/srsran/mac/pdu_queue.h @@ -58,8 +58,8 @@ private: } pdu_t; - static_blocking_queue pdu_q; buffer_pool pool; + static_blocking_queue pdu_q; process_callback* callback; srslog::basic_logger& logger; diff --git a/srsenb/hdr/stack/mac/ue.h b/srsenb/hdr/stack/mac/ue.h index a2124ea03..2fd9db884 100644 --- a/srsenb/hdr/stack/mac/ue.h +++ b/srsenb/hdr/stack/mac/ue.h @@ -63,6 +63,7 @@ class cc_used_buffers_map { public: explicit cc_used_buffers_map(srsran::pdu_queue& shared_pdu_queue_); + ~cc_used_buffers_map(); uint8_t* request_pdu(tti_point tti, uint32_t len); @@ -180,11 +181,11 @@ private: bool process_ce(srsran::sch_subh* subh); void allocate_ce(srsran::sch_pdu* pdu, uint32_t lcid); - uint32_t phr_counter = 0; - uint32_t dl_cqi_counter = 0; - uint32_t dl_ri_counter = 0; - uint32_t dl_pmi_counter = 0; - mac_ue_metrics_t ue_metrics = {}; + rlc_interface_mac* rlc = nullptr; + rrc_interface_mac* rrc = nullptr; + phy_interface_stack_lte* phy = nullptr; + srslog::basic_logger& logger; + sched_interface* sched = nullptr; srsran::mac_pcap* pcap = nullptr; srsran::mac_pcap_net* pcap_net = nullptr; @@ -193,12 +194,14 @@ private: uint32_t last_tti = 0; uint32_t nof_failures = 0; + uint32_t phr_counter = 0; + uint32_t dl_cqi_counter = 0; + uint32_t dl_ri_counter = 0; + uint32_t dl_pmi_counter = 0; + mac_ue_metrics_t ue_metrics = {}; + srsran::obj_pool_itf* softbuffer_pool = nullptr; - srsran::bounded_vector cc_buffers; - - std::mutex rx_buffers_mutex; - srsran::block_queue pending_ta_commands; ta ta_fsm; @@ -207,14 +210,11 @@ private: srsran::sch_pdu mac_msg_dl, mac_msg_ul; srsran::mch_pdu mch_mac_msg_dl; - rlc_interface_mac* rlc = nullptr; - rrc_interface_mac* rrc = nullptr; - phy_interface_stack_lte* phy = nullptr; - srslog::basic_logger& logger; - sched_interface* sched = nullptr; + srsran::bounded_vector cc_buffers; // Mutexes std::mutex mutex; + std::mutex rx_buffers_mutex; const uint8_t UL_CC_IDX = 0; ///< Passed to write CC index in PCAP (TODO: use actual CC idx) }; diff --git a/srsenb/src/stack/mac/ue.cc b/srsenb/src/stack/mac/ue.cc index 014500dce..3fbe24b8a 100644 --- a/srsenb/src/stack/mac/ue.cc +++ b/srsenb/src/stack/mac/ue.cc @@ -66,6 +66,11 @@ cc_used_buffers_map::cc_used_buffers_map(srsran::pdu_queue& shared_pdu_queue_) : shared_pdu_queue(&shared_pdu_queue_), logger(&srslog::fetch_basic_logger("MAC")) {} +cc_used_buffers_map::~cc_used_buffers_map() +{ + clear(); +} + bool cc_used_buffers_map::push_pdu(tti_point tti, uint32_t len) { if (not has_tti(tti)) { @@ -135,6 +140,9 @@ bool cc_used_buffers_map::try_deallocate_pdu(tti_point tti) void cc_used_buffers_map::clear() { + for (auto& buffer : pdu_map) { + shared_pdu_queue->deallocate(buffer.second); + } pdu_map.clear(); }