Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01d5a1d2 authored by Daniel Zheng's avatar Daniel Zheng
Browse files

bootctl: fix reconnect logic

Instead of just logging an error message, let's try reonnecting to the
bootctl service if our death recipient is invoked. We should also
reconnect our death recipient here.

If binder is killed, our death recipient is automatically unlinked.

Bug: 369289491
Test: kill bootctl service on CVD. Apply OTA
Change-Id: I914643baaf1fa6fe1e192517a2e43e07ee749b70
parent d5d0c550
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -79,13 +79,31 @@ class BootControlClientAidl final : public BootControlClient {

    BootControlVersion GetVersion() const override { return BootControlVersion::BOOTCTL_AIDL; }

    ~BootControlClientAidl() {
        if (boot_control_death_recipient) {
            AIBinder_unlinkToDeath(module_->asBinder().get(), boot_control_death_recipient, this);
    void onBootControlServiceDied() {
        LOG(ERROR) << "boot control service AIDL died. Attempting to reconnect...";
        const auto instance_name =
                std::string(::aidl::android::hardware::boot::IBootControl::descriptor) + "/default";
        if (AServiceManager_isDeclared(instance_name.c_str())) {
            module_ = ::aidl::android::hardware::boot::IBootControl::fromBinder(
                    ndk::SpAIBinder(AServiceManager_waitForService(instance_name.c_str())));
            if (module_ == nullptr) {
                LOG(ERROR) << "AIDL " << instance_name
                           << " is declared but waitForService returned nullptr when trying to "
                              "reconnect boot control service";
                return;
            }
            LOG(INFO) << "Reconnected to AIDL version of IBootControl";
            binder_status_t status = AIBinder_linkToDeath(module_->asBinder().get(),
                                                          boot_control_death_recipient, this);
            if (status != STATUS_OK) {
                LOG(ERROR) << "Could not link to binder death";
                return;
            }

    void onBootControlServiceDied() { LOG(ERROR) << "boot control service AIDL died"; }
        } else {
            LOG(ERROR) << "Failed to get service manager for: " << instance_name;
        }
    }

    int32_t GetNumSlots() const override {
        int32_t ret = -1;
@@ -179,7 +197,7 @@ class BootControlClientAidl final : public BootControlClient {
    }

  private:
    const std::shared_ptr<IBootControl> module_;
    std::shared_ptr<IBootControl> module_;
    AIBinder_DeathRecipient* boot_control_death_recipient;
    static void onBootControlServiceDied(void* client) {
        BootControlClientAidl* self = static_cast<BootControlClientAidl*>(client);