summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorscottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-05 18:48:20 +0000
committerscottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-05 18:48:20 +0000
commitac671e781e6caa036e5dc6ccac166bb6aa316a97 (patch)
tree187ea51f5c8cf01e087037321b6cfc5cfbf6f695 /content
parent581eb178c9c0741043ad0b3283fc50a3c836d241 (diff)
downloadchromium_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.cc3
-rw-r--r--content/browser/gamepad/gamepad_service.cc12
-rw-r--r--content/browser/gamepad/gamepad_service.h3
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();