Commit 100af97d by xiongziliang

修复死锁问题:#486

parent 07ef4172
...@@ -72,31 +72,40 @@ void RtpSelector::createTimer() { ...@@ -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()) {
if (it->second->getProcess().get() != ptr) { return;
return; }
if (it->second->getProcess().get() != ptr) {
return;
}
process = it->second->getProcess();
_map_rtp_process.erase(it);
} }
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() {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论