修复析构中调用getOwnerPoller抛异常导致崩溃的bug

This commit is contained in:
renlu 2022-11-28 16:47:21 +08:00
parent 64ee0bcaf2
commit 99e420d784
3 changed files with 41 additions and 16 deletions

View File

@ -344,7 +344,12 @@ Value makeMediaSourceJson(MediaSource &media){
} }
//getLossRate有线程安全问题使用getMediaInfo接口才能获取丢包率getMediaList接口将忽略丢包率 //getLossRate有线程安全问题使用getMediaInfo接口才能获取丢包率getMediaList接口将忽略丢包率
auto current_thread = media.getOwnerPoller()->isCurrentThread(); //auto current_thread = media.getOwnerPoller()->isCurrentThread();
auto current_thread = false;
try {
current_thread = media.getOwnerPoller()->isCurrentThread();
} catch (...) {
}
float last_loss = -1; float last_loss = -1;
for(auto &track : media.getTracks(false)){ for(auto &track : media.getTracks(false)){
Value obj; Value obj;

View File

@ -124,7 +124,7 @@ MediaSource::MediaSource(const string &schema, const string &vhost, const string
_app = app; _app = app;
_stream_id = stream_id; _stream_id = stream_id;
_create_stamp = time(NULL); _create_stamp = time(NULL);
_default_poller = EventPollerPool::Instance().getPoller(); //_default_poller = EventPollerPool::Instance().getPoller();
} }
MediaSource::~MediaSource() { MediaSource::~MediaSource() {
@ -289,23 +289,43 @@ toolkit::EventPoller::Ptr MediaSource::getOwnerPoller() {
if (listener) { if (listener) {
return listener->getOwnerPoller(*this); return listener->getOwnerPoller(*this);
} }
WarnL << toolkit::demangle(typeid(*this).name()) + "::getOwnerPoller failed, now return default poller: " + getUrl(); // WarnL << toolkit::demangle(typeid(*this).name()) + "::getOwnerPoller failed, now return default poller: " + getUrl();
return _default_poller; //return _default_poller;
throw std::runtime_error(toolkit::demangle(typeid(*this).name()) + "::getOwnerPoller failed: " + getUrl());
} }
void MediaSource::onReaderChanged(int size) { void MediaSource::onReaderChanged(int size) {
//weak_ptr<MediaSource> weak_self = shared_from_this();
//auto listener = _listener.lock();
//if (!listener) {
// return;
//}
//getOwnerPoller()->async([weak_self, size, listener]() {
// auto strong_self = weak_self.lock();
// if (!strong_self) {
// return;
// }
// listener->onReaderChanged(*strong_self, size);
//});
try {
weak_ptr<MediaSource> weak_self = shared_from_this(); weak_ptr<MediaSource> weak_self = shared_from_this();
auto listener = _listener.lock(); getOwnerPoller()->async([weak_self, size]() {
if (!listener) {
return;
}
getOwnerPoller()->async([weak_self, size, listener]() {
auto strong_self = weak_self.lock(); auto strong_self = weak_self.lock();
if (!strong_self) { if (!strong_self) {
return; return;
} }
auto listener = strong_self->_listener.lock();
if (listener) {
listener->onReaderChanged(*strong_self, size); listener->onReaderChanged(*strong_self, size);
}
}); });
} catch (MediaSourceEvent::NotImplemented &ex) {
// 未实现接口,应该打印异常
WarnL << ex.what();
} catch (...) {
// getOwnerPoller()接口抛异常机制应该只对外不对内
// 所以listener已经销毁导致获取归属线程失败的异常直接忽略
}
} }
bool MediaSource::setupRecord(Recorder::type type, bool start, const string &custom_path, size_t max_second){ bool MediaSource::setupRecord(Recorder::type type, bool start, const string &custom_path, size_t max_second){

View File

@ -406,7 +406,7 @@ private:
std::string _app; std::string _app;
std::string _stream_id; std::string _stream_id;
std::weak_ptr<MediaSourceEvent> _listener; std::weak_ptr<MediaSourceEvent> _listener;
toolkit::EventPoller::Ptr _default_poller; //toolkit::EventPoller::Ptr _default_poller;
// 对象个数统计 // 对象个数统计
toolkit::ObjectStatistic<MediaSource> _statistic; toolkit::ObjectStatistic<MediaSource> _statistic;
}; };