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/include/gui/BitTube.h b/include/gui/BitTube.h
index 3022d05..d32df84 100644
--- a/include/gui/BitTube.h
+++ b/include/gui/BitTube.h
@@ -33,30 +33,49 @@
{
public:
- BitTube();
- BitTube(const Parcel& data);
+ // creates a BitTube with a default (4KB) send buffer
+ BitTube();
+
+ // creates a BitTube with a a specified send and receive buffer size
+ explicit BitTube(size_t bufsize);
+
+ explicit BitTube(const Parcel& data);
virtual ~BitTube();
+ // check state after construction
status_t initCheck() const;
+
+ // get receive file-descriptor
int getFd() const;
- ssize_t write(void const* vaddr, size_t size);
- ssize_t read(void* vaddr, size_t size);
- status_t writeToParcel(Parcel* reply) const;
-
+ // send objects (sized blobs). All objects are guaranteed to be written or the call fails.
template <typename T>
static ssize_t sendObjects(const sp<BitTube>& tube,
T const* events, size_t count) {
return sendObjects(tube, events, count, sizeof(T));
}
+ // receive objects (sized blobs). If the receiving buffer isn't large enough,
+ // excess messages are silently discarded.
template <typename T>
static ssize_t recvObjects(const sp<BitTube>& tube,
T* events, size_t count) {
return recvObjects(tube, events, count, sizeof(T));
}
+ // parcels this BitTube
+ status_t writeToParcel(Parcel* reply) const;
+
private:
+ void init(size_t rcvbuf, size_t sndbuf);
+
+ // send a message. The write is guaranteed to send the whole message or fail.
+ ssize_t write(void const* vaddr, size_t size);
+
+ // receive a message. the passed buffer must be at least as large as the
+ // write call used to send the message, excess data is silently discarded.
+ ssize_t read(void* vaddr, size_t size);
+
int mSendFd;
mutable int mReceiveFd;
diff --git a/include/gui/SensorEventQueue.h b/include/gui/SensorEventQueue.h
index 8d8493b..a3a9daa 100644
--- a/include/gui/SensorEventQueue.h
+++ b/include/gui/SensorEventQueue.h
@@ -49,6 +49,9 @@
class SensorEventQueue : public ASensorEventQueue, public RefBase
{
public:
+
+ enum { MAX_RECEIVE_BUFFER_EVENT_COUNT = 256 };
+
SensorEventQueue(const sp<ISensorEventConnection>& connection);
virtual ~SensorEventQueue();
virtual void onFirstRef();
@@ -79,6 +82,9 @@
sp<BitTube> mSensorChannel;
mutable Mutex mLock;
mutable sp<Looper> mLooper;
+ ASensorEvent* mRecBuffer;
+ size_t mAvailable;
+ size_t mConsumed;
};
// ----------------------------------------------------------------------------