Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5df13ef3 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

SensorService doesn't crash if correct HAL is not present

Change-Id: I83700b1a1b43390f5830e1056572bfb16e58e8e4
parent b9cdead4
Loading
Loading
Loading
Loading
+33 −14
Original line number Diff line number Diff line
@@ -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));

    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));

    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);
            }
        }

        if (mSensorDevice) {
            run("SensorService", PRIORITY_URGENT_DISPLAY);
            mInitCheck = NO_ERROR;
        }
    }
}

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);

+1 −0
Original line number Diff line number Diff line
@@ -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;