summaryrefslogtreecommitdiffstats
path: root/services/sensorservice
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-11-10 17:50:28 -0800
committerMathias Agopian <mathias@google.com>2010-11-10 17:50:28 -0800
commit3a9223ebf881b10996dac34b00e51e08a602d44b (patch)
tree68d9fb04e5f7b07ab2c47e93c4eb8d3879c8e8c4 /services/sensorservice
parent77f5c9542e159cb9f2f2908227212d4add8ce74c (diff)
downloadframeworks_base-3a9223ebf881b10996dac34b00e51e08a602d44b.zip
frameworks_base-3a9223ebf881b10996dac34b00e51e08a602d44b.tar.gz
frameworks_base-3a9223ebf881b10996dac34b00e51e08a602d44b.tar.bz2
record the last event received regardless of having clients or not
We only recorded the last received event (which is needed when a sensor is activated on a connection) when there was some connection active. This should fix an issue where sometimes the light sensor doesn't return an event whent activated. we also didn't need to hold the main lock while dispatching events to clients. Change-Id: I6c6386c040051ce205e3c0516c678e0603fa45e1
Diffstat (limited to 'services/sensorservice')
-rw-r--r--services/sensorservice/SensorService.cpp34
-rw-r--r--services/sensorservice/SensorService.h2
2 files changed, 22 insertions, 14 deletions
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index c9ab992..b5e73ac 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -218,25 +218,13 @@ bool SensorService::threadLoop()
break;
}
+ recordLastValue(buffer, count);
+
const SortedVector< wp<SensorEventConnection> > activeConnections(
getActiveConnections());
size_t numConnections = activeConnections.size();
if (numConnections) {
- Mutex::Autolock _l(mLock);
-
- // record the last event for each sensor
- int32_t prev = buffer[0].sensor;
- for (ssize_t i=1 ; i<count ; i++) {
- // record the last event of each sensor type in this buffer
- int32_t curr = buffer[i].sensor;
- if (curr != prev) {
- mLastEventSeen.editValueFor(prev) = buffer[i-1];
- prev = curr;
- }
- }
- mLastEventSeen.editValueFor(prev) = buffer[count-1];
-
for (size_t i=0 ; i<numConnections ; i++) {
sp<SensorEventConnection> connection(activeConnections[i].promote());
if (connection != 0) {
@@ -251,6 +239,24 @@ bool SensorService::threadLoop()
return false;
}
+void SensorService::recordLastValue(
+ sensors_event_t const * buffer, size_t count)
+{
+ Mutex::Autolock _l(mLock);
+
+ // record the last event for each sensor
+ int32_t prev = buffer[0].sensor;
+ for (size_t i=1 ; i<count ; i++) {
+ // record the last event of each sensor type in this buffer
+ int32_t curr = buffer[i].sensor;
+ if (curr != prev) {
+ mLastEventSeen.editValueFor(prev) = buffer[i-1];
+ prev = curr;
+ }
+ }
+ mLastEventSeen.editValueFor(prev) = buffer[count-1];
+}
+
SortedVector< wp<SensorService::SensorEventConnection> >
SensorService::getActiveConnections() const
{
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index dfb1c0e..b442779 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -111,6 +111,8 @@ class SensorService :
String8 getSensorName(int handle) const;
status_t recomputeEventsPeriodLocked(int32_t handle);
+ void recordLastValue(sensors_event_t const * buffer, size_t count);
+
// constants
Vector<Sensor> mSensorList;
struct sensors_poll_device_t* mSensorDevice;