fix a few problems with BitTube
BitTube used to send objects one at a time and didn't
handle errors properly.
We now send all the objects in one call, which means they
have to be read as a single batch as well. This changes the
BitTube API.
Update SensorService to the new API.
Also added an API to set the size of the send buffer.
Bug: 10641596
Change-Id: I77c70d35e351fdba0416fae4b7ca3b1d56272251
diff --git a/libs/gui/SensorEventQueue.cpp b/libs/gui/SensorEventQueue.cpp
index 08b8ac8..ab50c1d 100644
--- a/libs/gui/SensorEventQueue.cpp
+++ b/libs/gui/SensorEventQueue.cpp
@@ -35,12 +35,12 @@
// ----------------------------------------------------------------------------
SensorEventQueue::SensorEventQueue(const sp<ISensorEventConnection>& connection)
- : mSensorEventConnection(connection)
-{
+ : mSensorEventConnection(connection), mRecBuffer(NULL), mAvailable(0), mConsumed(0) {
+ mRecBuffer = new ASensorEvent[MAX_RECEIVE_BUFFER_EVENT_COUNT];
}
-SensorEventQueue::~SensorEventQueue()
-{
+SensorEventQueue::~SensorEventQueue() {
+ delete [] mRecBuffer;
}
void SensorEventQueue::onFirstRef()
@@ -59,9 +59,21 @@
return BitTube::sendObjects(tube, events, numEvents);
}
-ssize_t SensorEventQueue::read(ASensorEvent* events, size_t numEvents)
-{
- return BitTube::recvObjects(mSensorChannel, events, numEvents);
+ssize_t SensorEventQueue::read(ASensorEvent* events, size_t numEvents) {
+ if (mAvailable == 0) {
+ ssize_t err = BitTube::recvObjects(mSensorChannel,
+ mRecBuffer, MAX_RECEIVE_BUFFER_EVENT_COUNT);
+ if (err < 0) {
+ return err;
+ }
+ mAvailable = err;
+ mConsumed = 0;
+ }
+ size_t count = numEvents < mAvailable ? numEvents : mAvailable;
+ memcpy(events, mRecBuffer + mConsumed, count*sizeof(ASensorEvent));
+ mAvailable -= count;
+ mConsumed += count;
+ return count;
}
sp<Looper> SensorEventQueue::getLooper() const