diff options
6 files changed, 56 insertions, 62 deletions
diff --git a/chrome/browser/automation/automation_resource_message_filter.cc b/chrome/browser/automation/automation_resource_message_filter.cc index c06eb66..eb3edf3 100644 --- a/chrome/browser/automation/automation_resource_message_filter.cc +++ b/chrome/browser/automation/automation_resource_message_filter.cc @@ -5,7 +5,6 @@ #include "chrome/browser/automation/automation_resource_message_filter.h" #include "base/histogram.h" -#include "base/message_loop.h" #include "base/path_service.h" #include "chrome/browser/automation/url_request_automation_job.h" #include "chrome/browser/net/url_request_failed_dns_job.h" @@ -14,11 +13,11 @@ #include "chrome/browser/net/url_request_slow_download_job.h" #include "chrome/browser/net/url_request_slow_http_job.h" #include "chrome/common/chrome_paths.h" +#include "chrome/browser/chrome_thread.h" #include "chrome/test/automation/automation_messages.h" #include "net/url_request/url_request_filter.h" -MessageLoop* AutomationResourceMessageFilter::io_loop_ = NULL; AutomationResourceMessageFilter::RenderViewMap AutomationResourceMessageFilter::filtered_render_views_; int AutomationResourceMessageFilter::unique_request_id_ = 1; @@ -35,7 +34,6 @@ AutomationResourceMessageFilter::~AutomationResourceMessageFilter() { void AutomationResourceMessageFilter::OnFilterAdded(IPC::Channel* channel) { DCHECK(channel_ == NULL); channel_ = channel; - io_loop_ = MessageLoop::current(); } // Called on the IPC thread: @@ -94,7 +92,7 @@ bool AutomationResourceMessageFilter::OnMessageReceived( // Called on the IPC thread: bool AutomationResourceMessageFilter::Send(IPC::Message* message) { // This has to be called on the IO thread. - DCHECK_EQ(io_loop_, MessageLoop::current()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); if (!channel_) { delete message; return false; @@ -110,7 +108,7 @@ bool AutomationResourceMessageFilter::RegisterRequest( return false; } - DCHECK_EQ(io_loop_, MessageLoop::current()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); DCHECK(request_map_.end() == request_map_.find(job->id())); request_map_[job->id()] = job; return true; @@ -118,7 +116,7 @@ bool AutomationResourceMessageFilter::RegisterRequest( void AutomationResourceMessageFilter::UnRegisterRequest( URLRequestAutomationJob* job) { - DCHECK_EQ(io_loop_, MessageLoop::current()); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); DCHECK(request_map_.find(job->id()) != request_map_.end()); request_map_.erase(job->id()); } @@ -131,19 +129,21 @@ bool AutomationResourceMessageFilter::RegisterRenderView( return false; } - DCHECK(io_loop_); - io_loop_->PostTask(FROM_HERE, NewRunnableFunction( - AutomationResourceMessageFilter::RegisterRenderViewInIOThread, - renderer_pid, renderer_id, tab_handle, filter)); + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableFunction( + AutomationResourceMessageFilter::RegisterRenderViewInIOThread, + renderer_pid, renderer_id, tab_handle, filter)); return true; } void AutomationResourceMessageFilter::UnRegisterRenderView( int renderer_pid, int renderer_id) { - DCHECK(io_loop_); - io_loop_->PostTask(FROM_HERE, NewRunnableFunction( - AutomationResourceMessageFilter::UnRegisterRenderViewInIOThread, - renderer_pid, renderer_id)); + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableFunction( + AutomationResourceMessageFilter::UnRegisterRenderViewInIOThread, + renderer_pid, renderer_id)); } void AutomationResourceMessageFilter::RegisterRenderViewInIOThread( diff --git a/chrome/browser/automation/automation_resource_message_filter.h b/chrome/browser/automation/automation_resource_message_filter.h index b209085..beb5fa8 100644 --- a/chrome/browser/automation/automation_resource_message_filter.h +++ b/chrome/browser/automation/automation_resource_message_filter.h @@ -13,7 +13,6 @@ #include "ipc/ipc_channel_proxy.h" class URLRequestAutomationJob; -class MessageLoop; // This class filters out incoming automation IPC messages for network // requests and processes them on the IPC thread. As a result, network @@ -98,7 +97,6 @@ class AutomationResourceMessageFilter // The channel associated with the automation connection. This pointer is not // owned by this class. IPC::Channel* channel_; - static MessageLoop* io_loop_; // A unique request id per process. static int unique_request_id_; diff --git a/chrome/browser/renderer_host/audio_renderer_host.cc b/chrome/browser/renderer_host/audio_renderer_host.cc index 041023b..0fb3fe8 100644 --- a/chrome/browser/renderer_host/audio_renderer_host.cc +++ b/chrome/browser/renderer_host/audio_renderer_host.cc @@ -22,10 +22,10 @@ #include "base/histogram.h" #include "base/lock.h" -#include "base/message_loop.h" #include "base/process.h" #include "base/shared_memory.h" #include "base/waitable_event.h" +#include "chrome/browser/chrome_thread.h" #include "chrome/browser/renderer_host/audio_renderer_host.h" #include "chrome/common/render_messages.h" #include "ipc/ipc_logging.h" @@ -331,14 +331,14 @@ void AudioRendererHost::IPCAudioSource::StartBuffering() { //----------------------------------------------------------------------------- // AudioRendererHost implementations. -AudioRendererHost::AudioRendererHost(MessageLoop* message_loop) +AudioRendererHost::AudioRendererHost() : process_id_(0), process_handle_(0), - ipc_sender_(NULL), - io_loop_(message_loop) { + ipc_sender_(NULL) { // Make sure we perform actual initialization operations in the thread where // this object should live. - io_loop_->PostTask(FROM_HERE, + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, NewRunnableMethod(this, &AudioRendererHost::OnInitialized)); } @@ -349,15 +349,16 @@ AudioRendererHost::~AudioRendererHost() { void AudioRendererHost::Destroy() { // Post a message to the thread where this object should live and do the // actual operations there. - io_loop_->PostTask( - FROM_HERE, NewRunnableMethod(this, &AudioRendererHost::OnDestroyed)); + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod(this, &AudioRendererHost::OnDestroyed)); } // Event received when IPC channel is connected to the renderer process. void AudioRendererHost::IPCChannelConnected(int process_id, base::ProcessHandle process_handle, IPC::Message::Sender* ipc_sender) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); process_id_ = process_id; process_handle_ = process_handle; ipc_sender_ = ipc_sender; @@ -365,7 +366,7 @@ void AudioRendererHost::IPCChannelConnected(int process_id, // Event received when IPC channel is closing. void AudioRendererHost::IPCChannelClosing() { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); ipc_sender_ = NULL; process_handle_ = 0; process_id_ = 0; @@ -411,7 +412,7 @@ bool AudioRendererHost::IsAudioRendererHostMessage( void AudioRendererHost::OnCreateStream( const IPC::Message& msg, int stream_id, const ViewHostMsg_Audio_CreateStream& params) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); DCHECK(Lookup(msg.routing_id(), stream_id) == NULL); IPCAudioSource* source = IPCAudioSource::CreateIPCAudioSource( @@ -438,7 +439,7 @@ void AudioRendererHost::OnCreateStream( } void AudioRendererHost::OnPlayStream(const IPC::Message& msg, int stream_id) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); if (source) { source->Play(); @@ -448,7 +449,7 @@ void AudioRendererHost::OnPlayStream(const IPC::Message& msg, int stream_id) { } void AudioRendererHost::OnPauseStream(const IPC::Message& msg, int stream_id) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); if (source) { source->Pause(); @@ -458,7 +459,7 @@ void AudioRendererHost::OnPauseStream(const IPC::Message& msg, int stream_id) { } void AudioRendererHost::OnCloseStream(const IPC::Message& msg, int stream_id) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); if (source) { DestroySource(source); @@ -467,7 +468,7 @@ void AudioRendererHost::OnCloseStream(const IPC::Message& msg, int stream_id) { void AudioRendererHost::OnSetVolume(const IPC::Message& msg, int stream_id, double left_channel, double right_channel) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); if (source) { source->SetVolume(left_channel, right_channel); @@ -477,7 +478,7 @@ void AudioRendererHost::OnSetVolume(const IPC::Message& msg, int stream_id, } void AudioRendererHost::OnGetVolume(const IPC::Message& msg, int stream_id) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); if (source) { source->GetVolume(); @@ -488,7 +489,7 @@ void AudioRendererHost::OnGetVolume(const IPC::Message& msg, int stream_id) { void AudioRendererHost::OnNotifyPacketReady(const IPC::Message& msg, int stream_id, size_t packet_size) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); IPCAudioSource* source = Lookup(msg.routing_id(), stream_id); if (source) { source->NotifyPacketReady(packet_size); @@ -498,14 +499,14 @@ void AudioRendererHost::OnNotifyPacketReady(const IPC::Message& msg, } void AudioRendererHost::OnInitialized() { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); // Increase the ref count of this object so it is active until we do // Release(). AddRef(); } void AudioRendererHost::OnDestroyed() { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); ipc_sender_ = NULL; process_handle_ = 0; process_id_ = 0; @@ -515,14 +516,14 @@ void AudioRendererHost::OnDestroyed() { } void AudioRendererHost::OnSend(IPC::Message* message) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); if (ipc_sender_) { ipc_sender_->Send(message); } } void AudioRendererHost::OnDestroySource(IPCAudioSource* source) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); if (source) { sources_.erase(SourceID(source->route_id(), source->stream_id())); source->Close(); @@ -531,7 +532,7 @@ void AudioRendererHost::OnDestroySource(IPCAudioSource* source) { } void AudioRendererHost::DestroyAllSources() { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); std::vector<IPCAudioSource*> sources; for (SourceMap::iterator i = sources_.begin(); i != sources_.end(); ++i) { sources.push_back(i->second); @@ -544,7 +545,7 @@ void AudioRendererHost::DestroyAllSources() { AudioRendererHost::IPCAudioSource* AudioRendererHost::Lookup(int route_id, int stream_id) { - DCHECK(MessageLoop::current() == io_loop_); + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); SourceMap::iterator i = sources_.find(SourceID(route_id, stream_id)); if (i != sources_.end()) return i->second; @@ -552,13 +553,11 @@ AudioRendererHost::IPCAudioSource* AudioRendererHost::Lookup(int route_id, } void AudioRendererHost::Send(IPC::Message* message) { - if (MessageLoop::current() == io_loop_) { + if (ChromeThread::CurrentlyOn(ChromeThread::IO)) { OnSend(message); } else { - // TODO(hclam): make sure it's always safe to post a task to IO loop. - // It is possible that IO message loop is destroyed but there's still some - // dangling audio hardware threads that try to call this method. - io_loop_->PostTask(FROM_HERE, + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, NewRunnableMethod(this, &AudioRendererHost::OnSend, message)); } } @@ -572,13 +571,11 @@ void AudioRendererHost::SendErrorMessage(int32 render_view_id, } void AudioRendererHost::DestroySource(IPCAudioSource* source) { - if (MessageLoop::current() == io_loop_) { + if (ChromeThread::CurrentlyOn(ChromeThread::IO)) { OnDestroySource(source); } else { - // TODO(hclam): make sure it's always safe to post a task to IO loop. - // It is possible that IO message loop is destroyed but there's still some - // dangling audio hardware threads that try to call this method. - io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, &AudioRendererHost::OnDestroySource, source)); + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod(this, &AudioRendererHost::OnDestroySource, source)); } } diff --git a/chrome/browser/renderer_host/audio_renderer_host.h b/chrome/browser/renderer_host/audio_renderer_host.h index a540c14..1a3b6e5 100644 --- a/chrome/browser/renderer_host/audio_renderer_host.h +++ b/chrome/browser/renderer_host/audio_renderer_host.h @@ -80,7 +80,6 @@ #include "testing/gtest/include/gtest/gtest_prod.h" class AudioManager; -class MessageLoop; struct ViewHostMsg_Audio_CreateStream; class AudioRendererHost : public base::RefCountedThreadSafe<AudioRendererHost> { @@ -88,7 +87,7 @@ class AudioRendererHost : public base::RefCountedThreadSafe<AudioRendererHost> { class IPCAudioSource; public: // Called from UI thread from the owner of this object. - explicit AudioRendererHost(MessageLoop* message_loop); + AudioRendererHost(); // Destruction can happen on either UI thread or IO thread, but at destruction // all associated sources are destroyed and streams are closed. @@ -340,8 +339,6 @@ class AudioRendererHost : public base::RefCountedThreadSafe<AudioRendererHost> { // and stream id. Returns NULL if not found. IPCAudioSource* Lookup(int render_view_id, int stream_id); - MessageLoop* io_loop() { return io_loop_; } - int process_id_; base::ProcessHandle process_handle_; IPC::Message::Sender* ipc_sender_; @@ -351,8 +348,6 @@ class AudioRendererHost : public base::RefCountedThreadSafe<AudioRendererHost> { typedef std::map<SourceID, IPCAudioSource*> SourceMap; SourceMap sources_; - MessageLoop* io_loop_; - DISALLOW_COPY_AND_ASSIGN(AudioRendererHost); }; diff --git a/chrome/browser/renderer_host/audio_renderer_host_unittest.cc b/chrome/browser/renderer_host/audio_renderer_host_unittest.cc index 5418331..c904a70 100644 --- a/chrome/browser/renderer_host/audio_renderer_host_unittest.cc +++ b/chrome/browser/renderer_host/audio_renderer_host_unittest.cc @@ -5,6 +5,7 @@ #include "base/message_loop.h" #include "base/process_util.h" #include "base/scoped_ptr.h" +#include "chrome/browser/chrome_thread.h" #include "chrome/browser/renderer_host/audio_renderer_host.h" #include "chrome/common/render_messages.h" #include "testing/gmock/include/gmock/gmock.h" @@ -29,8 +30,8 @@ const int kPacketSize = 16384; class MockAudioRendererHost : public AudioRendererHost { public: - MockAudioRendererHost(MessageLoop* loop) - : AudioRendererHost(loop) { + MockAudioRendererHost() + : AudioRendererHost() { } virtual ~MockAudioRendererHost() { @@ -120,7 +121,8 @@ class AudioRendererHostTest : public testing::Test { virtual void SetUp() { // Create a message loop so AudioRendererHost can use it. message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); - host_ = new MockAudioRendererHost(message_loop_.get()); + io_thread_.reset(new ChromeThread(ChromeThread::IO, message_loop_.get())); + host_ = new MockAudioRendererHost(); } virtual void TearDown() { @@ -128,11 +130,13 @@ class AudioRendererHostTest : public testing::Test { // message_loop_. host_->Destroy(); + // Release the reference to the mock object. + host_ = NULL; + // We need to continue running message_loop_ to complete all destructions. message_loop_->RunAllPending(); - // Release the reference to the mock object. - host_ = NULL; + io_thread_.reset(); } AudioRendererHost::IPCAudioSource* CreateAudioStream( @@ -180,6 +184,7 @@ class AudioRendererHostTest : public testing::Test { scoped_ptr<MessageLoop> message_loop_; private: + scoped_ptr<ChromeThread> io_thread_; DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); }; diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc index 076b803..2d58f8b 100644 --- a/chrome/browser/renderer_host/browser_render_process_host.cc +++ b/chrome/browser/renderer_host/browser_render_process_host.cc @@ -253,8 +253,7 @@ bool BrowserRenderProcessHost::Init(bool is_extensions_process) { base::Thread* io_thread = g_browser_process->io_thread(); // Construct the AudioRendererHost with the IO thread. - audio_renderer_host_ = - new AudioRendererHost(io_thread->message_loop()); + audio_renderer_host_ = new AudioRendererHost(); scoped_refptr<ResourceMessageFilter> resource_message_filter = new ResourceMessageFilter(g_browser_process->resource_dispatcher_host(), |