summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-07-22 16:18:10 -0700
committerMathias Agopian <mathias@google.com>2010-07-22 16:18:10 -0700
commitefba8bf53aa6d0efb8cf778aaa63a482b813d2b1 (patch)
treef40319f8114e065f9f789dd528cadbc93eb0d0ca /services
parentd8653518449e3dbf03fe6f8b11dbdff5ef6ce60e (diff)
downloadframeworks_base-efba8bf53aa6d0efb8cf778aaa63a482b813d2b1.zip
frameworks_base-efba8bf53aa6d0efb8cf778aaa63a482b813d2b1.tar.gz
frameworks_base-efba8bf53aa6d0efb8cf778aaa63a482b813d2b1.tar.bz2
filter sensor event by connection
we now don't send events down to a connection that has not registered for this event. Change-Id: I3fe507974d3e99293749bfec2ef871e8a0ee9600
Diffstat (limited to 'services')
-rw-r--r--services/sensorservice/SensorService.cpp24
-rw-r--r--services/sensorservice/SensorService.h5
2 files changed, 20 insertions, 9 deletions
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 82cdf3d..b79373d 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -40,7 +40,6 @@ namespace android {
/*
* TODO:
- * - filter events per connection
* - make sure to keep the last value of each event type so we can quickly
* send something to application when they enable a sensor that is already
* active (the issue here is that it can take time before a value is
@@ -162,6 +161,7 @@ bool SensorService::threadLoop()
LOGD("nuSensorService thread starting...");
sensors_event_t buffer[16];
+ sensors_event_t scratch[16];
struct sensors_poll_device_t* device = mSensorDevice;
ssize_t count;
@@ -177,10 +177,11 @@ bool SensorService::threadLoop()
size_t numConnections = activeConnections.size();
if (numConnections) {
+ Mutex::Autolock _l(mLock);
for (size_t i=0 ; i<numConnections ; i++) {
sp<SensorEventConnection> connection(activeConnections[i].promote());
if (connection != 0) {
- connection->sendEvents(buffer, count);
+ connection->sendEvents(buffer, count, scratch);
}
}
}
@@ -425,12 +426,23 @@ status_t SensorService::SensorEventConnection::setEventRateLocked(
}
status_t SensorService::SensorEventConnection::sendEvents(
- sensors_event_t const* buffer, size_t count)
+ sensors_event_t const* buffer, size_t numEvents,
+ sensors_event_t* scratch)
{
- // TODO: we should only send the events for the sensors this connection
- // is registered for.
+ // filter out events not for this connection
+ size_t count=0, i=0;
+ while (i<numEvents) {
+ const int32_t curr = buffer[i].sensor;
+ if (mSensorInfo.indexOfKey(curr) >= 0) {
+ do {
+ scratch[count++] = buffer[i++];
+ } while ((i<numEvents) && (buffer[i].sensor == curr));
+ } else {
+ i++;
+ }
+ }
- ssize_t size = mChannel->write(buffer, count*sizeof(sensors_event_t));
+ ssize_t size = mChannel->write(scratch, count*sizeof(sensors_event_t));
if (size == -EAGAIN) {
// the destination doesn't accept events anymore, it's probably
// full. For now, we just drop the events on the floor.
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index b8dda84..f77652d 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -77,8 +77,6 @@ class SensorService :
sp<SensorChannel> const mChannel;
// protected by SensorService::mLock
- //SortedVector<int32_t> mSensorList;
-
struct SensorInfo {
SensorInfo() : ns(DEFAULT_EVENTS_PERIOD) { }
nsecs_t ns;
@@ -88,7 +86,8 @@ class SensorService :
public:
SensorEventConnection(const sp<SensorService>& service);
- status_t sendEvents(sensors_event_t const* buffer, size_t count);
+ status_t sendEvents(sensors_event_t const* buffer, size_t count,
+ sensors_event_t* scratch);
bool hasSensor(int32_t handle) const;
bool hasAnySensor() const;
bool addSensor(int32_t handle);