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
This commit is contained in:
Mathias Agopian 2010-11-10 17:50:28 -08:00
parent 24d72350f3
commit 94e8f6813f
2 changed files with 22 additions and 14 deletions

View File

@ -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
{

View File

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