Skip to content

Commit

Permalink
[sensorservice] Init batterystats service when needed
Browse files Browse the repository at this point in the history
This avoid race condition at parallel services start up that
may results in sensor power usage not being properly recorded.

Test: check all sensors, they still work
Bug: 33199244
Bug: 33623300

Change-Id: I48946667db54fc72d9be6c13b981b44d1bab88c2
(cherry picked from commit 0a03159)
  • Loading branch information
Peng Xu committed Dec 17, 2016
1 parent c556562 commit 0f48c45
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
24 changes: 15 additions & 9 deletions services/sensorservice/BatteryService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,7 @@
namespace android {
// ---------------------------------------------------------------------------

BatteryService::BatteryService() {
const sp<IServiceManager> sm(defaultServiceManager());
if (sm != NULL) {
const String16 name("batterystats");
mBatteryStatService = interface_cast<IBatteryStats>(sm->getService(name));
}
BatteryService::BatteryService() : mBatteryStatService(nullptr) {
}

bool BatteryService::addSensor(uid_t uid, int handle) {
Expand All @@ -61,7 +56,7 @@ bool BatteryService::removeSensor(uid_t uid, int handle) {


void BatteryService::enableSensorImpl(uid_t uid, int handle) {
if (mBatteryStatService != 0) {
if (checkService()) {
if (addSensor(uid, handle)) {
int64_t identity = IPCThreadState::self()->clearCallingIdentity();
mBatteryStatService->noteStartSensor(uid, handle);
Expand All @@ -70,7 +65,7 @@ void BatteryService::enableSensorImpl(uid_t uid, int handle) {
}
}
void BatteryService::disableSensorImpl(uid_t uid, int handle) {
if (mBatteryStatService != 0) {
if (checkService()) {
if (removeSensor(uid, handle)) {
int64_t identity = IPCThreadState::self()->clearCallingIdentity();
mBatteryStatService->noteStopSensor(uid, handle);
Expand All @@ -80,7 +75,7 @@ void BatteryService::disableSensorImpl(uid_t uid, int handle) {
}

void BatteryService::cleanupImpl(uid_t uid) {
if (mBatteryStatService != 0) {
if (checkService()) {
Mutex::Autolock _l(mActivationsLock);
int64_t identity = IPCThreadState::self()->clearCallingIdentity();
for (size_t i=0 ; i<mActivations.size() ; i++) {
Expand All @@ -95,6 +90,17 @@ void BatteryService::cleanupImpl(uid_t uid) {
}
}

bool BatteryService::checkService() {
if (mBatteryStatService == nullptr) {
const sp<IServiceManager> sm(defaultServiceManager());
if (sm != NULL) {
const String16 name("batterystats");
mBatteryStatService = interface_cast<IBatteryStats>(sm->getService(name));
}
}
return mBatteryStatService != nullptr;
}

ANDROID_SINGLETON_STATIC_INSTANCE(BatteryService)

// ---------------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions services/sensorservice/BatteryService.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class BatteryService : public Singleton<BatteryService> {
SortedVector<Info> mActivations;
bool addSensor(uid_t uid, int handle);
bool removeSensor(uid_t uid, int handle);
bool checkService();

public:
static void enableSensor(uid_t uid, int handle) {
Expand Down

0 comments on commit 0f48c45

Please sign in to comment.