修复死锁问题:#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,31 +72,40 @@ void RtpSelector::createTimer() {
} }
void RtpSelector::delProcess(const string &stream_id,const RtpProcess *ptr) { void RtpSelector::delProcess(const string &stream_id,const RtpProcess *ptr) {
lock_guard<decltype(_mtx_map)> lck(_mtx_map); RtpProcess::Ptr process;
auto it = _map_rtp_process.find(stream_id); {
if (it == _map_rtp_process.end()) { lock_guard<decltype(_mtx_map)> lck(_mtx_map);
return; auto it = _map_rtp_process.find(stream_id);
if (it == _map_rtp_process.end()) {
return;
}
if (it->second->getProcess().get() != ptr) {
return;
}
process = it->second->getProcess();
_map_rtp_process.erase(it);
} }
if (it->second->getProcess().get() != ptr) {
return;
}
auto process = it->second->getProcess();
_map_rtp_process.erase(it);
process->onDetach(); process->onDetach();
} }
void RtpSelector::onManager() { void RtpSelector::onManager() {
lock_guard<decltype(_mtx_map)> lck(_mtx_map); List<RtpProcess::Ptr> clear_list;
for (auto it = _map_rtp_process.begin(); it != _map_rtp_process.end();) { {
if (it->second->getProcess()->alive()) { lock_guard<decltype(_mtx_map)> lck(_mtx_map);
++it; for (auto it = _map_rtp_process.begin(); it != _map_rtp_process.end();) {
continue; if (it->second->getProcess()->alive()) {
++it;
continue;
}
WarnL << "RtpProcess timeout:" << it->first;
clear_list.emplace_back(it->second->getProcess());
it = _map_rtp_process.erase(it);
} }
WarnL << "RtpProcess timeout:" << it->first;
auto process = it->second->getProcess();
it = _map_rtp_process.erase(it);
process->onDetach();
} }
clear_list.for_each([](const RtpProcess::Ptr &process) {
process->onDetach();
});
} }
RtpSelector::RtpSelector() { RtpSelector::RtpSelector() {