diff --git a/trunk/src/app/srs_app_conn.cpp b/trunk/src/app/srs_app_conn.cpp index 0ca458ef8..b8a3e82a6 100644 --- a/trunk/src/app/srs_app_conn.cpp +++ b/trunk/src/app/srs_app_conn.cpp @@ -406,21 +406,21 @@ void SrsResourceManager::dispose(ISrsResource* c) } } -SrsSweepGc::SrsSweepGc() +SrsLazySweepGc::SrsLazySweepGc() { } -SrsSweepGc::~SrsSweepGc() +SrsLazySweepGc::~SrsLazySweepGc() { } -srs_error_t SrsSweepGc::start() +srs_error_t SrsLazySweepGc::start() { srs_error_t err = srs_success; return err; } -void SrsSweepGc::remove(SrsLazyObject* c) +void SrsLazySweepGc::remove(SrsLazyObject* c) { // TODO: FIXME: MUST lazy sweep. srs_freep(c); diff --git a/trunk/src/app/srs_app_conn.hpp b/trunk/src/app/srs_app_conn.hpp index cb596852c..d8222a82e 100644 --- a/trunk/src/app/srs_app_conn.hpp +++ b/trunk/src/app/srs_app_conn.hpp @@ -125,11 +125,11 @@ private: }; // A simple lazy-sweep GC, just wait for a long time to delete the disposable resources. -class SrsSweepGc : public ISrsLazyGc +class SrsLazySweepGc : public ISrsLazyGc { public: - SrsSweepGc(); - virtual ~SrsSweepGc(); + SrsLazySweepGc(); + virtual ~SrsLazySweepGc(); public: virtual srs_error_t start(); virtual void remove(SrsLazyObject* c); @@ -144,21 +144,19 @@ class SrsLazyObjectWrapper : public ISrsResource { private: T* resource_; - ISrsResource* wrapper_; bool is_root_; public: SrsLazyObjectWrapper(T* resource = NULL, ISrsResource* wrapper = NULL) { - wrapper_ = wrapper ? wrapper : this; resource_ = resource ? resource : new T(); - resource_->gc_use(wrapper_); + resource_->gc_use(); is_root_ = !resource; if (!resource) { - resource_->gc_set_creator_wrapper(wrapper_); + resource_->gc_set_creator_wrapper(wrapper ? wrapper : this); } } virtual ~SrsLazyObjectWrapper() { - resource_->gc_dispose(wrapper_); + resource_->gc_dispose(); if (is_root_) { resource_->gc_set_creator_wrapper(NULL); diff --git a/trunk/src/app/srs_app_gb28181.cpp b/trunk/src/app/srs_app_gb28181.cpp index 3d5a27a2e..8b46d0c81 100644 --- a/trunk/src/app/srs_app_gb28181.cpp +++ b/trunk/src/app/srs_app_gb28181.cpp @@ -366,7 +366,7 @@ srs_error_t SrsLazyGbSession::drive_state() } // Now, we're able to query session by ssrc, for media packets. - SrsLazyGbSessionWrapper* wrapper = dynamic_cast(gc_available_wrapper()); + SrsLazyGbSessionWrapper* wrapper = dynamic_cast(gc_creator_wrapper()); srs_assert(wrapper); // It MUST never be NULL, because this method is in the cycle of coroutine. _srs_gb_manager->add_with_fast_id(ssrc, wrapper); } @@ -998,7 +998,7 @@ srs_error_t SrsLazyGbSipTcpConn::bind_session(SrsSipMessage* msg, SrsLazyGbSessi if (msg->type_ != HTTP_REQUEST || msg->method_ != HTTP_REGISTER) return err; // The lazy-sweep wrapper for this resource. - SrsLazyGbSipTcpConnWrapper* wrapper = dynamic_cast(gc_available_wrapper()); + SrsLazyGbSipTcpConnWrapper* wrapper = dynamic_cast(gc_creator_wrapper()); srs_assert(wrapper); // It MUST never be NULL, because this method is in the cycle of coroutine of receiver. // Find exists session for register, might be created by another object and still alive. @@ -1480,7 +1480,7 @@ srs_error_t SrsLazyGbMediaTcpConn::bind_session(uint32_t ssrc, SrsLazyGbSessionW if (!ssrc) return err; // The lazy-sweep wrapper for this resource. - SrsLazyGbMediaTcpConnWrapper* wrapper = dynamic_cast(gc_available_wrapper()); + SrsLazyGbMediaTcpConnWrapper* wrapper = dynamic_cast(gc_creator_wrapper()); srs_assert(wrapper); // It MUST never be NULL, because this method is in the cycle of coroutine. // Find exists session for register, might be created by another object and still alive. diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index b74f784f3..7479d638a 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -1348,7 +1348,7 @@ srs_error_t SrsServerAdapter::run(SrsWaitGroup* wg) } #endif - SrsSweepGc* gc = dynamic_cast(_srs_gc); + SrsLazySweepGc* gc = dynamic_cast(_srs_gc); if ((err = gc->start()) != srs_success) { return srs_error_wrap(err, "start gc"); } diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index f763b6840..800376c99 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -336,7 +336,7 @@ srs_error_t srs_global_initialize() #ifdef SRS_GB28181 _srs_gb_manager = new SrsResourceManager("GB", true); #endif - _srs_gc = new SrsSweepGc(); + _srs_gc = new SrsLazySweepGc(); // Initialize global pps, which depends on _srs_clock _srs_pps_ids = new SrsPps(); diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index eed246ebd..39b148fa6 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 83 +#define VERSION_REVISION 84 #endif diff --git a/trunk/src/protocol/srs_protocol_conn.cpp b/trunk/src/protocol/srs_protocol_conn.cpp index 01f2e878b..17cb9d77f 100644 --- a/trunk/src/protocol/srs_protocol_conn.cpp +++ b/trunk/src/protocol/srs_protocol_conn.cpp @@ -50,25 +50,14 @@ SrsLazyObject::~SrsLazyObject() { } -SrsLazyObject* SrsLazyObject::gc_use(ISrsResource* wrapper) +SrsLazyObject* SrsLazyObject::gc_use() { - srs_assert(wrapper); - if (std::find(gc_wrappers_.begin(), gc_wrappers_.end(), wrapper) == gc_wrappers_.end()) { - gc_wrappers_.push_back(wrapper); - } - gc_ref_++; return this; } -SrsLazyObject* SrsLazyObject::gc_dispose(ISrsResource* wrapper) +SrsLazyObject* SrsLazyObject::gc_dispose() { - srs_assert(wrapper); - vector::iterator it = std::find(gc_wrappers_.begin(), gc_wrappers_.end(), wrapper); - if (it != gc_wrappers_.end()) { - it = gc_wrappers_.erase(it); - } - gc_ref_--; return this; } @@ -88,11 +77,6 @@ ISrsResource* SrsLazyObject::gc_creator_wrapper() return gc_creator_wrapper_; } -ISrsResource* SrsLazyObject::gc_available_wrapper() -{ - return gc_wrappers_.empty() ? NULL : gc_wrappers_.front(); -} - ISrsLazyGc::ISrsLazyGc() { } diff --git a/trunk/src/protocol/srs_protocol_conn.hpp b/trunk/src/protocol/srs_protocol_conn.hpp index dca32d679..214339ec9 100644 --- a/trunk/src/protocol/srs_protocol_conn.hpp +++ b/trunk/src/protocol/srs_protocol_conn.hpp @@ -58,16 +58,14 @@ private: // The creator wrapper, which created this resource. Note that it might be disposed and the pointer is NULL, so be // careful and make sure to check it before use it. ISrsResource* gc_creator_wrapper_; - // All available wrappers. - std::vector gc_wrappers_; public: SrsLazyObject(); virtual ~SrsLazyObject(); public: // For wrapper to use this resource. - virtual SrsLazyObject* gc_use(ISrsResource* wrapper); + virtual SrsLazyObject* gc_use(); // For wrapper to dispose this resource. - virtual SrsLazyObject* gc_dispose(ISrsResource* wrapper); + virtual SrsLazyObject* gc_dispose(); // The current reference count of resource. virtual int32_t gc_ref(); public: @@ -75,9 +73,6 @@ public: virtual void gc_set_creator_wrapper(ISrsResource* wrapper); // Get the first available wrapper. NULL if the creator wrapper disposed. virtual ISrsResource* gc_creator_wrapper(); - // Get the first available wrapper. NULL if all wrappers disposed. - // It should be equal to the gc_creator_wrapper() if creator wrapper not disposed. - virtual ISrsResource* gc_available_wrapper(); }; // The lazy-sweep GC, wait for a long time to dispose resource even when resource is disposable.