Index: content/browser/gamepad/gamepad_provider.cc |
=================================================================== |
--- content/browser/gamepad/gamepad_provider.cc (revision 111220) |
+++ content/browser/gamepad/gamepad_provider.cc (working copy) |
@@ -1,145 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <cmath> |
-#include <set> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "base/message_loop.h" |
-#include "base/task.h" |
-#include "base/threading/thread.h" |
-#include "base/threading/thread_restrictions.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/browser/gamepad/gamepad_provider.h" |
-#include "content/browser/gamepad/data_fetcher.h" |
-#include "content/common/gamepad_messages.h" |
- |
-#if defined(OS_WIN) |
-#include "content/browser/gamepad/data_fetcher_win.h" |
-#endif |
- |
-namespace gamepad { |
- |
-Provider* Provider::instance_ = NULL; |
- |
-using namespace content; |
- |
-// Define the default data fetcher that Provider will use if none is supplied. |
-// (PlatformDataFetcher). |
-#if defined(OS_WIN) |
- |
-typedef DataFetcherWindows PlatformDataFetcher; |
- |
-#else |
- |
-class EmptyDataFetcher : public DataFetcher { |
- public: |
- void GetGamepadData(WebKit::WebGamepads* pads, bool) { |
- pads->length = 0; |
- } |
-}; |
-typedef EmptyDataFetcher PlatformDataFetcher; |
- |
-#endif |
- |
-Provider::Provider(DataFetcher* fetcher) |
- : creator_loop_(MessageLoop::current()->message_loop_proxy()), |
- provided_fetcher_(fetcher), |
- devices_changed_(true), |
- ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
- size_t data_size = sizeof(GamepadHardwareBuffer); |
- base::SystemMonitor* monitor = base::SystemMonitor::Get(); |
- if (monitor) |
- monitor->AddDevicesChangedObserver(this); |
- gamepad_shared_memory_.CreateAndMapAnonymous(data_size); |
- GamepadHardwareBuffer* hwbuf = SharedMemoryAsHardwareBuffer(); |
- memset(hwbuf, 0, sizeof(GamepadHardwareBuffer)); |
-} |
- |
-Provider::~Provider() { |
- base::SystemMonitor* monitor = base::SystemMonitor::Get(); |
- if (monitor) |
- monitor->RemoveDevicesChangedObserver(this); |
- Stop(); |
-} |
- |
-base::SharedMemoryHandle Provider::GetRendererSharedMemoryHandle( |
- base::ProcessHandle process) { |
- base::SharedMemoryHandle renderer_handle; |
- gamepad_shared_memory_.ShareToProcess(process, &renderer_handle); |
- return renderer_handle; |
-} |
- |
-void Provider::OnDevicesChanged() { |
- devices_changed_ = true; |
-} |
- |
-void Provider::Start() { |
- DCHECK(MessageLoop::current()->message_loop_proxy() == creator_loop_); |
- |
- if (polling_thread_.get()) |
- return; |
- |
- polling_thread_.reset(new base::Thread("Gamepad polling thread")); |
- if (!polling_thread_->Start()) { |
- LOG(ERROR) << "Failed to start gamepad polling thread"; |
- polling_thread_.reset(); |
- return; |
- } |
- |
- MessageLoop* polling_loop = polling_thread_->message_loop(); |
- polling_loop->PostTask( |
- FROM_HERE, |
- base::Bind(&Provider::DoInitializePollingThread, this)); |
-} |
- |
-void Provider::Stop() { |
- DCHECK(MessageLoop::current()->message_loop_proxy() == creator_loop_); |
- |
- polling_thread_.reset(); |
- data_fetcher_.reset(); |
-} |
- |
-void Provider::DoInitializePollingThread() { |
- DCHECK(MessageLoop::current() == polling_thread_->message_loop()); |
- |
- if (!provided_fetcher_.get()) |
- provided_fetcher_.reset(new PlatformDataFetcher); |
- |
- // Pass ownership of fetcher to provider_. |
- data_fetcher_.swap(provided_fetcher_); |
- |
- // Start polling. |
- ScheduleDoPoll(); |
-} |
- |
-void Provider::DoPoll() { |
- DCHECK(MessageLoop::current() == polling_thread_->message_loop()); |
- GamepadHardwareBuffer* hwbuf = SharedMemoryAsHardwareBuffer(); |
- base::subtle::Barrier_AtomicIncrement(&hwbuf->start_marker, 1); |
- data_fetcher_->GetGamepadData(&hwbuf->buffer, devices_changed_); |
- base::subtle::Barrier_AtomicIncrement(&hwbuf->end_marker, 1); |
- devices_changed_ = false; |
- // Schedule our next interval of polling. |
- ScheduleDoPoll(); |
-} |
- |
-void Provider::ScheduleDoPoll() { |
- DCHECK(MessageLoop::current() == polling_thread_->message_loop()); |
- |
- MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&Provider::DoPoll, weak_factory_.GetWeakPtr()), |
- kDesiredSamplingIntervalMs); |
-} |
- |
-GamepadHardwareBuffer* Provider::SharedMemoryAsHardwareBuffer() { |
- void* mem = gamepad_shared_memory_.memory(); |
- DCHECK(mem); |
- return static_cast<GamepadHardwareBuffer*>(mem); |
-} |
- |
-} // namespace gamepad |