diff options
Diffstat (limited to 'device')
-rw-r--r-- | device/hid/hid_service.cc | 11 | ||||
-rw-r--r-- | device/hid/hid_service.h | 8 |
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>>&)> |