修复死锁问题:#486

This commit is contained in:
xiongziliang 2020-09-20 10:43:25 +08:00
parent 07ef417250
commit 100af97d51
1 changed files with 27 additions and 18 deletions

View File

@ -72,6 +72,8 @@ void RtpSelector::createTimer() {
} }
void RtpSelector::delProcess(const string &stream_id,const RtpProcess *ptr) { void RtpSelector::delProcess(const string &stream_id,const RtpProcess *ptr) {
RtpProcess::Ptr process;
{
lock_guard<decltype(_mtx_map)> lck(_mtx_map); lock_guard<decltype(_mtx_map)> lck(_mtx_map);
auto it = _map_rtp_process.find(stream_id); auto it = _map_rtp_process.find(stream_id);
if (it == _map_rtp_process.end()) { if (it == _map_rtp_process.end()) {
@ -80,12 +82,15 @@ void RtpSelector::delProcess(const string &stream_id,const RtpProcess *ptr) {
if (it->second->getProcess().get() != ptr) { if (it->second->getProcess().get() != ptr) {
return; return;
} }
auto process = it->second->getProcess(); process = it->second->getProcess();
_map_rtp_process.erase(it); _map_rtp_process.erase(it);
}
process->onDetach(); process->onDetach();
} }
void RtpSelector::onManager() { void RtpSelector::onManager() {
List<RtpProcess::Ptr> clear_list;
{
lock_guard<decltype(_mtx_map)> lck(_mtx_map); lock_guard<decltype(_mtx_map)> lck(_mtx_map);
for (auto it = _map_rtp_process.begin(); it != _map_rtp_process.end();) { for (auto it = _map_rtp_process.begin(); it != _map_rtp_process.end();) {
if (it->second->getProcess()->alive()) { if (it->second->getProcess()->alive()) {
@ -93,10 +98,14 @@ void RtpSelector::onManager() {
continue; continue;
} }
WarnL << "RtpProcess timeout:" << it->first; WarnL << "RtpProcess timeout:" << it->first;
auto process = it->second->getProcess(); clear_list.emplace_back(it->second->getProcess());
it = _map_rtp_process.erase(it); it = _map_rtp_process.erase(it);
process->onDetach();
} }
}
clear_list.for_each([](const RtpProcess::Ptr &process) {
process->onDetach();
});
} }
RtpSelector::RtpSelector() { RtpSelector::RtpSelector() {