mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #1601, flush async on_dvr/on_hls events before stop. 3.0.118
This commit is contained in:
parent
304b92cc36
commit
5be69d290f
6 changed files with 49 additions and 20 deletions
|
@ -40,6 +40,7 @@ SrsAsyncCallWorker::SrsAsyncCallWorker()
|
|||
{
|
||||
trd = new SrsDummyCoroutine();
|
||||
wait = srs_cond_new();
|
||||
lock = srs_mutex_new();
|
||||
}
|
||||
|
||||
SrsAsyncCallWorker::~SrsAsyncCallWorker()
|
||||
|
@ -54,6 +55,7 @@ SrsAsyncCallWorker::~SrsAsyncCallWorker()
|
|||
tasks.clear();
|
||||
|
||||
srs_cond_destroy(wait);
|
||||
srs_mutex_destroy(lock);
|
||||
}
|
||||
|
||||
srs_error_t SrsAsyncCallWorker::execute(ISrsAsyncCallTask* t)
|
||||
|
@ -87,6 +89,7 @@ srs_error_t SrsAsyncCallWorker::start()
|
|||
|
||||
void SrsAsyncCallWorker::stop()
|
||||
{
|
||||
flush_tasks();
|
||||
srs_cond_signal(wait);
|
||||
trd->stop();
|
||||
}
|
||||
|
@ -103,23 +106,40 @@ srs_error_t SrsAsyncCallWorker::cycle()
|
|||
if (tasks.empty()) {
|
||||
srs_cond_wait(wait);
|
||||
}
|
||||
|
||||
std::vector<ISrsAsyncCallTask*> copy = tasks;
|
||||
tasks.clear();
|
||||
|
||||
std::vector<ISrsAsyncCallTask*>::iterator it;
|
||||
for (it = copy.begin(); it != copy.end(); ++it) {
|
||||
ISrsAsyncCallTask* task = *it;
|
||||
|
||||
if ((err = task->call()) != srs_success) {
|
||||
srs_warn("ignore task failed %s", srs_error_desc(err).c_str());
|
||||
srs_freep(err);
|
||||
}
|
||||
srs_freep(task);
|
||||
}
|
||||
|
||||
flush_tasks();
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void SrsAsyncCallWorker::flush_tasks()
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
// Avoid the async call blocking other coroutines.
|
||||
std::vector<ISrsAsyncCallTask*> copy;
|
||||
if (true) {
|
||||
SrsLocker(lock);
|
||||
|
||||
if (tasks.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
copy = tasks;
|
||||
tasks.clear();
|
||||
}
|
||||
|
||||
std::vector<ISrsAsyncCallTask*>::iterator it;
|
||||
for (it = copy.begin(); it != copy.end(); ++it) {
|
||||
ISrsAsyncCallTask* task = *it;
|
||||
|
||||
if ((err = task->call()) != srs_success) {
|
||||
srs_warn("ignore task failed %s", srs_error_desc(err).c_str());
|
||||
srs_freep(err);
|
||||
}
|
||||
srs_freep(task);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue