Skip to content

Commit

Permalink
Fix HidService lifetime issues
Browse files Browse the repository at this point in the history
This reverts HidService to being a singleton instance for now.

BUG=401234
TBR=rpaquay

Review URL: https://codereview.chromium.org/523743005

Cr-Commit-Position: refs/heads/master@{#293464}
  • Loading branch information
krockot authored and Commit bot committed Sep 5, 2014
1 parent 243eec8 commit 1a51b92
Show file tree
Hide file tree
Showing 25 changed files with 88 additions and 110 deletions.
1 change: 1 addition & 0 deletions chrome/browser/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ include_rules = [
"+courgette",
"+device/bluetooth",
"+device/core",
"+device/hid",
"+device/usb",
"+device/media_transfer_protocol",
"+extensions/browser",
Expand Down
7 changes: 7 additions & 0 deletions chrome/browser/chrome_device_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "base/logging.h"
#include "content/public/browser/browser_thread.h"
#include "device/hid/hid_service.h"
#include "device/usb/usb_service.h"

ChromeDeviceClient::ChromeDeviceClient() {}
Expand All @@ -17,3 +18,9 @@ device::UsbService* ChromeDeviceClient::GetUsbService() {
content::BrowserThread::GetMessageLoopProxyForThread(
content::BrowserThread::UI));
}

device::HidService* ChromeDeviceClient::GetHidService() {
return device::HidService::GetInstance(
content::BrowserThread::GetMessageLoopProxyForThread(
content::BrowserThread::UI));
}
1 change: 1 addition & 0 deletions chrome/browser/chrome_device_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class ChromeDeviceClient : device::DeviceClient {

// device::DeviceClient implementation
virtual device::UsbService* GetUsbService() OVERRIDE;
virtual device::HidService* GetHidService() OVERRIDE;

private:
DISALLOW_COPY_AND_ASSIGN(ChromeDeviceClient);
Expand Down
10 changes: 0 additions & 10 deletions chrome/browser/extensions/api/chrome_extensions_api_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "device/hid/hid_service.h"
#include "extensions/browser/guest_view/app_view/app_view_guest.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
Expand Down Expand Up @@ -59,15 +58,6 @@ WebViewPermissionHelperDelegate* ChromeExtensionsAPIClient::
return new ChromeWebViewPermissionHelperDelegate(web_view_permission_helper);
}

device::HidService* ChromeExtensionsAPIClient::GetHidService() {
if (!hid_service_) {
hid_service_.reset(device::HidService::Create(
content::BrowserThread::GetMessageLoopProxyForThread(
content::BrowserThread::UI)));
}
return hid_service_.get();
}

void ChromeExtensionsAPIClient::RegisterGuestViewTypes() {
ExtensionOptionsGuest::Register();
}
Expand Down
4 changes: 0 additions & 4 deletions chrome/browser/extensions/api/chrome_extensions_api_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
#define CHROME_BROWSER_EXTENSIONS_API_CHROME_EXTENSIONS_API_CLIENT_H_

#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "extensions/browser/api/extensions_api_client.h"

namespace extensions {
Expand All @@ -30,12 +29,9 @@ class ChromeExtensionsAPIClient : public ExtensionsAPIClient {
virtual WebViewPermissionHelperDelegate*
CreateWebViewPermissionHelperDelegate(
WebViewPermissionHelper* web_view_permission_helper) const OVERRIDE;
virtual device::HidService* GetHidService() OVERRIDE;
virtual void RegisterGuestViewTypes() OVERRIDE;

private:
scoped_ptr<device::HidService> hid_service_;

DISALLOW_COPY_AND_ASSIGN(ChromeExtensionsAPIClient);
};

Expand Down
6 changes: 6 additions & 0 deletions device/core/device_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,10 @@ UsbService* DeviceClient::GetUsbService() {
return NULL;
}

HidService* DeviceClient::GetHidService() {
// This should never be called by clients which do not support the HID API.
NOTREACHED();
return NULL;
}

} // namespace device
4 changes: 4 additions & 0 deletions device/core/device_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

namespace device {

class HidService;
class UsbService;

// Interface used by consumers of //device APIs to get pointers to the service
Expand All @@ -28,6 +29,9 @@ class DeviceClient {
// Returns the UsbService instance for this embedder.
virtual UsbService* GetUsbService();

// Returns the HidService instance for this embedder.
virtual HidService* GetHidService();

private:
DISALLOW_COPY_AND_ASSIGN(DeviceClient);
};
Expand Down
3 changes: 2 additions & 1 deletion device/hid/hid_connection_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ class HidConnectionTest : public testing::Test {
if (!UsbTestGadget::IsTestEnabled()) return;

message_loop_.reset(new base::MessageLoopForIO());
service_.reset(HidService::Create(message_loop_->message_loop_proxy()));
service_.reset(HidService::GetInstance(
message_loop_->message_loop_proxy()));
ASSERT_TRUE(service_);

test_gadget_ = UsbTestGadget::Claim();
Expand Down
44 changes: 37 additions & 7 deletions device/hid/hid_service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/scoped_vector.h"
#include "base/message_loop/message_loop.h"
#include "base/stl_util.h"
#include "base/threading/thread_restrictions.h"

Expand All @@ -20,17 +21,46 @@

namespace device {

HidService* HidService::Create(
scoped_refptr<base::MessageLoopProxy> ui_message_loop) {
namespace {

HidService* g_service = NULL;

class HidServiceDestroyer : public base::MessageLoop::DestructionObserver {
public:
explicit HidServiceDestroyer(HidService* hid_service)
: hid_service_(hid_service) {}
virtual ~HidServiceDestroyer() {}

private:
// base::MessageLoop::DestructionObserver implementation.
virtual void WillDestroyCurrentMessageLoop() OVERRIDE {
base::MessageLoop::current()->RemoveDestructionObserver(this);
delete hid_service_;
delete this;
g_service = NULL;
}

HidService* hid_service_;
};

} // namespace

HidService* HidService::GetInstance(
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
if (g_service == NULL) {
#if defined(OS_LINUX) && defined(USE_UDEV)
return new HidServiceLinux(ui_message_loop);
g_service = new HidServiceLinux(ui_task_runner);
#elif defined(OS_MACOSX)
return new HidServiceMac();
g_service = new HidServiceMac();
#elif defined(OS_WIN)
return new HidServiceWin();
#else
return NULL;
g_service = new HidServiceWin();
#endif
if (g_service != NULL) {
HidServiceDestroyer* destroyer = new HidServiceDestroyer(g_service);
base::MessageLoop::current()->AddDestructionObserver(destroyer);
}
}
return g_service;
}

HidService::~HidService() {
Expand Down
6 changes: 3 additions & 3 deletions device/hid/hid_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <vector>

#include "base/memory/ref_counted.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_checker.h"
#include "device/hid/hid_device_info.h"

Expand All @@ -20,8 +20,8 @@ class HidConnection;

class HidService {
public:
static HidService* Create(
scoped_refptr<base::MessageLoopProxy> ui_message_loop);
static HidService* GetInstance(
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);

virtual ~HidService();

Expand Down
6 changes: 3 additions & 3 deletions device/hid/hid_service_linux.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ const char kHIDUnique[] = "HID_UNIQ";
} // namespace

HidServiceLinux::HidServiceLinux(
scoped_refptr<base::MessageLoopProxy> ui_message_loop)
: ui_message_loop_(ui_message_loop),
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
: ui_task_runner_(ui_task_runner),
weak_factory_(this) {
DeviceMonitorLinux* monitor = DeviceMonitorLinux::GetInstance();
monitor->AddObserver(this);
Expand Down Expand Up @@ -132,7 +132,7 @@ void HidServiceLinux::OnDeviceAdded(udev_device* device) {
if (!client) {
return;
}
ui_message_loop_->PostTask(
ui_task_runner_->PostTask(
FROM_HERE,
base::Bind(&chromeos::PermissionBrokerClient::RequestPathAccess,
base::Unretained(client),
Expand Down
4 changes: 2 additions & 2 deletions device/hid/hid_service_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class HidConnection;
class HidServiceLinux : public HidService,
public DeviceMonitorLinux::Observer {
public:
HidServiceLinux(scoped_refptr<base::MessageLoopProxy> ui_message_loop);
HidServiceLinux(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);

virtual scoped_refptr<HidConnection> Connect(const HidDeviceId& device_id)
OVERRIDE;
Expand All @@ -38,7 +38,7 @@ class HidServiceLinux : public HidService,
scoped_ptr<HidDeviceInfo> device_info,
bool success);

scoped_refptr<base::MessageLoopProxy> ui_message_loop_;
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;

base::WeakPtrFactory<HidServiceLinux> weak_factory_;

Expand Down
4 changes: 2 additions & 2 deletions device/hid/hid_service_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ namespace device {

TEST(HidServiceTest, Create) {
base::MessageLoopForIO message_loop;
scoped_ptr<HidService> service(
HidService::Create(message_loop.message_loop_proxy()));
HidService* service = HidService::GetInstance(
message_loop.message_loop_proxy());
ASSERT_TRUE(service);

std::vector<HidDeviceInfo> devices;
Expand Down
6 changes: 0 additions & 6 deletions extensions/browser/api/extensions_api_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,6 @@ AppViewGuestDelegate* ExtensionsAPIClient::CreateAppViewGuestDelegate() const {
return NULL;
}

device::HidService* ExtensionsAPIClient::GetHidService() {
// This should never be called by clients which don't support the HID API.
NOTIMPLEMENTED();
return NULL;
}

WebViewGuestDelegate* ExtensionsAPIClient::CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const {
return NULL;
Expand Down
7 changes: 0 additions & 7 deletions extensions/browser/api/extensions_api_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ namespace content {
class BrowserContext;
}

namespace device {
class HidService;
}

namespace extensions {

class AppViewGuestDelegate;
Expand Down Expand Up @@ -61,9 +57,6 @@ class ExtensionsAPIClient {
// Creates the AppViewGuestDelegate.
virtual AppViewGuestDelegate* CreateAppViewGuestDelegate() const;

// Returns the HidService instance for this embedder.
virtual device::HidService* GetHidService();

// Returns a delegate for some of WebViewGuest's behavior. The caller owns the
// returned WebViewGuestDelegate.
virtual WebViewGuestDelegate* CreateWebViewGuestDelegate (
Expand Down
1 change: 1 addition & 0 deletions extensions/browser/api/hid/DEPS
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
include_rules = [
"+device/core",
"+device/hid",
]
4 changes: 2 additions & 2 deletions extensions/browser/api/hid/hid_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
#include <string>
#include <vector>

#include "device/core/device_client.h"
#include "device/hid/hid_connection.h"
#include "device/hid/hid_device_filter.h"
#include "device/hid/hid_device_info.h"
#include "device/hid/hid_service.h"
#include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/common/api/hid.h"
#include "net/base/io_buffer.h"

Expand Down Expand Up @@ -143,7 +143,7 @@ void HidConnectFunction::AsyncWorkStart() {
return;
}

HidService* hid_service = ExtensionsAPIClient::Get()->GetHidService();
HidService* hid_service = device::DeviceClient::Get()->GetHidService();
DCHECK(hid_service);
scoped_refptr<HidConnection> connection =
hid_service->Connect(device_info.device_id);
Expand Down
10 changes: 6 additions & 4 deletions extensions/browser/api/hid/hid_device_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <vector>

#include "base/lazy_instance.h"
#include "device/core/device_client.h"
#include "device/hid/hid_device_filter.h"
#include "device/hid/hid_service.h"
#include "extensions/browser/api/extensions_api_client.h"
Expand All @@ -21,7 +22,8 @@ using device::HidUsageAndPage;
namespace extensions {

HidDeviceManager::HidDeviceManager(content::BrowserContext* context)
: next_resource_id_(0) {}
: next_resource_id_(0) {
}

HidDeviceManager::~HidDeviceManager() {}

Expand All @@ -38,7 +40,7 @@ scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevices(
const std::vector<HidDeviceFilter>& filters) {
UpdateDevices();

HidService* hid_service = ExtensionsAPIClient::Get()->GetHidService();
HidService* hid_service = device::DeviceClient::Get()->GetHidService();
DCHECK(hid_service);
base::ListValue* api_devices = new base::ListValue();
for (ResourceIdToDeviceIdMap::const_iterator device_iter =
Expand Down Expand Up @@ -106,7 +108,7 @@ scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevices(
bool HidDeviceManager::GetDeviceInfo(int resource_id,
device::HidDeviceInfo* device_info) {
UpdateDevices();
HidService* hid_service = ExtensionsAPIClient::Get()->GetHidService();
HidService* hid_service = device::DeviceClient::Get()->GetHidService();
DCHECK(hid_service);

ResourceIdToDeviceIdMap::const_iterator device_iter =
Expand Down Expand Up @@ -142,7 +144,7 @@ bool HidDeviceManager::HasPermission(const Extension* extension,

void HidDeviceManager::UpdateDevices() {
thread_checker_.CalledOnValidThread();
HidService* hid_service = ExtensionsAPIClient::Get()->GetHidService();
HidService* hid_service = device::DeviceClient::Get()->GetHidService();
DCHECK(hid_service);

std::vector<device::HidDeviceInfo> devices;
Expand Down
1 change: 1 addition & 0 deletions extensions/browser/api/hid/hid_device_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <map>

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/thread_checker.h"
#include "device/hid/hid_device_info.h"
Expand Down
2 changes: 0 additions & 2 deletions extensions/shell/app_shell.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,6 @@
'app/shell_main_delegate.h',
'browser/api/shell/shell_api.cc',
'browser/api/shell/shell_api.h',
'browser/api/shell_extensions_api_client.cc',
'browser/api/shell_extensions_api_client.h',
'browser/default_shell_browser_main_delegate.cc',
'browser/default_shell_browser_main_delegate.h',
'browser/desktop_controller.cc',
Expand Down
Loading

0 comments on commit 1a51b92

Please sign in to comment.