winlin

refine thread stop

... ... @@ -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<SrsThreadContext*>(_srs_context);
if (ctx) {
ctx->clear_cid();
... ...