From 83c0e195442b8ab8380243805d2ed52fa49a8779 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Wed, 30 Mar 2022 13:28:52 -0700 Subject: [PATCH] Link to death recipient for AIDL HAL Bug: 215799354 Test: on Cuttlefish Change-Id: I914295ed67fb4dc83d6977663030505318b4960c --- services/core/jni/gnss/Gnss.cpp | 10 +++++++++- services/core/jni/gnss/Gnss.h | 15 ++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/services/core/jni/gnss/Gnss.cpp b/services/core/jni/gnss/Gnss.cpp index f6459eaa444ef..8934c3a6abde7 100644 --- a/services/core/jni/gnss/Gnss.cpp +++ b/services/core/jni/gnss/Gnss.cpp @@ -170,7 +170,15 @@ jboolean GnssHal::isSupported() { } void GnssHal::linkToDeath() { - // TODO: linkToDeath for AIDL HAL + if (gnssHalAidl != nullptr) { + gnssHalDeathRecipientAidl = new GnssDeathRecipientAidl(); + status_t linked = IInterface::asBinder(gnssHalAidl)->linkToDeath(gnssHalDeathRecipientAidl); + if (linked != OK) { + ALOGE("Unable to link to GNSS AIDL HAL death notification"); + } else { + ALOGD("Successfully linked to GNSS AIDL HAl death notification"); + } + } if (gnssHal != nullptr) { gnssHalDeathRecipient = new GnssDeathRecipient(); diff --git a/services/core/jni/gnss/Gnss.h b/services/core/jni/gnss/Gnss.h index c6743d62af459..458da8a6e5142 100644 --- a/services/core/jni/gnss/Gnss.h +++ b/services/core/jni/gnss/Gnss.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "AGnss.h" @@ -50,13 +51,24 @@ namespace android::gnss { struct GnssDeathRecipient : virtual public hardware::hidl_death_recipient { // hidl_death_recipient interface virtual void serviceDied(uint64_t cookie, const wp& who) override { - ALOGE("IGNSS hidl service failed, trying to recover..."); + ALOGE("GNSS HIDL service failed, trying to recover..."); + onServiceDied(); + } + static void onServiceDied() { JNIEnv* env = android::AndroidRuntime::getJNIEnv(); env->CallVoidMethod(android::mCallbacksObj, method_reportGnssServiceDied); } }; +struct GnssDeathRecipientAidl : virtual public IBinder::DeathRecipient { + // IBinder::DeathRecipient implementation + virtual void binderDied(const wp& who) override { + ALOGE("GNSS AIDL service failed, trying to recover..."); + GnssDeathRecipient::onServiceDied(); + } +}; + class GnssHal { public: GnssHal(); @@ -109,6 +121,7 @@ public: private: sp gnssHalDeathRecipient = nullptr; + sp gnssHalDeathRecipientAidl = nullptr; sp gnssHal = nullptr; sp gnssHal_V1_1 = nullptr; sp gnssHal_V2_0 = nullptr;