From edbabf840d2bbb1499322bd50add2216fec730a8 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 27 Feb 2021 12:32:46 +0800 Subject: [PATCH] Refine object cache. --- trunk/src/kernel/srs_kernel_flv.hpp | 2 +- trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 29 +++++++++++--------- trunk/src/kernel/srs_kernel_rtc_rtp.hpp | 36 ++++++++++++------------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp index d5a2bd2c3..c5e96394d 100644 --- a/trunk/src/kernel/srs_kernel_flv.hpp +++ b/trunk/src/kernel/srs_kernel_flv.hpp @@ -313,7 +313,7 @@ public: virtual ~SrsSharedPtrMessage(); public: // For object cache to reset and reuse it. - bool reset() { return true; } + bool recycle() { return true; } // Create shared ptr message, // copy header, manage the payload of msg, // set the payload to NULL to prevent double free. diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index e60be64d6..d292be75b 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -811,21 +811,25 @@ ISrsRtpPacketDecodeHandler::~ISrsRtpPacketDecodeHandler() SrsRtpPacket2::SrsRtpPacket2() { - payload_ = NULL; payload_type_ = SrsRtpPacketPayloadTypeUnknown; + payload_ = NULL; + payload_type_ = SrsRtpPacketPayloadTypeUnknown; shared_msg = NULL; - reset(); + nalu_type = SrsAvcNaluTypeReserved; + frame_type = SrsFrameTypeReserved; + cached_payload_size = 0; + decode_handler = NULL; ++_srs_pps_objs_rtps->sugar; } SrsRtpPacket2::~SrsRtpPacket2() { - reuse_payload(); - reuse_shared_msg(); + recycle_payload(); + recycle_shared_msg(); } -void SrsRtpPacket2::reuse_payload() +void SrsRtpPacket2::recycle_payload() { if (!payload_) { return; @@ -848,7 +852,7 @@ void SrsRtpPacket2::reuse_payload() payload_ = NULL; payload_type_ = SrsRtpPacketPayloadTypeUnknown; } -void SrsRtpPacket2::reuse_shared_msg() +void SrsRtpPacket2::recycle_shared_msg() { if (!shared_msg) { return; @@ -870,7 +874,7 @@ void SrsRtpPacket2::reuse_shared_msg() } } -bool SrsRtpPacket2::reset() +bool SrsRtpPacket2::recycle() { nalu_type = SrsAvcNaluTypeReserved; frame_type = SrsFrameTypeReserved; @@ -878,8 +882,9 @@ bool SrsRtpPacket2::reset() decode_handler = NULL; header.reset(); - reuse_payload(); - reuse_shared_msg(); + + recycle_payload(); + recycle_shared_msg(); return true; } @@ -929,7 +934,7 @@ char* SrsRtpPacket2::wrap(char* data, int size) char* SrsRtpPacket2::wrap(SrsSharedPtrMessage* msg) { // Recycle the shared message. - reuse_shared_msg(); + recycle_shared_msg(); // Copy from the new message. shared_msg = msg->copy(); @@ -968,8 +973,8 @@ SrsRtpPacket2* SrsRtpPacket2::copy() SrsRtpPacket2* cp = _srs_rtp_cache->allocate(); // We got packet from cache, so we must recycle it. - cp->reuse_payload(); - cp->reuse_shared_msg(); + cp->recycle_payload(); + cp->recycle_shared_msg(); cp->header = header; cp->payload_ = payload_? payload_->copy():NULL; diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index 70a128089..4a8e70938 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -318,11 +318,11 @@ public: SrsRtpPacket2(); virtual ~SrsRtpPacket2(); private: - void reuse_payload(); - void reuse_shared_msg(); + void recycle_payload(); + void recycle_shared_msg(); public: // Recycle the object to reuse it. - virtual bool reset(); + virtual bool recycle(); // Wrap buffer to shared_message, which is managed by us. char* wrap(int size); char* wrap(char* data, int size); @@ -414,22 +414,14 @@ public: // Try to allocate from cache, create new object if no cache. // SrsRtpObjectCacheManager::allocate T* allocate() { - while (true) { - if (!enabled_ || cache_objs_.empty()) { - return new T(); - } - - T* obj = cache_objs_.back(); - cache_objs_.pop_back(); + if (!enabled_ || cache_objs_.empty()) { + return new T(); + } - // If reset the object fail, drop the cached object. - if (!obj->reset()) { - srs_freep(obj); - continue; - } + T* obj = cache_objs_.back(); + cache_objs_.pop_back(); - return obj; - } + return obj; } // Recycle the object to cache. // @remark User can directly free the packet. @@ -446,6 +438,12 @@ public: return; } + // If recycle the object fail, drop the cached object. + if (!p->recycle()) { + srs_freep(p); + return; + } + // If exceed the capacity, drop the object. if (cache_objs_.size() > capacity_) { ++_srs_pps_objs_drop->sugar; @@ -471,7 +469,7 @@ public: SrsRtpRawPayload(); virtual ~SrsRtpRawPayload(); public: - bool reset() { return true; } + bool recycle() { return true; } // interface ISrsRtpPayloader public: virtual uint64_t nb_bytes(); @@ -571,7 +569,7 @@ public: SrsRtpFUAPayload2(); virtual ~SrsRtpFUAPayload2(); public: - bool reset() { return true; } + bool recycle() { return true; } // interface ISrsRtpPayloader public: virtual uint64_t nb_bytes();