diff options
author | 2013-09-09 23:36:25 -0700 | |
---|---|---|
committer | 2013-09-10 21:10:53 -0700 | |
commit | 90ed3e8d7883d9c80fb8bf11b1c593bd8b2b39d0 (patch) | |
tree | 18e3cac4c05f7b19989dff34b507118c44bbd59b /include/gui/BitTube.h | |
parent | 63108c34ec181e923b68ee840bb7960f205466a7 (diff) |
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
Diffstat (limited to 'include/gui/BitTube.h')
-rw-r--r-- | include/gui/BitTube.h | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/include/gui/BitTube.h b/include/gui/BitTube.h index 3022d05f06..d32df846e8 100644 --- a/include/gui/BitTube.h +++ b/include/gui/BitTube.h @@ -33,30 +33,49 @@ class BitTube : public RefBase { 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; - 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; + // get receive file-descriptor + int getFd() 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; |