summaryrefslogtreecommitdiffstats
path: root/device
diff options
context:
space:
mode:
Diffstat (limited to 'device')
-rw-r--r--device/hid/hid_service.cc11
-rw-r--r--device/hid/hid_service.h8
2 files changed, 18 insertions, 1 deletions
diff --git a/device/hid/hid_service.cc b/device/hid/hid_service.cc
index fc50a41..1993999 100644
--- a/device/hid/hid_service.cc
+++ b/device/hid/hid_service.cc
@@ -34,6 +34,10 @@ void HidService::Observer::OnDeviceRemoved(
scoped_refptr<HidDeviceInfo> device_info) {
}
+void HidService::Observer::OnDeviceRemovedCleanup(
+ scoped_refptr<HidDeviceInfo> device_info) {
+}
+
HidService* HidService::GetInstance(
scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) {
if (g_service == NULL) {
@@ -124,10 +128,15 @@ void HidService::RemoveDevice(const HidDeviceId& device_id) {
if (it != devices_.end()) {
HID_LOG(USER) << "HID device removed: deviceId='" << device_id << "'";
+ scoped_refptr<HidDeviceInfo> device = it->second;
if (enumeration_ready_) {
- FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(it->second));
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(device));
}
devices_.erase(it);
+ if (enumeration_ready_) {
+ FOR_EACH_OBSERVER(Observer, observer_list_,
+ OnDeviceRemovedCleanup(device));
+ }
}
}
diff --git a/device/hid/hid_service.h b/device/hid/hid_service.h
index 6d6ef2b..4a4d3ad 100644
--- a/device/hid/hid_service.h
+++ b/device/hid/hid_service.h
@@ -27,7 +27,15 @@ class HidService {
class Observer {
public:
virtual void OnDeviceAdded(scoped_refptr<HidDeviceInfo> info);
+ // Notifies all observers that a device is being removed, called before
+ // removing the device from HidService. Observers should not depend on the
+ // order in which they are notified of the OnDeviceRemove event.
virtual void OnDeviceRemoved(scoped_refptr<HidDeviceInfo> info);
+ // Notifies all observers again, after having first notified all observers
+ // with OnDeviceRemoved and removed the device from internal structures.
+ // Each observer must not depend on any other observers' awareness of the
+ // device as they could be cleaned up in any order.
+ virtual void OnDeviceRemovedCleanup(scoped_refptr<HidDeviceInfo> info);
};
typedef base::Callback<void(const std::vector<scoped_refptr<HidDeviceInfo>>&)>