diff --git a/storaged/include/storaged.h b/storaged/include/storaged.h index b6a0850c8..514798bff 100644 --- a/storaged/include/storaged.h +++ b/storaged/include/storaged.h @@ -27,6 +27,7 @@ #include #include +#include #include "storaged_info.h" #include "storaged_uid_monitor.h" @@ -245,7 +246,8 @@ struct storaged_config { int event_time_check_usec; // check how much cputime spent in event loop }; -class storaged_t : public BnBatteryPropertiesListener { +class storaged_t : public BnBatteryPropertiesListener, + public IBinder::DeathRecipient { private: time_t mTimer; storaged_config mConfig; @@ -253,6 +255,7 @@ private: disk_stats_monitor mDsm; uid_monitor mUidm; time_t mStarttime; + sp battery_properties; public: storaged_t(void); ~storaged_t() {} @@ -281,6 +284,7 @@ public: void init_battery_service(); virtual void batteryPropertiesChanged(struct BatteryProperties props); + void binderDied(const wp& who); }; // Eventlog tag diff --git a/storaged/storaged.cpp b/storaged/storaged.cpp index 1770922ef..aa3d1de73 100644 --- a/storaged/storaged.cpp +++ b/storaged/storaged.cpp @@ -173,7 +173,7 @@ void storaged_t::init_battery_service() { if (!mConfig.proc_uid_io_available) return; - sp battery_properties = get_battery_properties_service(); + battery_properties = get_battery_properties_service(); if (battery_properties == NULL) { LOG_TO(SYSTEM, WARNING) << "failed to find batteryproperties service"; return; @@ -185,6 +185,17 @@ void storaged_t::init_battery_service() { // register listener after init uid_monitor battery_properties->registerListener(this); + IInterface::asBinder(battery_properties)->linkToDeath(this); +} + +void storaged_t::binderDied(const wp& who) { + if (battery_properties != NULL && + IInterface::asBinder(battery_properties) == who) { + LOG_TO(SYSTEM, ERROR) << "batteryproperties service died, exiting"; + exit(1); + } else { + LOG_TO(SYSTEM, ERROR) << "unknown service died"; + } } /* storaged_t */