我有一个可以有多个客户端的 hidl,所以我想保留一个 DeathHandler 以防任何客户端死亡,这样我就可以进行清理了。
Class MyClientDeathHandler: public android::hardware::hidl_death_recipient {
void serviceDied(uint64_t cookie,
const android::wp<::android::hidl::base::V1_0::IBase>& who) override ;
};
关于我的 hidl:
- 它可以有多个客户端。
- 1 个客户端内可以有多个会话。
它有 1 个打开会话的 API。
void open (X, Y, callback cb, int pid /*caller_pid*/) {
// link to death
mDeathHandler = new MyClientDeathHandler();
cb->linkToDeath(mDeathHandler, pid);
}
这里的问题是我最终为每个打开的调用注册了 linkToDeath,所以最终在 1 个 pid 上注册了多个死亡处理程序,所以当客户端被杀死时,我会收到多个通知(100+)。为了处理这个问题,我需要同步我的 serviceDied 方法。
void MyClientDeathHandler::serviceDied(uint64_t cookie, const android::wp<::android::hidl::base::V1_0::IBase>& who){
// do cleanup
// AutoLock .. // for multiple threads
}
现在的问题是:
- 使用 linkToDeath 的最佳实践是什么?
- 我是否应该只为客户端注册一次这个 linkToDeath,因为它只特定于 pid。
- 如何检查由多次注册和导致多次回调引起的 binder 框架的开销,如果我想在将其限制为每个 pid 一次后检查性能改进。