mirror of
https://gitee.com/xia-chu/ZLMediaKit.git
synced 2026-05-23 01:57:50 +08:00
修复析构中调用getOwnerPoller抛异常导致崩溃的bug
This commit is contained in:
parent
64ee0bcaf2
commit
99e420d784
@ -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;
|
||||||
|
|||||||
@ -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){
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user