diff --git a/srsenb/hdr/stack/rrc/rrc_paging.h b/srsenb/hdr/stack/rrc/rrc_paging.h index 74e6367c2..5ae15f66a 100644 --- a/srsenb/hdr/stack/rrc/rrc_paging.h +++ b/srsenb/hdr/stack/rrc/rrc_paging.h @@ -55,7 +55,6 @@ public: private: struct pcch_info { - mutable std::mutex mutex; tti_point tti_tx_dl; asn1::rrc::pcch_msg_s pcch_msg; srsran::unique_byte_buffer_t pdu; @@ -76,7 +75,6 @@ private: { return pending_paging[tti_tx_dl.sfn() % T][tti_tx_dl.sf_idx()]; } - void clear_pcch_info(tti_point tti); // args uint32_t T; @@ -85,17 +83,10 @@ private: uint32_t Ns; srslog::basic_logger& logger; + mutable std::array sf_idx_mutex; std::vector > pending_paging; }; -void paging_manager::clear_pcch_info(tti_point tti) -{ - pcch_info& pcch = get_pcch_info(tti); - - std::lock_guard lock(pcch.mutex); - pcch.clear(); -} - bool paging_manager::add_imsi_paging(uint32_t ueid, srsran::const_byte_span imsi) { asn1::rrc::paging_record_s paging_elem; @@ -136,7 +127,7 @@ bool paging_manager::add_paging_record(uint32_t ueid, const asn1::rrc::paging_re pcch_info& pending_pcch = pending_paging[sfn_cycle_idx][sf_idx]; auto& record_list = pending_pcch.pcch_msg.msg.c1().paging().paging_record_list; - std::lock_guard lock(pending_pcch.mutex); + std::lock_guard lock(sf_idx_mutex[sf_idx]); if (record_list.size() >= ASN1_RRC_MAX_PAGE_REC) { logger.warning("Failed to add new paging record for ueid=%d. Cause: no paging record space left.", ueid); @@ -166,12 +157,15 @@ bool paging_manager::add_paging_record(uint32_t ueid, const asn1::rrc::paging_re size_t paging_manager::pending_pcch_bytes(tti_point tti_tx_dl) { + std::lock_guard lock(sf_idx_mutex[tti_tx_dl.sf_idx()]); + // clear old PCCH that has been transmitted at this point - clear_pcch_info(tti_tx_dl - SRSRAN_NOF_SF_X_FRAME); + pcch_info& old_pcch = get_pcch_info(tti_tx_dl - SRSRAN_NOF_SF_X_FRAME); + if (not old_pcch.empty()) { + old_pcch.clear(); + } const pcch_info& pending_pcch = get_pcch_info(tti_tx_dl); - - std::lock_guard lock(pending_pcch.mutex); if (pending_pcch.empty()) { return 0; } @@ -179,11 +173,11 @@ size_t paging_manager::pending_pcch_bytes(tti_point tti_tx_dl) } template -bool paging_manager::read_pdu_pcch(tti_point tti_tx_dl, const Callable& callable) +bool paging_manager::read_pdu_pcch(tti_point tti_tx_dl, const Callable& func) { pcch_info& pending_pcch = get_pcch_info(tti_tx_dl); - std::lock_guard lock(pending_pcch.mutex); + std::lock_guard lock(sf_idx_mutex[tti_tx_dl.sf_idx()]); if (pending_pcch.empty()) { logger.warning("read_pdu_pdcch(...) called for tti=%d, but there is no pending pcch message", tti_tx_dl.to_uint()); @@ -191,7 +185,7 @@ bool paging_manager::read_pdu_pcch(tti_point tti_tx_dl, const Callable& callable } // Call callable for existing PCCH pdu - if (callable(*pending_pcch.pdu, pending_pcch.pcch_msg, pending_pcch.tti_tx_dl.is_valid())) { + if (func(*pending_pcch.pdu, pending_pcch.pcch_msg, pending_pcch.tti_tx_dl.is_valid())) { pending_pcch.tti_tx_dl = tti_tx_dl; return true; }