Commit 25c44b23 authored by jochen@chromium.org's avatar jochen@chromium.org

Destroy all rtc peer connection handlers before shutting down blink

The connection handlers will otherwise continue to call into blink which
is bound to crash after it was shut down.

BUG=337572
R=perkj@chromium.org,adamk@chromium.org

Review URL: https://codereview.chromium.org/292163002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@272504 0039d316-1c4b-4281-b951-d872f2087c98
parent ed295ecf
......@@ -10,6 +10,7 @@
#include "base/command_line.h"
#include "base/debug/trace_event.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/histogram.h"
......@@ -317,6 +318,8 @@ void LocalRTCStatsResponse::addStatistic(size_t report,
impl_.addStatistic(report, name, value);
}
namespace {
class PeerConnectionUMAObserver : public webrtc::UMAObserver {
public:
PeerConnectionUMAObserver() {}
......@@ -351,6 +354,11 @@ class PeerConnectionUMAObserver : public webrtc::UMAObserver {
}
};
base::LazyInstance<std::set<RTCPeerConnectionHandler*> >::Leaky
g_peer_connection_handlers = LAZY_INSTANCE_INITIALIZER;
} // namespace
RTCPeerConnectionHandler::RTCPeerConnectionHandler(
blink::WebRTCPeerConnectionHandlerClient* client,
PeerConnectionDependencyFactory* dependency_factory)
......@@ -359,9 +367,11 @@ RTCPeerConnectionHandler::RTCPeerConnectionHandler(
frame_(NULL),
peer_connection_tracker_(NULL),
num_data_channels_created_(0) {
g_peer_connection_handlers.Get().insert(this);
}
RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
g_peer_connection_handlers.Get().erase(this);
if (peer_connection_tracker_)
peer_connection_tracker_->UnregisterPeerConnection(this);
STLDeleteValues(&remote_streams_);
......@@ -370,6 +380,18 @@ RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
"WebRTC.NumDataChannelsPerPeerConnection", num_data_channels_created_);
}
// static
void RTCPeerConnectionHandler::DestructAllHandlers() {
std::set<RTCPeerConnectionHandler*> handlers(
g_peer_connection_handlers.Get().begin(),
g_peer_connection_handlers.Get().end());
for (std::set<RTCPeerConnectionHandler*>::iterator handler = handlers.begin();
handler != handlers.end();
++handler) {
(*handler)->client_->releasePeerConnectionHandler();
}
}
void RTCPeerConnectionHandler::associateWithFrame(blink::WebFrame* frame) {
DCHECK(frame);
frame_ = frame;
......
......@@ -88,6 +88,9 @@ class CONTENT_EXPORT RTCPeerConnectionHandler
PeerConnectionDependencyFactory* dependency_factory);
virtual ~RTCPeerConnectionHandler();
// Destroy all existing RTCPeerConnectionHandler objects.
static void DestructAllHandlers();
void associateWithFrame(blink::WebFrame* frame);
// Initialize method only used for unit test.
......
......@@ -79,6 +79,7 @@
#include "content/renderer/media/midi_message_filter.h"
#include "content/renderer/media/peer_connection_tracker.h"
#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
#include "content/renderer/media/rtc_peer_connection_handler.h"
#include "content/renderer/media/video_capture_impl_manager.h"
#include "content/renderer/media/video_capture_message_filter.h"
#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
......@@ -534,6 +535,8 @@ void RenderThreadImpl::Shutdown() {
audio_message_filter_ = NULL;
#if defined(ENABLE_WEBRTC)
RTCPeerConnectionHandler::DestructAllHandlers();
peer_connection_factory_.reset();
#endif
RemoveFilter(vc_manager_->video_capture_message_filter());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment