Automatically unregister dead services.

Bug: 30804759
Bug: 31632518
Test: mma, hidl_test
Change-Id: Iabbe9d219048c750105e8d7a616c815eb3e1ad50
diff --git a/ServiceManager.h b/ServiceManager.h
index ed3d3ee..f0132af 100644
--- a/ServiceManager.h
+++ b/ServiceManager.h
@@ -15,6 +15,7 @@
 namespace V1_0 {
 namespace implementation {
 
+using ::android::hardware::hidl_death_recipient;
 using ::android::hardware::hidl_vec;
 using ::android::hardware::hidl_string;
 using ::android::hardware::hidl_version;
@@ -24,8 +25,9 @@
 using ::android::hidl::manager::V1_0::IServiceManager;
 using ::android::hidl::manager::V1_0::IServiceNotification;
 using ::android::sp;
+using ::android::wp;
 
-struct ServiceManager : public IServiceManager {
+struct ServiceManager : public IServiceManager, hidl_death_recipient {
     // Methods from ::android::hidl::manager::V1_0::IServiceManager follow.
     Return<void> get(const hidl_string& fqName,
                      const hidl_string& name,
@@ -42,7 +44,9 @@
                                           const hidl_string& name,
                                           const sp<IServiceNotification>& callback) override;
 
+    virtual void serviceDied(uint64_t cookie, const wp<IBase>& who);
 private:
+    bool remove(const wp<IBase>& who);
 
     using InstanceMap = std::multimap<
             std::string, // instance name e.x. "manager"