diff options
author | Mathias Agopian <mathias@google.com> | 2011-05-27 16:23:58 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2011-05-27 16:36:58 -0700 |
commit | 9ff73de08f137ba03e18b8fd9fe0b070029c00f5 (patch) | |
tree | eec8ba3644b7512155f92c5aa41861577faff95c /services/sensorservice | |
parent | c12b7ba81ec3b486f21394810d827258ba888ee4 (diff) | |
download | frameworks_base-9ff73de08f137ba03e18b8fd9fe0b070029c00f5.zip frameworks_base-9ff73de08f137ba03e18b8fd9fe0b070029c00f5.tar.gz frameworks_base-9ff73de08f137ba03e18b8fd9fe0b070029c00f5.tar.bz2 |
Fix a few issues with sensors reference-counting
Diffstat (limited to 'services/sensorservice')
-rw-r--r-- | services/sensorservice/SensorDevice.cpp | 22 | ||||
-rw-r--r-- | services/sensorservice/SensorService.cpp | 10 | ||||
-rw-r--r-- | services/sensorservice/SensorService.h | 2 |
3 files changed, 32 insertions, 2 deletions
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index f192913..b3c8ef5 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -29,6 +29,7 @@ #include <hardware/sensors.h> #include "SensorDevice.h" +#include "SensorService.h" namespace android { // --------------------------------------------------------------------------- @@ -166,17 +167,32 @@ status_t SensorDevice::activate(void* ident, int handle, int enabled) bool actuateHardware = false; Info& info( mActivationCount.editValueFor(handle) ); + + + LOGD_IF(DEBUG_CONNECTIONS, + "SensorDevice::activate: ident=%p, handle=0x%08x, enabled=%d, count=%d", + ident, handle, enabled, info.rates.size()); + if (enabled) { Mutex::Autolock _l(mLock); + LOGD_IF(DEBUG_CONNECTIONS, "... index=%ld", + info.rates.indexOfKey(ident)); + if (info.rates.indexOfKey(ident) < 0) { info.rates.add(ident, DEFAULT_EVENTS_PERIOD); - actuateHardware = true; + if (info.rates.size() == 1) { + actuateHardware = true; + } } else { // sensor was already activated for this ident } } else { Mutex::Autolock _l(mLock); - if (info.rates.removeItem(ident) >= 0) { + LOGD_IF(DEBUG_CONNECTIONS, "... index=%ld", + info.rates.indexOfKey(ident)); + + ssize_t idx = info.rates.removeItem(ident); + if (idx >= 0) { if (info.rates.size() == 0) { actuateHardware = true; } @@ -186,6 +202,8 @@ status_t SensorDevice::activate(void* ident, int handle, int enabled) } if (actuateHardware) { + LOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w"); + err = mSensorDevice->activate(mSensorDevice, handle, enabled); if (enabled) { LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err)); diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index c5e69ff..f1db2f5 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -297,16 +297,25 @@ void SensorService::cleanupConnection(SensorEventConnection* c) Mutex::Autolock _l(mLock); const wp<SensorEventConnection> connection(c); size_t size = mActiveSensors.size(); + LOGD_IF(DEBUG_CONNECTIONS, "%d active sensors", size); for (size_t i=0 ; i<size ; ) { int handle = mActiveSensors.keyAt(i); if (c->hasSensor(handle)) { + LOGD_IF(DEBUG_CONNECTIONS, "%i: disabling handle=0x%08x", i, handle); SensorInterface* sensor = mSensorMap.valueFor( handle ); + LOGE_IF(!sensor, "mSensorMap[handle=0x%08x] is null!", handle); if (sensor) { sensor->activate(c, false); } } SensorRecord* rec = mActiveSensors.valueAt(i); + LOGE_IF(!rec, "mActiveSensors[%d] is null (handle=0x%08x)!", i, handle); + LOGD_IF(DEBUG_CONNECTIONS, + "removing connection %p for sensor[%d].handle=0x%08x", + c, i, handle); + if (rec && rec->removeConnection(connection)) { + LOGD_IF(DEBUG_CONNECTIONS, "... and it was the last connection"); mActiveSensors.removeItemsAt(i, 1); mActiveVirtualSensors.removeItem(handle); delete rec; @@ -446,6 +455,7 @@ SensorService::SensorEventConnection::SensorEventConnection( SensorService::SensorEventConnection::~SensorEventConnection() { + LOGD_IF(DEBUG_CONNECTIONS, "~SensorEventConnection(%p)", this); mService->cleanupConnection(this); } diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h index 21f12bd..77a7e34 100644 --- a/services/sensorservice/SensorService.h +++ b/services/sensorservice/SensorService.h @@ -38,6 +38,8 @@ // --------------------------------------------------------------------------- +#define DEBUG_CONNECTIONS false + struct sensors_poll_device_t; struct sensors_module_t; |