From a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Fri, 27 May 2011 16:23:58 -0700 Subject: [PATCH] Fix a few issues with sensors reference-counting --- services/sensorservice/SensorDevice.cpp | 22 ++++++++++++++++++++-- services/sensorservice/SensorService.cpp | 10 ++++++++++ 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 f192913fd..b3c8ef59e 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -29,6 +29,7 @@ #include #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 c5e69ff61..f1db2f555 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 connection(c); size_t size = mActiveSensors.size(); + LOGD_IF(DEBUG_CONNECTIONS, "%d active sensors", size); for (size_t i=0 ; ihasSensor(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 21f12bdbc..77a7e34e8 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;