diff options
author | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-05 18:48:20 +0000 |
---|---|---|
committer | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-05 18:48:20 +0000 |
commit | ac671e781e6caa036e5dc6ccac166bb6aa316a97 (patch) | |
tree | 187ea51f5c8cf01e087037321b6cfc5cfbf6f695 /content | |
parent | 581eb178c9c0741043ad0b3283fc50a3c836d241 (diff) | |
download | chromium_src-ac671e781e6caa036e5dc6ccac166bb6aa316a97.zip chromium_src-ac671e781e6caa036e5dc6ccac166bb6aa316a97.tar.gz chromium_src-ac671e781e6caa036e5dc6ccac166bb6aa316a97.tar.bz2 |
Shutdown gamepad background thread properly
Because GamepadService is Leaky, the background thread was never shutdown,
so it was still looping long after chrome.dll was unloaded. Crashing or not
was a race between chrome.dll getting unloaded and the process terminating,
and the next invocation of the gamepad poller running.
Properly shutdown the background thread with the rest of the content browser
threads.
Also, defer initialization to Start so that the Terminate won't unnecessarily
cause the gamepad poller to start if it had not previously been used.
R=jam@chromium.org
BUG=130079
Review URL: https://chromiumcodereview.appspot.com/10490002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140570 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/browser/browser_main_loop.cc | 3 | ||||
-rw-r--r-- | content/browser/gamepad/gamepad_service.cc | 12 | ||||
-rw-r--r-- | content/browser/gamepad/gamepad_service.h | 3 |
3 files changed, 15 insertions, 3 deletions
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index d9cf97d..3007157 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc @@ -17,6 +17,7 @@ #include "content/browser/browser_thread_impl.h" #include "content/browser/download/download_file_manager.h" #include "content/browser/download/save_file_manager.h" +#include "content/browser/gamepad/gamepad_service.h" #include "content/browser/gpu/browser_gpu_channel_host_factory.h" #include "content/browser/gpu/gpu_process_host.h" #include "content/browser/gpu/gpu_process_host_ui_shim.h" @@ -474,6 +475,8 @@ void BrowserMainLoop::ShutdownThreadsAndCleanUp() { #endif BrowserGpuChannelHostFactory::Terminate(); + GamepadService::GetInstance()->Terminate(); + // Must be size_t so we can subtract from it. for (size_t thread_id = BrowserThread::ID_COUNT - 1; thread_id >= (BrowserThread::UI + 1); diff --git a/content/browser/gamepad/gamepad_service.cc b/content/browser/gamepad/gamepad_service.cc index 779ef82..0efd505 100644 --- a/content/browser/gamepad/gamepad_service.cc +++ b/content/browser/gamepad/gamepad_service.cc @@ -17,8 +17,7 @@ namespace content { GamepadService::GamepadService() : - num_readers_(0), - provider_(new GamepadProvider) { + num_readers_(0) { } GamepadService::~GamepadService() { @@ -34,7 +33,10 @@ void GamepadService::Start( RenderProcessHost* associated_rph) { num_readers_++; DCHECK(num_readers_ > 0); - provider_->SetDataFetcher(data_fetcher); + if (provider_ == NULL) { + provider_.reset(new GamepadProvider); + provider_->SetDataFetcher(data_fetcher); + } provider_->Resume(); BrowserThread::PostTask( @@ -45,6 +47,10 @@ void GamepadService::Start( associated_rph)); } +void GamepadService::Terminate() { + provider_.reset(); +} + void GamepadService::RegisterForCloseNotification(RenderProcessHost* rph) { registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, diff --git a/content/browser/gamepad/gamepad_service.h b/content/browser/gamepad/gamepad_service.h index 70d577f..4a446b7 100644 --- a/content/browser/gamepad/gamepad_service.h +++ b/content/browser/gamepad/gamepad_service.h @@ -36,6 +36,9 @@ class GamepadService : public NotificationObserver { base::SharedMemoryHandle GetSharedMemoryHandle(base::ProcessHandle handle); + // Stop/join with the background thread in GamepadProvider |provider_|. + void Terminate(); + private: friend struct DefaultSingletonTraits<GamepadService>; GamepadService(); |