summaryrefslogtreecommitdiffstats
path: root/storaged
diff options
context:
space:
mode:
authorJin Qian <jinqian@google.com>2017-03-31 14:26:23 -0700
committerJin Qian <jinqian@google.com>2017-04-04 17:45:41 +0000
commit566e63da538b627f00e35c5f80b4215534c7d6cb (patch)
tree7e5bbb7ef31a4db813c3190db6eca2cabad77f6f /storaged
parent4882eaba25a4a51d49c3e2122dec6bbc0640a1d7 (diff)
downloadsystem_core-566e63da538b627f00e35c5f80b4215534c7d6cb.tar.gz
system_core-566e63da538b627f00e35c5f80b4215534c7d6cb.tar.bz2
system_core-566e63da538b627f00e35c5f80b4215534c7d6cb.zip
storaged: exit if batteryproperties service is dead.
storaged relies on batteryproperties service (healthd) to provide charger stats. If healthd is killed, kill storaged as well. Both will be restarted by init process anyway to restore a correct state. Test: kill healthd when storaged is running Bug: 36652060 Merged-In: Ia785bb6f5ea259aa43cd1efab9505ebefaf3db12 Change-Id: Ia785bb6f5ea259aa43cd1efab9505ebefaf3db12
Diffstat (limited to 'storaged')
-rw-r--r--storaged/include/storaged.h6
-rw-r--r--storaged/storaged.cpp13
2 files changed, 17 insertions, 2 deletions
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 <vector>
#include <batteryservice/IBatteryPropertiesListener.h>
+#include <batteryservice/IBatteryPropertiesRegistrar.h>
#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<IBatteryPropertiesRegistrar> 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<IBinder>& 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<IBatteryPropertiesRegistrar> 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<IBinder>& 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 */