diff --git a/trunk/src/app/srs_app_st.cpp b/trunk/src/app/srs_app_st.cpp index 4d8e1b37f..a6e8bd6bb 100755 --- a/trunk/src/app/srs_app_st.cpp +++ b/trunk/src/app/srs_app_st.cpp @@ -127,8 +127,6 @@ namespace internal return; } - loop = false; - dispose(); _cid = -1; @@ -152,6 +150,9 @@ namespace internal return; } + // notify the cycle to stop loop. + loop = false; + // the interrupt will cause the socket to read/write error, // which will terminate the cycle thread. st_thread_interrupt(tid); @@ -186,9 +187,11 @@ namespace internal { int ret = ERROR_SUCCESS; + // TODO: FIXME: it's better for user to specifies the cid, + // because sometimes we need to merge cid, for example, + // the publish thread should use the same cid of connection. _srs_context->generate_id(); srs_info("thread %s cycle start", _name); - _cid = _srs_context->get_id(); srs_assert(handler); @@ -238,8 +241,9 @@ namespace internal // readly terminated now. really_terminated = true; - handler->on_thread_stop(); srs_info("thread %s cycle finished", _name); + // @remark in this callback, user may delete this, so never use this->xxx anymore. + handler->on_thread_stop(); } void* SrsThread::thread_fun(void* arg) @@ -249,7 +253,7 @@ namespace internal obj->thread_cycle(); - // for valgrind to detect. + // delete cid for valgrind to detect memory leak. SrsThreadContext* ctx = dynamic_cast(_srs_context); if (ctx) { ctx->clear_cid();