From 0c91fa6bedc6c3c5b6d8125e276cc0e3640bc82e Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 16 Apr 2014 15:58:06 +0800 Subject: [PATCH] fix dvr mem leak, free msg when not use it. --- trunk/src/app/srs_app_dvr.cpp | 3 +++ trunk/src/app/srs_app_encoder.cpp | 1 + trunk/src/app/srs_app_thread.cpp | 12 ++++++++++++ trunk/src/app/srs_app_thread.hpp | 7 +++++++ trunk/src/core/srs_core.hpp | 4 ++++ 5 files changed, 27 insertions(+) diff --git a/trunk/src/app/srs_app_dvr.cpp b/trunk/src/app/srs_app_dvr.cpp index 8a9e0ae49..642a36d47 100644 --- a/trunk/src/app/srs_app_dvr.cpp +++ b/trunk/src/app/srs_app_dvr.cpp @@ -26,6 +26,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifdef SRS_AUTO_DVR #include +#include SrsDvr::SrsDvr(SrsSource* source) { @@ -55,12 +56,14 @@ int SrsDvr::on_meta_data(SrsAmf0Object* metadata) int SrsDvr::on_audio(SrsSharedPtrMessage* audio) { int ret = ERROR_SUCCESS; + srs_freep(audio); return ret; } int SrsDvr::on_video(SrsSharedPtrMessage* video) { int ret = ERROR_SUCCESS; + srs_freep(video); return ret; } diff --git a/trunk/src/app/srs_app_encoder.cpp b/trunk/src/app/srs_app_encoder.cpp index f4848aacf..08f3abaa1 100644 --- a/trunk/src/app/srs_app_encoder.cpp +++ b/trunk/src/app/srs_app_encoder.cpp @@ -79,6 +79,7 @@ int SrsEncoder::on_publish(SrsRequest* req) srs_error("st_thread_create failed. ret=%d", ret); return ret; } + srs_trace("encoder thread cid=%d, current_cid=%d", pthread->cid(), _srs_context->get_id()); return ret; } diff --git a/trunk/src/app/srs_app_thread.cpp b/trunk/src/app/srs_app_thread.cpp index e635324c8..7b7f96bfe 100644 --- a/trunk/src/app/srs_app_thread.cpp +++ b/trunk/src/app/srs_app_thread.cpp @@ -61,6 +61,7 @@ SrsThread::SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_us) tid = NULL; loop = false; + _cid = -1; } SrsThread::~SrsThread() @@ -68,6 +69,11 @@ SrsThread::~SrsThread() stop(); } +int SrsThread::cid() +{ + return _cid; +} + int SrsThread::start() { int ret = ERROR_SUCCESS; @@ -83,6 +89,11 @@ int SrsThread::start() return ret; } + // wait for cid to ready, for parent thread to get the cid. + while (_cid < 0) { + st_usleep(10 * SRS_TIME_MILLISECONDS); + } + return ret; } @@ -111,6 +122,7 @@ void SrsThread::thread_cycle() { int ret = ERROR_SUCCESS; + _cid = _srs_context->get_id(); srs_assert(handler); _srs_context->generate_id(); diff --git a/trunk/src/app/srs_app_thread.hpp b/trunk/src/app/srs_app_thread.hpp index 8b80cfe1f..676a50a6c 100644 --- a/trunk/src/app/srs_app_thread.hpp +++ b/trunk/src/app/srs_app_thread.hpp @@ -84,6 +84,7 @@ class SrsThread { private: st_thread_t tid; + int _cid; bool loop; private: ISrsThreadHandler* handler; @@ -97,6 +98,12 @@ public: SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_us); virtual ~SrsThread(); public: + /** + * get the context id. @see: ISrsThreadContext.get_id(). + * used for parent thread to get the id. + * @remark when start thread, parent thread will block and wait for this id ready. + */ + virtual int cid(); /** * start the thread, invoke the cycle of handler util * user stop the thread. diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index c0c4891a4..3fdf8ec3b 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -124,4 +124,8 @@ extern bool srs_is_little_endian(); className(const className&); \ className& operator= (const className&) +// const time for st to convert to us +#define SRS_TIME_MILLISECONDS 1000 +#define SRS_TIME_SECONDS 1000000 + #endif