Commit 51c7985e authored by fgorski@chromium.org's avatar fgorski@chromium.org

Revert 272540 "Revert 272504 "Destroy all rtc peer connection ha..."

The original change was not a root cause of the problem.
sheriffs are looking into other possible causes.

Meanwhile I am getting the change back in.

> Revert 272504 "Destroy all rtc peer connection handlers before s..."
> 
> On Win7 Tests (dbg)(2) these tests
> 
> FocusElementCallsFocusedNodeChanged
> GetCompositionCharacterBoundsTest
> MessageOrderInDidChangeSelection
> OnExtendSelectionAndDelete
> OnImeTypeChanged
> OnSetTextDirection
> SendCandidateWindowEvents
> SetEditableSelectionAndComposition
> 
> fail with timeout.
> http://build.chromium.org/p/chromium.win/builders/Win7%20Tests%20%28dbg%29%282%29/builds/21101/steps/content_browsertests/logs/stdio
> 
> > 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
> 
> TBR=jochen@chromium.org
> 
> Review URL: https://codereview.chromium.org/296213007

TBR=vasilii@chromium.org,jochen@chromium.org

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@272604 0039d316-1c4b-4281-b951-d872f2087c98
parent 911a934c
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/debug/trace_event.h" #include "base/debug/trace_event.h"
#include "base/lazy_instance.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/metrics/histogram.h" #include "base/metrics/histogram.h"
...@@ -317,6 +318,8 @@ void LocalRTCStatsResponse::addStatistic(size_t report, ...@@ -317,6 +318,8 @@ void LocalRTCStatsResponse::addStatistic(size_t report,
impl_.addStatistic(report, name, value); impl_.addStatistic(report, name, value);
} }
namespace {
class PeerConnectionUMAObserver : public webrtc::UMAObserver { class PeerConnectionUMAObserver : public webrtc::UMAObserver {
public: public:
PeerConnectionUMAObserver() {} PeerConnectionUMAObserver() {}
...@@ -351,6 +354,11 @@ class PeerConnectionUMAObserver : public webrtc::UMAObserver { ...@@ -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( RTCPeerConnectionHandler::RTCPeerConnectionHandler(
blink::WebRTCPeerConnectionHandlerClient* client, blink::WebRTCPeerConnectionHandlerClient* client,
PeerConnectionDependencyFactory* dependency_factory) PeerConnectionDependencyFactory* dependency_factory)
...@@ -359,9 +367,11 @@ RTCPeerConnectionHandler::RTCPeerConnectionHandler( ...@@ -359,9 +367,11 @@ RTCPeerConnectionHandler::RTCPeerConnectionHandler(
frame_(NULL), frame_(NULL),
peer_connection_tracker_(NULL), peer_connection_tracker_(NULL),
num_data_channels_created_(0) { num_data_channels_created_(0) {
g_peer_connection_handlers.Get().insert(this);
} }
RTCPeerConnectionHandler::~RTCPeerConnectionHandler() { RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
g_peer_connection_handlers.Get().erase(this);
if (peer_connection_tracker_) if (peer_connection_tracker_)
peer_connection_tracker_->UnregisterPeerConnection(this); peer_connection_tracker_->UnregisterPeerConnection(this);
STLDeleteValues(&remote_streams_); STLDeleteValues(&remote_streams_);
...@@ -370,6 +380,18 @@ RTCPeerConnectionHandler::~RTCPeerConnectionHandler() { ...@@ -370,6 +380,18 @@ RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
"WebRTC.NumDataChannelsPerPeerConnection", num_data_channels_created_); "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) { void RTCPeerConnectionHandler::associateWithFrame(blink::WebFrame* frame) {
DCHECK(frame); DCHECK(frame);
frame_ = frame; frame_ = frame;
......
...@@ -88,6 +88,9 @@ class CONTENT_EXPORT RTCPeerConnectionHandler ...@@ -88,6 +88,9 @@ class CONTENT_EXPORT RTCPeerConnectionHandler
PeerConnectionDependencyFactory* dependency_factory); PeerConnectionDependencyFactory* dependency_factory);
virtual ~RTCPeerConnectionHandler(); virtual ~RTCPeerConnectionHandler();
// Destroy all existing RTCPeerConnectionHandler objects.
static void DestructAllHandlers();
void associateWithFrame(blink::WebFrame* frame); void associateWithFrame(blink::WebFrame* frame);
// Initialize method only used for unit test. // Initialize method only used for unit test.
......
...@@ -79,6 +79,7 @@ ...@@ -79,6 +79,7 @@
#include "content/renderer/media/midi_message_filter.h" #include "content/renderer/media/midi_message_filter.h"
#include "content/renderer/media/peer_connection_tracker.h" #include "content/renderer/media/peer_connection_tracker.h"
#include "content/renderer/media/renderer_gpu_video_accelerator_factories.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_impl_manager.h"
#include "content/renderer/media/video_capture_message_filter.h" #include "content/renderer/media/video_capture_message_filter.h"
#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
...@@ -534,6 +535,8 @@ void RenderThreadImpl::Shutdown() { ...@@ -534,6 +535,8 @@ void RenderThreadImpl::Shutdown() {
audio_message_filter_ = NULL; audio_message_filter_ = NULL;
#if defined(ENABLE_WEBRTC) #if defined(ENABLE_WEBRTC)
RTCPeerConnectionHandler::DestructAllHandlers();
peer_connection_factory_.reset(); peer_connection_factory_.reset();
#endif #endif
RemoveFilter(vc_manager_->video_capture_message_filter()); 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