sensors: clean up sensor if activate fails and catch all exceptions
Free sensor resources if the activate function fails.
Catch all exceptions (not only std::runtime_error) because the
upper layer doesn't expect them.
BUG=26084010
Tracked-On: https://jira01.devtools.intel.com/browse/BP-157
Change-Id: Ide399e32a85c858cb407010675d90c7997b0cc9d
Signed-off-by: Constantin Musca <constantin.musca@intel.com>
diff --git a/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp b/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp
index 1e0d9ab..25ef666 100644
--- a/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp
+++ b/peripheral/sensors/edison_arduino/SensorDescriptionFactory.cpp
@@ -29,23 +29,17 @@
struct sensor_t const *
SensorDescriptionFactory::getDescription(Sensor::Type type) {
- try {
- switch(type) {
- case Sensor::Type::kMPU9150Accelerometer:
- return &MPU9150Accelerometer::kSensorDescription;
- break;
- case Sensor::Type::kMMA7660Accelerometer:
- return &MMA7660Accelerometer::kSensorDescription;
- break;
- case Sensor::Type::kGroveLight:
- return &GroveLight::kSensorDescription;
- break;
- default:
- ALOGE("%s: No %d sensor description available.",__func__, type);
- }
- } catch (const std::runtime_error& e) {
- ALOGE("%s: Failed to get sensor %d description.",__func__, type);
+ switch(type) {
+ case Sensor::Type::kMPU9150Accelerometer:
+ return &MPU9150Accelerometer::kSensorDescription;
+ case Sensor::Type::kMMA7660Accelerometer:
+ return &MMA7660Accelerometer::kSensorDescription;
+ case Sensor::Type::kGroveLight:
+ return &GroveLight::kSensorDescription;
+ default:
+ ALOGE("%s: No %d sensor description available.", __func__, type);
}
+
return nullptr;
}
diff --git a/peripheral/sensors/edison_arduino/SensorFactory.cpp b/peripheral/sensors/edison_arduino/SensorFactory.cpp
index 3404133..2b0c4aa 100644
--- a/peripheral/sensors/edison_arduino/SensorFactory.cpp
+++ b/peripheral/sensors/edison_arduino/SensorFactory.cpp
@@ -20,26 +20,20 @@
#include "sensors/Sensors.hpp"
Sensor * SensorFactory::createSensor(Sensor::Type type) {
- try {
- switch(type) {
- case Sensor::Type::kMPU9150Accelerometer:
- return new MPU9150Accelerometer(
- SensorDescriptionFactory::getI2cBusNumber(),
- MPU9150_DEFAULT_I2C_ADDR, AK8975_DEFAULT_I2C_ADDR, false);
- break;
- case Sensor::Type::kMMA7660Accelerometer:
- return new MMA7660Accelerometer(
- SensorDescriptionFactory::getI2cBusNumber(),
- MMA7660_DEFAULT_I2C_ADDR);
- break;
- case Sensor::Type::kGroveLight:
- return new GroveLight(0);
- break;
- default:
- ALOGE("%s: No %d sensor available.",__func__, type);
- }
- } catch (const std::runtime_error& e) {
- ALOGE("%s: Failed to instantiate sensor %d.",__func__, type);
+ switch(type) {
+ case Sensor::Type::kMPU9150Accelerometer:
+ return new MPU9150Accelerometer(
+ SensorDescriptionFactory::getI2cBusNumber(),
+ MPU9150_DEFAULT_I2C_ADDR, AK8975_DEFAULT_I2C_ADDR, false);
+ case Sensor::Type::kMMA7660Accelerometer:
+ return new MMA7660Accelerometer(
+ SensorDescriptionFactory::getI2cBusNumber(),
+ MMA7660_DEFAULT_I2C_ADDR);
+ case Sensor::Type::kGroveLight:
+ return new GroveLight(0);
+ default:
+ ALOGE("%s: No %d sensor available.", __func__, type);
}
+
return nullptr;
}
diff --git a/peripheral/sensors/edison_arduino/SensorsHAL.cpp b/peripheral/sensors/edison_arduino/SensorsHAL.cpp
index 1863f1c..a2d9fa1 100644
--- a/peripheral/sensors/edison_arduino/SensorsHAL.cpp
+++ b/peripheral/sensors/edison_arduino/SensorsHAL.cpp
@@ -55,7 +55,7 @@
int rc = 0;
if (enabled != 0 && enabled != 1) {
- ALOGE("%s: Invaled parameter", __func__);
+ ALOGE("%s: Invalid parameter", __func__);
return -EINVAL;
}
@@ -71,6 +71,9 @@
return -1;
}
rc = sensors[handle]->activate(handle, enabled);
+ if (rc != 0) {
+ goto delete_sensor;
+ }
} else {
return 0;
}
@@ -83,11 +86,21 @@
return 0;
}
}
+
return rc;
- } catch (const std::runtime_error& e) {
- ALOGE("%s: Failed to activate sensor(s). keep running", __func__);
- return -1;
+ } catch (const std::exception& e) {
+ /* The upper layer doesn't expect exceptions. Catch them all. */
+ ALOGE("%s: Failed to %s sensor %d. Error message: %s.",
+ __func__, enabled ? "activate" : "deactivate", handle, e.what());
}
+
+delete_sensor:
+ if (sensors[handle] != nullptr) {
+ delete sensors[handle];
+ sensors[handle] = nullptr;
+ }
+
+ return -1;
}
int SensorContext::setDelay(int handle, int64_t ns) {