healthd: move Android communication code to separate source

* add ops for different "modes" of healthd operation: android vs. recovery
* recovery mode selected by runstring options -r
* binder/Android communication moved to android mode
* recovery mode ops avoiding binder service registration
* "no service manager" flag removed; now handled by android vs. other modes

Change-Id: I3d8c89bf96a18a6a00cc85306f9a07d3f408f2a0
This commit is contained in:
Todd Poynor 2013-09-10 12:40:00 -07:00
parent 98c23d82f0
commit c7464c9150
6 changed files with 133 additions and 45 deletions

View file

@ -13,6 +13,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
healthd.cpp \
healthd_mode_android.cpp \
BatteryMonitor.cpp \
BatteryPropertiesRegistrar.cpp

View file

@ -18,7 +18,6 @@
#include "healthd.h"
#include "BatteryMonitor.h"
#include "BatteryPropertiesRegistrar.h"
#include <dirent.h>
#include <errno.h>
@ -266,9 +265,7 @@ bool BatteryMonitor::update(void) {
props.chargerWirelessOnline ? "w" : "");
}
if (mBatteryPropertiesRegistrar != NULL)
mBatteryPropertiesRegistrar->notifyListeners(props);
healthd_mode_ops->battery_update(&props);
return props.chargerAcOnline | props.chargerUsbOnline |
props.chargerWirelessOnline;
}
@ -317,7 +314,7 @@ status_t BatteryMonitor::getProperty(int id, struct BatteryProperty *val) {
return ret;
}
void BatteryMonitor::init(struct healthd_config *hc, bool nosvcmgr) {
void BatteryMonitor::init(struct healthd_config *hc) {
String8 path;
mHealthdConfig = hc;
@ -467,11 +464,6 @@ void BatteryMonitor::init(struct healthd_config *hc, bool nosvcmgr) {
KLOG_WARNING(LOG_TAG, "BatteryTemperaturePath not found\n");
if (mHealthdConfig->batteryTechnologyPath.isEmpty())
KLOG_WARNING(LOG_TAG, "BatteryTechnologyPath not found\n");
if (nosvcmgr == false) {
mBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();
mBatteryPropertiesRegistrar->publish();
}
}
}; // namespace android

View file

@ -23,12 +23,9 @@
#include <utils/Vector.h>
#include "healthd.h"
#include "BatteryPropertiesRegistrar.h"
namespace android {
class BatteryPropertiesRegistrar;
class BatteryMonitor {
public:
@ -40,7 +37,7 @@ class BatteryMonitor {
ANDROID_POWER_SUPPLY_TYPE_BATTERY
};
void init(struct healthd_config *hc, bool nosvcmgr);
void init(struct healthd_config *hc);
bool update(void);
status_t getProperty(int id, struct BatteryProperty *val);
@ -48,8 +45,6 @@ class BatteryMonitor {
struct healthd_config *mHealthdConfig;
Vector<String8> mChargerNames;
sp<BatteryPropertiesRegistrar> mBatteryPropertiesRegistrar;
int getBatteryStatus(const char* status);
int getBatteryHealth(const char* status);
int readFromFile(const String8& path, char* buf, size_t size);

View file

@ -25,8 +25,6 @@
#include <stdlib.h>
#include <unistd.h>
#include <batteryservice/BatteryService.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <cutils/klog.h>
#include <cutils/uevent.h>
#include <sys/epoll.h>
@ -72,7 +70,50 @@ static int wakealarm_wake_interval = DEFAULT_PERIODIC_CHORES_INTERVAL_FAST;
static BatteryMonitor* gBatteryMonitor;
static bool nosvcmgr;
struct healthd_mode_ops *healthd_mode_ops;
// Android mode
extern void healthd_mode_android_init(struct healthd_config *config);
extern int healthd_mode_android_preparetowait(void);
extern void healthd_mode_android_battery_update(
struct android::BatteryProperties *props);
// NOPs for modes that need no special action
static void healthd_mode_nop_init(struct healthd_config *config);
static int healthd_mode_nop_preparetowait(void);
static void healthd_mode_nop_heartbeat(void);
static void healthd_mode_nop_battery_update(
struct android::BatteryProperties *props);
static struct healthd_mode_ops android_ops = {
.init = healthd_mode_android_init,
.preparetowait = healthd_mode_android_preparetowait,
.heartbeat = healthd_mode_nop_heartbeat,
.battery_update = healthd_mode_android_battery_update,
};
static struct healthd_mode_ops recovery_ops = {
.init = healthd_mode_nop_init,
.preparetowait = healthd_mode_nop_preparetowait,
.heartbeat = healthd_mode_nop_heartbeat,
.battery_update = healthd_mode_nop_battery_update,
};
static void healthd_mode_nop_init(struct healthd_config *config) {
}
static int healthd_mode_nop_preparetowait(void) {
return -1;
}
static void healthd_mode_nop_heartbeat(void) {
}
static void healthd_mode_nop_battery_update(
struct android::BatteryProperties *props) {
}
int healthd_register_event(int fd, void (*handler)(uint32_t)) {
struct epoll_event ev;
@ -208,32 +249,17 @@ static void wakealarm_init(void) {
wakealarm_set_interval(healthd_config.periodic_chores_interval_fast);
}
static void binder_event(uint32_t revents) {
IPCThreadState::self()->handlePolledCommands();
}
static void binder_init(void) {
int binder_fd;
ProcessState::self()->setThreadPoolMaxThreadCount(0);
IPCThreadState::self()->disableBackgroundScheduling(true);
IPCThreadState::self()->setupPolling(&binder_fd);
if (binder_fd >= 0) {
if (healthd_register_event(binder_fd, binder_event))
KLOG_ERROR(LOG_TAG,
"Register for binder events failed\n");
}
}
static void healthd_mainloop(void) {
while (1) {
struct epoll_event events[eventct];
int nevents;
int timeout = awake_poll_interval;
int mode_timeout;
IPCThreadState::self()->flushCommands();
nevents = epoll_wait(epollfd, events, eventct, awake_poll_interval);
mode_timeout = healthd_mode_ops->preparetowait();
if (timeout < 0 || (mode_timeout > 0 && mode_timeout < timeout))
timeout = mode_timeout;
nevents = epoll_wait(epollfd, events, eventct, timeout);
if (nevents == -1) {
if (errno == EINTR)
@ -249,6 +275,8 @@ static void healthd_mainloop(void) {
if (!nevents)
periodic_chores();
healthd_mode_ops->heartbeat();
}
return;
@ -263,12 +291,12 @@ static int healthd_init() {
return -1;
}
healthd_mode_ops->init(&healthd_config);
healthd_board_init(&healthd_config);
wakealarm_init();
uevent_init();
binder_init();
gBatteryMonitor = new BatteryMonitor();
gBatteryMonitor->init(&healthd_config, nosvcmgr);
gBatteryMonitor->init(&healthd_config);
return 0;
}
@ -277,11 +305,12 @@ int main(int argc, char **argv) {
int ret;
klog_set_level(KLOG_LEVEL);
healthd_mode_ops = &android_ops;
while ((ch = getopt(argc, argv, "n")) != -1) {
while ((ch = getopt(argc, argv, "r")) != -1) {
switch (ch) {
case 'n':
nosvcmgr = true;
case 'r':
healthd_mode_ops = &recovery_ops;
break;
case '?':
default:

View file

@ -73,6 +73,15 @@ void healthd_battery_update();
android::status_t healthd_get_property(int id,
struct android::BatteryProperty *val);
struct healthd_mode_ops {
void (*init)(struct healthd_config *config);
int (*preparetowait)(void);
void (*heartbeat)(void);
void (*battery_update)(struct android::BatteryProperties *props);
};
extern struct healthd_mode_ops *healthd_mode_ops;
// The following are implemented in libhealthd_board to handle board-specific
// behavior.
//

View file

@ -0,0 +1,62 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "healthd-android"
#include "healthd.h"
#include "BatteryPropertiesRegistrar.h"
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <cutils/klog.h>
#include <sys/epoll.h>
using namespace android;
static int gBinderFd;
static sp<BatteryPropertiesRegistrar> gBatteryPropertiesRegistrar;
void healthd_mode_android_battery_update(
struct android::BatteryProperties *props) {
if (gBatteryPropertiesRegistrar != NULL)
gBatteryPropertiesRegistrar->notifyListeners(*props);
return;
}
int healthd_mode_android_preparetowait(void) {
IPCThreadState::self()->flushCommands();
return -1;
}
static void binder_event(uint32_t epevents) {
IPCThreadState::self()->handlePolledCommands();
}
void healthd_mode_android_init(struct healthd_config *config) {
ProcessState::self()->setThreadPoolMaxThreadCount(0);
IPCThreadState::self()->disableBackgroundScheduling(true);
IPCThreadState::self()->setupPolling(&gBinderFd);
if (gBinderFd >= 0) {
if (healthd_register_event(gBinderFd, binder_event))
KLOG_ERROR(LOG_TAG,
"Register for binder events failed\n");
}
gBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();
gBatteryPropertiesRegistrar->publish();
}