修复死锁问题:#486
This commit is contained in:
parent
07ef417250
commit
100af97d51
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue