Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1220)

Side by Side Diff: content/browser/gamepad/gamepad_service.cc

Issue 10912062: Implement the gamepad API in the IPC proxy (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/gamepad/gamepad_service.h" 5 #include "content/browser/gamepad/gamepad_service.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h"
8 #include "base/memory/singleton.h" 9 #include "base/memory/singleton.h"
9 #include "content/browser/gamepad/data_fetcher.h" 10 #include "content/browser/gamepad/gamepad_data_fetcher.h"
10 #include "content/browser/gamepad/gamepad_provider.h" 11 #include "content/browser/gamepad/gamepad_provider.h"
11 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/notification_service.h"
13 #include "content/public/browser/notification_source.h"
14 #include "content/public/browser/notification_types.h"
15 #include "content/public/browser/render_process_host.h" 13 #include "content/public/browser/render_process_host.h"
16 14
17 namespace content { 15 namespace content {
18 16
19 GamepadService::GamepadService() : 17 GamepadService::GamepadService() : num_readers_(0) {
20 num_readers_(0) { 18 }
19
20 GamepadService::GamepadService(scoped_ptr<GamepadDataFetcher> fetcher)
21 : num_readers_(0),
22 provider_(new GamepadProvider(fetcher.Pass())) {
23 thread_checker_.DetachFromThread();
21 } 24 }
22 25
23 GamepadService::~GamepadService() { 26 GamepadService::~GamepadService() {
24 } 27 }
25 28
26 GamepadService* GamepadService::GetInstance() { 29 GamepadService* GamepadService::GetInstance() {
27 return Singleton<GamepadService, 30 return Singleton<GamepadService,
28 LeakySingletonTraits<GamepadService> >::get(); 31 LeakySingletonTraits<GamepadService> >::get();
29 } 32 }
30 33
31 void GamepadService::Start( 34 void GamepadService::AddConsumer() {
32 GamepadDataFetcher* data_fetcher, 35 DCHECK(thread_checker_.CalledOnValidThread());
33 RenderProcessHost* associated_rph) { 36
34 num_readers_++; 37 num_readers_++;
35 DCHECK(num_readers_ > 0); 38 DCHECK(num_readers_ > 0);
36 if (provider_ == NULL) { 39 if (!provider_.get())
37 provider_.reset(new GamepadProvider); 40 provider_.reset(new GamepadProvider);
38 provider_->SetDataFetcher(data_fetcher);
39 }
40 provider_->Resume(); 41 provider_->Resume();
42 }
41 43
42 BrowserThread::PostTask( 44 void GamepadService::RemoveConsumer() {
43 BrowserThread::UI, 45 DCHECK(thread_checker_.CalledOnValidThread());
44 FROM_HERE, 46
45 base::Bind(&GamepadService::RegisterForTerminationNotification, 47 --num_readers_;
46 base::Unretained(this), 48 DCHECK(num_readers_ >= 0);
47 associated_rph)); 49
50 if (num_readers_ == 0)
51 provider_->Pause();
52 }
53
54 void GamepadService::RegisterForUserGesture(const base::Closure& closure) {
55 DCHECK(num_readers_ > 0);
56 DCHECK(thread_checker_.CalledOnValidThread());
57 provider_->RegisterForUserGesture(closure);
48 } 58 }
49 59
50 void GamepadService::Terminate() { 60 void GamepadService::Terminate() {
51 provider_.reset(); 61 provider_.reset();
52 } 62 }
53 63
54 void GamepadService::RegisterForTerminationNotification( 64 base::SharedMemoryHandle GamepadService::GetSharedMemoryHandleForProcess(
55 RenderProcessHost* rph) { 65 base::ProcessHandle handle) {
56 registrar_.Add(this, 66 DCHECK(thread_checker_.CalledOnValidThread());
57 NOTIFICATION_RENDERER_PROCESS_TERMINATED, 67 return provider_->GetSharedMemoryHandleForProcess(handle);
58 Source<RenderProcessHost>(rph));
59 } 68 }
60 69
61 base::SharedMemoryHandle GamepadService::GetSharedMemoryHandle( 70 } // namespace content
62 base::ProcessHandle handle) {
63 return provider_->GetRendererSharedMemoryHandle(handle);
64 }
65
66 void GamepadService::Stop(const NotificationSource& source) {
67 --num_readers_;
68 DCHECK(num_readers_ >= 0);
69
70 BrowserThread::PostTask(
71 BrowserThread::UI,
72 FROM_HERE,
73 base::Bind(&GamepadService::UnregisterForTerminationNotification,
74 base::Unretained(this),
75 source));
76
77 if (num_readers_ == 0)
78 provider_->Pause();
79 }
80
81 void GamepadService::UnregisterForTerminationNotification(
82 const NotificationSource& source) {
83 registrar_.Remove(this, NOTIFICATION_RENDERER_PROCESS_TERMINATED, source);
84 }
85
86 void GamepadService::Observe(int type,
87 const NotificationSource& source,
88 const NotificationDetails& details) {
89 DCHECK(type == NOTIFICATION_RENDERER_PROCESS_TERMINATED);
90 BrowserThread::PostTask(
91 BrowserThread::IO,
92 FROM_HERE,
93 base::Bind(&GamepadService::Stop, base::Unretained(this), source));
94 }
95
96 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gamepad/gamepad_service.h ('k') | content/browser/gamepad/gamepad_test_helpers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698