-
Notifications
You must be signed in to change notification settings - Fork 374
Description
一、TaskScheduler::HandleTriggerEvent()应该加锁,多线程下有内存泄漏风险
二、RtpConnection::SendRtpPacket(MediaChannelId channel_id, RtpPacket pkt):----客户端关闭的时候如果有音视频数据要发送时候会引发死锁 ok √
原因如下:
RtpConnection::SendRtpPacket中如果通过AddTriggerEvent发送数据,步骤如下:
...
1、TaskScheduler::AddTriggerEvent lock-->unlock
2、TaskScheduler::HandleTriggerEvent lock
3、执行RtpConnection::SendRtpPacket中设置的回调函数
4、调用TcpConnection::Send函数发送数据,lock TcpConnection::mutex_
客户端关闭流程如下:
1、epoll触发TcpConnection::HandleClose()函数,lock TcpConnection::mutex_
2、TcpConnection调用回调函数disconnect_cb_和close_cb_ disconnect_cb_由TcpServer注册
3、TcpServer注册的回调函数通过AddTriggerEvent调用TcpServer::RemoveConnection删除客户端缓存,TaskScheduler::AddTriggerEvent lock
问题出现了:
发送数据时候:TaskScheduler lock-->TcpConnection lock
客户端关闭时候:TcpConnection lock-->TaskScheduler lock
出现死锁
解决方式:
1、RtpConnection::SendRtpPacket中不使用AddTriggerEvent
2、TcpServer构造函数中不使用AddTriggerEvent
三、TimerQueue::HandleTimerEvent():如果超时,定时器队列中的数据没有被删除,导致内存泄露
四、RtspConnection::HandleCmdSetup()中rtcp_channels_[channel_id]->SetReadCallback(rtcp_fd, this { this->HandleRtcp(rtcp_fd); });也有问题
此时rtcp_fd是UDP,而HandleRtcp中是对客户端的tcp socket接受数据,实际并没有处理RTCP数据,因此这里不影响正常运行,可忽略。