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 |