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

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

Issue 1586663006: Refactoring gamepad polling to support dynamically added sources (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Avoid crash on Android content_unittests Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc b/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc
index f6fd2d4ef393697da51ce936497acf4f748c9162..85d419f65327b842b40df2338efc4be42e46f517 100644
--- a/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc
@@ -11,8 +11,6 @@
#include <sys/types.h>
#include <unistd.h>
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
#include "base/posix/eintr_wrapper.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -70,13 +68,17 @@ using blink::WebGamepad;
using blink::WebGamepads;
GamepadPlatformDataFetcherLinux::GamepadPlatformDataFetcherLinux() {
- for (size_t i = 0; i < arraysize(pad_state_); ++i) {
+ for (size_t i = 0; i < arraysize(device_fd_); ++i) {
device_fd_[i] = -1;
- pad_state_[i].mapper = 0;
- pad_state_[i].axis_mask = 0;
- pad_state_[i].button_mask = 0;
}
+}
+
+GamepadPlatformDataFetcherLinux::~GamepadPlatformDataFetcherLinux() {
+ for (size_t i = 0; i < WebGamepads::itemsLengthCap; ++i)
+ CloseFileDescriptorIfValid(device_fd_[i]);
+}
+void GamepadPlatformDataFetcherLinux::OnAddedToProvider() {
std::vector<UdevLinux::UdevMonitorFilter> filters;
filters.push_back(UdevLinux::UdevMonitorFilter(kInputSubsystem, NULL));
udev_.reset(
@@ -87,12 +89,7 @@ GamepadPlatformDataFetcherLinux::GamepadPlatformDataFetcherLinux() {
EnumerateDevices();
}
-GamepadPlatformDataFetcherLinux::~GamepadPlatformDataFetcherLinux() {
- for (size_t i = 0; i < WebGamepads::itemsLengthCap; ++i)
- CloseFileDescriptorIfValid(device_fd_[i]);
-}
-
-void GamepadPlatformDataFetcherLinux::GetGamepadData(WebGamepads* pads, bool) {
+void GamepadPlatformDataFetcherLinux::GetGamepadData(bool) {
TRACE_EVENT0("GAMEPAD", "GetGamepadData");
// Update our internal state.
@@ -101,11 +98,6 @@ void GamepadPlatformDataFetcherLinux::GetGamepadData(WebGamepads* pads, bool) {
ReadDeviceData(i);
}
}
-
- pads->length = WebGamepads::itemsLengthCap;
- for (size_t i = 0; i < WebGamepads::itemsLengthCap; ++i) {
- MapAndSanitizeGamepadData(&pad_state_[i], &pads->items[i]);
- }
}
// Used during enumeration, and monitor notifications.
@@ -114,8 +106,6 @@ void GamepadPlatformDataFetcherLinux::RefreshDevice(udev_device* dev) {
std::string node_path;
if (IsGamepad(dev, &index, &node_path)) {
int& device_fd = device_fd_[index];
- WebGamepad& pad = pad_state_[index].data;
- GamepadStandardMappingFunction& mapper = pad_state_[index].mapper;
CloseFileDescriptorIfValid(device_fd);
@@ -128,17 +118,26 @@ void GamepadPlatformDataFetcherLinux::RefreshDevice(udev_device* dev) {
if (!dev) {
// Unable to get device information, don't use this device.
device_fd = -1;
- pad.connected = false;
return;
}
device_fd = HANDLE_EINTR(open(node_path.c_str(), O_RDONLY | O_NONBLOCK));
if (device_fd < 0) {
// Unable to open device, don't use.
- pad.connected = false;
return;
}
+ PadState* state = provider()->GetPadState(GAMEPAD_SOURCE_LINUX_UDEV, index);
+ if (!state) {
+ // No slot available for device, don't use.
+ CloseFileDescriptorIfValid(device_fd);
+ device_fd = -1;
+ return;
+ }
+
+ WebGamepad& pad = state->data;
+ GamepadStandardMappingFunction& mapper = state->mapper;
+
const char* vendor_id =
device::udev_device_get_sysattr_value(dev, "id/vendor");
const char* product_id =
@@ -200,9 +199,6 @@ void GamepadPlatformDataFetcherLinux::RefreshDevice(udev_device* dev) {
pad.mapping[0] = 0;
}
- pad_state_[index].axis_mask = 0;
- pad_state_[index].button_mask = 0;
-
pad.connected = true;
}
}
@@ -242,10 +238,15 @@ void GamepadPlatformDataFetcherLinux::ReadDeviceData(size_t index) {
return;
}
- const int& fd = device_fd_[index];
- WebGamepad& pad = pad_state_[index].data;
+ PadState* state = provider()->GetPadState(GAMEPAD_SOURCE_LINUX_UDEV, index);
+ if (!state)
+ return;
+
+ int fd = device_fd_[index];
DCHECK_GE(fd, 0);
+ WebGamepad& pad = state->data;
+
js_event event;
while (HANDLE_EINTR(read(fd, &event, sizeof(struct js_event))) > 0) {
size_t item = event.number;

Powered by Google App Engine
This is Rietveld 408576698