summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-07-19 19:09:10 -0700
committerMathias Agopian <mathias@google.com>2012-06-27 17:07:53 -0700
commit50df2959e58fc7408f98d11d77c8428397dca445 (patch)
tree53ca49cb7741d83e7668114810e61596f252f01e
parent5d2707214dfb97bd8dfcc6620be36841d3c82420 (diff)
downloadframeworks_native-50df2959e58fc7408f98d11d77c8428397dca445.zip
frameworks_native-50df2959e58fc7408f98d11d77c8428397dca445.tar.gz
frameworks_native-50df2959e58fc7408f98d11d77c8428397dca445.tar.bz2
SensorService doesn't crash if correct HAL is not present
Change-Id: I83700b1a1b43390f5830e1056572bfb16e58e8e4
-rw-r--r--services/sensorservice/SensorService.cpp47
-rw-r--r--services/sensorservice/SensorService.h1
2 files changed, 34 insertions, 14 deletions
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 3fe3a5d..fec9153 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -79,35 +79,45 @@ ANDROID_SINGLETON_STATIC_INSTANCE(BatteryService)
SensorService::SensorService()
: Thread(false),
- mDump("android.permission.DUMP")
+ mSensorDevice(0),
+ mSensorModule(0),
+ mDump("android.permission.DUMP"),
+ mInitCheck(NO_INIT)
{
}
void SensorService::onFirstRef()
{
+ LOGD("nuSensorService starting...");
+
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);
LOGE_IF(err, "couldn't load %s module (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
- err = sensors_open(&mSensorModule->common, &mSensorDevice);
+ if (mSensorModule) {
+ err = sensors_open(&mSensorModule->common, &mSensorDevice);
- LOGE_IF(err, "couldn't open device for module %s (%s)",
- SENSORS_HARDWARE_MODULE_ID, strerror(-err));
+ LOGE_IF(err, "couldn't open device for module %s (%s)",
+ SENSORS_HARDWARE_MODULE_ID, strerror(-err));
- LOGD("nuSensorService starting...");
+ struct sensor_t const* list;
+ int count = mSensorModule->get_sensors_list(mSensorModule, &list);
+ for (int i=0 ; i<count ; i++) {
+ Sensor sensor(list + i);
+ LOGI("%s", sensor.getName().string());
+ mSensorList.add(sensor);
+ if (mSensorDevice) {
+ mSensorDevice->activate(mSensorDevice, sensor.getHandle(), 0);
+ }
+ }
- struct sensor_t const* list;
- int count = mSensorModule->get_sensors_list(mSensorModule, &list);
- for (int i=0 ; i<count ; i++) {
- Sensor sensor(list + i);
- LOGI("%s", sensor.getName().string());
- mSensorList.add(sensor);
- mSensorDevice->activate(mSensorDevice, sensor.getHandle(), 0);
+ if (mSensorDevice) {
+ run("SensorService", PRIORITY_URGENT_DISPLAY);
+ mInitCheck = NO_ERROR;
+ }
}
-
- run("SensorService", PRIORITY_URGENT_DISPLAY);
}
SensorService::~SensorService()
@@ -238,6 +248,9 @@ void SensorService::cleanupConnection(const wp<SensorEventConnection>& connectio
status_t SensorService::enable(const sp<SensorEventConnection>& connection,
int handle)
{
+ if (mInitCheck != NO_ERROR)
+ return mInitCheck;
+
status_t err = NO_ERROR;
Mutex::Autolock _l(mLock);
SensorRecord* rec = mActiveSensors.valueFor(handle);
@@ -265,6 +278,9 @@ status_t SensorService::enable(const sp<SensorEventConnection>& connection,
status_t SensorService::disable(const sp<SensorEventConnection>& connection,
int handle)
{
+ if (mInitCheck != NO_ERROR)
+ return mInitCheck;
+
status_t err = NO_ERROR;
Mutex::Autolock _l(mLock);
SensorRecord* rec = mActiveSensors.valueFor(handle);
@@ -291,6 +307,9 @@ status_t SensorService::disable(const sp<SensorEventConnection>& connection,
status_t SensorService::setRate(const sp<SensorEventConnection>& connection,
int handle, nsecs_t ns)
{
+ if (mInitCheck != NO_ERROR)
+ return mInitCheck;
+
status_t err = NO_ERROR;
Mutex::Autolock _l(mLock);
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index 88b84ec..8731956 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -98,6 +98,7 @@ class SensorService :
struct sensors_poll_device_t* mSensorDevice;
struct sensors_module_t* mSensorModule;
Permission mDump;
+ status_t mInitCheck;
// protected by mLock
mutable Mutex mLock;