1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

ST: Print log when multiple thread stop one coroutine. (#1708)

This commit is contained in:
winlin 2021-11-15 09:35:23 +08:00
parent ff33940d90
commit 93964bb037
2 changed files with 14 additions and 0 deletions

View file

@ -125,6 +125,7 @@ SrsFastCoroutine::SrsFastCoroutine(string n, ISrsCoroutineHandler* h)
trd = NULL; trd = NULL;
trd_err = srs_success; trd_err = srs_success;
started = interrupted = disposed = cycle_done = false; started = interrupted = disposed = cycle_done = false;
stopping_ = false;
// 0 use default, default is 64K. // 0 use default, default is 64K.
stack_size = 0; stack_size = 0;
@ -138,6 +139,7 @@ SrsFastCoroutine::SrsFastCoroutine(string n, ISrsCoroutineHandler* h, SrsContext
trd = NULL; trd = NULL;
trd_err = srs_success; trd_err = srs_success;
started = interrupted = disposed = cycle_done = false; started = interrupted = disposed = cycle_done = false;
stopping_ = false;
// 0 use default, default is 64K. // 0 use default, default is 64K.
stack_size = 0; stack_size = 0;
@ -192,9 +194,14 @@ srs_error_t SrsFastCoroutine::start()
void SrsFastCoroutine::stop() void SrsFastCoroutine::stop()
{ {
if (disposed) { if (disposed) {
if (stopping_) {
srs_error("thread is stopping by %s", stopping_cid_.c_str());
srs_assert(!stopping_);
}
return; return;
} }
disposed = true; disposed = true;
stopping_ = true;
interrupt(); interrupt();
@ -225,6 +232,9 @@ void SrsFastCoroutine::stop()
if (trd_err == srs_success && !cycle_done) { if (trd_err == srs_success && !cycle_done) {
trd_err = srs_error_new(ERROR_THREAD_TERMINATED, "terminated"); trd_err = srs_error_new(ERROR_THREAD_TERMINATED, "terminated");
} }
// Now, we'are stopped.
stopping_ = false;
return; return;
} }

View file

@ -163,6 +163,10 @@ private:
bool disposed; bool disposed;
// Cycle done, no need to interrupt it. // Cycle done, no need to interrupt it.
bool cycle_done; bool cycle_done;
private:
// Sub state in disposed, we need to wait for thread to quit.
bool stopping_;
SrsContextId stopping_cid_;
public: public:
SrsFastCoroutine(std::string n, ISrsCoroutineHandler* h); SrsFastCoroutine(std::string n, ISrsCoroutineHandler* h);
SrsFastCoroutine(std::string n, ISrsCoroutineHandler* h, SrsContextId cid); SrsFastCoroutine(std::string n, ISrsCoroutineHandler* h, SrsContextId cid);