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

Unified Diff: content/browser/gamepad/gamepad_provider.cc

Issue 8689011: Renderer reading side of gamepad (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase to HEAD Created 9 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/gamepad/gamepad_provider.h ('k') | content/browser/gamepad/gamepad_provider_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/gamepad/gamepad_provider.cc
diff --git a/content/browser/gamepad/gamepad_provider.cc b/content/browser/gamepad/gamepad_provider.cc
index 642e2445a7bbe8fa0d0fc8fa7fd1fcbe2827c101..c8eed65a30f00b447a888bfa75eedf7932c9f521 100644
--- a/content/browser/gamepad/gamepad_provider.cc
+++ b/content/browser/gamepad/gamepad_provider.cc
@@ -21,31 +21,29 @@
#include "content/browser/gamepad/data_fetcher_win.h"
#endif
-namespace gamepad {
+namespace content {
-Provider* Provider::instance_ = NULL;
+GamepadProvider* GamepadProvider::instance_ = NULL;
-using namespace content;
-
-// Define the default data fetcher that Provider will use if none is supplied.
-// (PlatformDataFetcher).
+// Define the default data fetcher that GamepadProvider will use if none is
+// supplied. (GamepadPlatformDataFetcher).
#if defined(OS_WIN)
-typedef DataFetcherWindows PlatformDataFetcher;
+typedef GamepadDataFetcherWindows GamepadPlatformDataFetcher;
#else
-class EmptyDataFetcher : public DataFetcher {
+class GamepadEmptyDataFetcher : public GamepadDataFetcher {
public:
void GetGamepadData(WebKit::WebGamepads* pads, bool) {
pads->length = 0;
}
};
-typedef EmptyDataFetcher PlatformDataFetcher;
+typedef GamepadEmptyDataFetcher GamepadPlatformDataFetcher;
#endif
-Provider::Provider(DataFetcher* fetcher)
+GamepadProvider::GamepadProvider(GamepadDataFetcher* fetcher)
: creator_loop_(MessageLoop::current()->message_loop_proxy()),
provided_fetcher_(fetcher),
devices_changed_(true),
@@ -59,25 +57,25 @@ Provider::Provider(DataFetcher* fetcher)
memset(hwbuf, 0, sizeof(GamepadHardwareBuffer));
}
-Provider::~Provider() {
+GamepadProvider::~GamepadProvider() {
base::SystemMonitor* monitor = base::SystemMonitor::Get();
if (monitor)
monitor->RemoveDevicesChangedObserver(this);
Stop();
}
-base::SharedMemoryHandle Provider::GetRendererSharedMemoryHandle(
+base::SharedMemoryHandle GamepadProvider::GetRendererSharedMemoryHandle(
base::ProcessHandle process) {
base::SharedMemoryHandle renderer_handle;
gamepad_shared_memory_.ShareToProcess(process, &renderer_handle);
return renderer_handle;
}
-void Provider::OnDevicesChanged() {
+void GamepadProvider::OnDevicesChanged() {
devices_changed_ = true;
}
-void Provider::Start() {
+void GamepadProvider::Start() {
DCHECK(MessageLoop::current()->message_loop_proxy() == creator_loop_);
if (polling_thread_.get())
@@ -93,21 +91,21 @@ void Provider::Start() {
MessageLoop* polling_loop = polling_thread_->message_loop();
polling_loop->PostTask(
FROM_HERE,
- base::Bind(&Provider::DoInitializePollingThread, this));
+ base::Bind(&GamepadProvider::DoInitializePollingThread, this));
}
-void Provider::Stop() {
+void GamepadProvider::Stop() {
DCHECK(MessageLoop::current()->message_loop_proxy() == creator_loop_);
polling_thread_.reset();
data_fetcher_.reset();
}
-void Provider::DoInitializePollingThread() {
+void GamepadProvider::DoInitializePollingThread() {
DCHECK(MessageLoop::current() == polling_thread_->message_loop());
if (!provided_fetcher_.get())
- provided_fetcher_.reset(new PlatformDataFetcher);
+ provided_fetcher_.reset(new GamepadPlatformDataFetcher);
// Pass ownership of fetcher to provider_.
data_fetcher_.swap(provided_fetcher_);
@@ -116,30 +114,38 @@ void Provider::DoInitializePollingThread() {
ScheduleDoPoll();
}
-void Provider::DoPoll() {
+void GamepadProvider::DoPoll() {
DCHECK(MessageLoop::current() == polling_thread_->message_loop());
GamepadHardwareBuffer* hwbuf = SharedMemoryAsHardwareBuffer();
- base::subtle::Barrier_AtomicIncrement(&hwbuf->start_marker, 1);
+
+ ANNOTATE_BENIGN_RACE_SIZED(
+ &hwbuf->buffer,
+ sizeof(WebKit::WebGamepads),
+ "Racey reads are discarded");
+
+ // Acquire the SeqLock. There is only ever one writer to this data.
+ // See gamepad_hardware_buffer.h.
+ hwbuf->sequence.WriteBegin();
data_fetcher_->GetGamepadData(&hwbuf->buffer, devices_changed_);
- base::subtle::Barrier_AtomicIncrement(&hwbuf->end_marker, 1);
+ hwbuf->sequence.WriteEnd();
devices_changed_ = false;
// Schedule our next interval of polling.
ScheduleDoPoll();
}
-void Provider::ScheduleDoPoll() {
+void GamepadProvider::ScheduleDoPoll() {
DCHECK(MessageLoop::current() == polling_thread_->message_loop());
MessageLoop::current()->PostDelayedTask(
FROM_HERE,
- base::Bind(&Provider::DoPoll, weak_factory_.GetWeakPtr()),
+ base::Bind(&GamepadProvider::DoPoll, weak_factory_.GetWeakPtr()),
kDesiredSamplingIntervalMs);
}
-GamepadHardwareBuffer* Provider::SharedMemoryAsHardwareBuffer() {
+GamepadHardwareBuffer* GamepadProvider::SharedMemoryAsHardwareBuffer() {
void* mem = gamepad_shared_memory_.memory();
DCHECK(mem);
return static_cast<GamepadHardwareBuffer*>(mem);
}
-} // namespace gamepad
+} // namespace content
« no previous file with comments | « content/browser/gamepad/gamepad_provider.h ('k') | content/browser/gamepad/gamepad_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698