Index: content/browser/gamepad/gamepad_provider.cc |
diff --git a/content/browser/gamepad/gamepad_provider.cc b/content/browser/gamepad/gamepad_provider.cc |
index 1dad4829f8d0a11222fad76cbeea0bbcd7d257d8..b4fe67fc81e2a7e54b6f74b4f233a687263d95b9 100644 |
--- a/content/browser/gamepad/gamepad_provider.cc |
+++ b/content/browser/gamepad/gamepad_provider.cc |
@@ -113,8 +113,17 @@ void GamepadProvider::Initialize(scoped_ptr<GamepadDataFetcher> fetcher) { |
memset(hwbuf, 0, sizeof(GamepadHardwareBuffer)); |
polling_thread_.reset(new base::Thread("Gamepad polling thread")); |
- polling_thread_->StartWithOptions( |
- base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); |
+#if defined(OS_MACOSX) |
+ // On Mac, the data fetcher uses IOKit which depends on CFRunLoop, so the |
+ // message loop needs to be a UI-type loop. |
+ const base::MessageLoop::Type kMessageLoopType = base::MessageLoop::TYPE_UI; |
+#else |
+ // On Linux, the data fetcher needs to watch file descriptors, so the message |
+ // loop needs to be a libevent loop. On Windows it doesn't matter what the |
+ // loop is. |
+ const base::MessageLoop::Type kMessageLoopType = base::MessageLoop::TYPE_IO; |
+#endif |
+ polling_thread_->StartWithOptions(base::Thread::Options(kMessageLoopType, 0)); |
polling_thread_->message_loop()->PostTask( |
FROM_HERE, |