From e142428a9c8b9d2380032cd4d7b55ee440fe8770 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Mon, 29 Jul 2013 21:24:40 -0700 Subject: Make Flattenable not virtual Fallout from the Flattenable change, update all its uses. Additionnaly, fix/tighten size checks when (un)flatten()ing things. Removed the assumption by some flattenables (e.g.: Fence) that the size passed to them would be exact (it can and will be larger in some cases) The code in Parcel is a bit complicated so that we don't have to expose the full implementation (and also to keep the code smallish). Change-Id: I0bf1c8aca2a3128491b4f45510bc46667e566dde --- include/binder/Parcel.h | 67 +++++++++++++++++++++++++++++++----- include/gui/IGraphicBufferProducer.h | 15 ++++---- include/gui/Sensor.h | 4 +-- include/ui/Fence.h | 10 +++--- include/ui/GraphicBuffer.h | 13 ++++--- include/ui/Region.h | 4 +-- 6 files changed, 79 insertions(+), 34 deletions(-) (limited to 'include') diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index 3ff95d2..7a782f5 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -27,8 +27,8 @@ // --------------------------------------------------------------------------- namespace android { +template class Flattenable; template class LightFlattenable; -class Flattenable; class IBinder; class IPCThreadState; class ProcessState; @@ -37,8 +37,7 @@ class TextOutput; struct flat_binder_object; // defined in support_p/binder_module.h -class Parcel -{ +class Parcel { public: class ReadableBlob; class WritableBlob; @@ -102,7 +101,9 @@ public: status_t writeString16(const char16_t* str, size_t len); status_t writeStrongBinder(const sp& val); status_t writeWeakBinder(const wp& val); - status_t write(const Flattenable& val); + + template + status_t write(const Flattenable& val); template status_t write(const LightFlattenable& val); @@ -157,7 +158,9 @@ public: const char16_t* readString16Inplace(size_t* outLen) const; sp readStrongBinder() const; wp readWeakBinder() const; - status_t read(Flattenable& val) const; + + template + status_t read(Flattenable& val) const; template status_t read(LightFlattenable& val) const; @@ -260,6 +263,39 @@ private: size_t mSize; }; + class FlattenableHelperInterface { + protected: + ~FlattenableHelperInterface() { } + public: + virtual size_t getFlattenedSize() const = 0; + virtual size_t getFdCount() const = 0; + virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const = 0; + virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) = 0; + }; + + template + class FlattenableHelper : public FlattenableHelperInterface { + friend class Parcel; + const Flattenable& val; + explicit FlattenableHelper(const Flattenable& val) : val(val) { } + + public: + virtual size_t getFlattenedSize() const { + return val.getFlattenedSize(); + } + virtual size_t getFdCount() const { + return val.getFdCount(); + } + virtual status_t flatten(void* buffer, size_t size, int* fds, size_t count) const { + return val.flatten(buffer, size, fds, count); + } + virtual status_t unflatten(void const* buffer, size_t size, int const* fds, size_t count) { + return const_cast&>(val).unflatten(buffer, size, fds, count); + } + }; + status_t write(const FlattenableHelperInterface& val); + status_t read(FlattenableHelperInterface& val) const; + public: class ReadableBlob : public Blob { friend class Parcel; @@ -277,8 +313,14 @@ public: // --------------------------------------------------------------------------- template +status_t Parcel::write(const Flattenable& val) { + const FlattenableHelper helper(val); + return write(helper); +} + +template status_t Parcel::write(const LightFlattenable& val) { - size_t size(val.getSize()); + size_t size(val.getFlattenedSize()); if (!val.isFixedSize()) { status_t err = writeInt32(size); if (err != NO_ERROR) { @@ -287,17 +329,24 @@ status_t Parcel::write(const LightFlattenable& val) { } if (size) { void* buffer = writeInplace(size); - return buffer == NULL ? NO_MEMORY : - val.flatten(buffer); + if (buffer == NULL) + return NO_MEMORY; + return val.flatten(buffer, size); } return NO_ERROR; } template +status_t Parcel::read(Flattenable& val) const { + FlattenableHelper helper(val); + return read(helper); +} + +template status_t Parcel::read(LightFlattenable& val) const { size_t size; if (val.isFixedSize()) { - size = val.getSize(); + size = val.getFlattenedSize(); } else { int32_t s; status_t err = readInt32(&s); diff --git a/include/gui/IGraphicBufferProducer.h b/include/gui/IGraphicBufferProducer.h index 9677962..033c727 100644 --- a/include/gui/IGraphicBufferProducer.h +++ b/include/gui/IGraphicBufferProducer.h @@ -105,7 +105,8 @@ public: // and height of the window and current transform applied to buffers, // respectively. - struct QueueBufferInput : public Flattenable { + struct QueueBufferInput : public Flattenable { + friend class Flattenable; inline QueueBufferInput(const Parcel& parcel); inline QueueBufferInput(int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, bool async, @@ -123,13 +124,11 @@ public: *outFence = fence; } - // Flattenable interface - virtual size_t getFlattenedSize() const; - virtual size_t getFdCount() const; - virtual status_t flatten(void* buffer, size_t size, - int fds[], size_t count) const; - virtual status_t unflatten(void const* buffer, size_t size, - int fds[], size_t count); + // Flattenable protocol + size_t getFlattenedSize() const; + size_t getFdCount() const; + status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const; + status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count); private: int64_t timestamp; diff --git a/include/gui/Sensor.h b/include/gui/Sensor.h index 2af2307..9197372 100644 --- a/include/gui/Sensor.h +++ b/include/gui/Sensor.h @@ -70,8 +70,8 @@ public: // LightFlattenable protocol inline bool isFixedSize() const { return false; } - size_t getSize() const; - status_t flatten(void* buffer) const; + size_t getFlattenedSize() const; + status_t flatten(void* buffer, size_t size) const; status_t unflatten(void const* buffer, size_t size); private: diff --git a/include/ui/Fence.h b/include/ui/Fence.h index 60156e7..20466b6 100644 --- a/include/ui/Fence.h +++ b/include/ui/Fence.h @@ -36,7 +36,7 @@ namespace android { // =========================================================================== class Fence - : public LightRefBase, public Flattenable + : public LightRefBase, public Flattenable { public: static const sp NO_FENCE; @@ -96,15 +96,13 @@ public: // Flattenable interface size_t getFlattenedSize() const; size_t getFdCount() const; - status_t flatten(void* buffer, size_t size, - int fds[], size_t count) const; - status_t unflatten(void const* buffer, size_t size, - int fds[], size_t count); + status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const; + status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count); private: // Only allow instantiation using ref counting. friend class LightRefBase; - virtual ~Fence(); + ~Fence(); // Disallow copying Fence(const Fence& rhs); diff --git a/include/ui/GraphicBuffer.h b/include/ui/GraphicBuffer.h index e5ad1e0..8184b7d 100644 --- a/include/ui/GraphicBuffer.h +++ b/include/ui/GraphicBuffer.h @@ -39,8 +39,9 @@ class GraphicBufferMapper; class GraphicBuffer : public ANativeObjectBase< ANativeWindowBuffer, GraphicBuffer, RefBase >, - public Flattenable + public Flattenable { + friend class Flattenable; public: enum { @@ -106,7 +107,7 @@ public: static void dumpAllocationsToSystemLog(); private: - virtual ~GraphicBuffer(); + ~GraphicBuffer(); enum { ownNone = 0, @@ -136,13 +137,11 @@ private: void free_handle(); - // Flattenable interface + // Flattenable protocol size_t getFlattenedSize() const; size_t getFdCount() const; - status_t flatten(void* buffer, size_t size, - int fds[], size_t count) const; - status_t unflatten(void const* buffer, size_t size, - int fds[], size_t count); + status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const; + status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count); GraphicBufferMapper& mBufferMapper; diff --git a/include/ui/Region.h b/include/ui/Region.h index ce91f3b..d906dbb 100644 --- a/include/ui/Region.h +++ b/include/ui/Region.h @@ -136,8 +136,8 @@ public: void addRectUnchecked(int l, int t, int r, int b); inline bool isFixedSize() const { return false; } - size_t getSize() const; - status_t flatten(void* buffer) const; + size_t getFlattenedSize() const; + status_t flatten(void* buffer, size_t size) const; status_t unflatten(void const* buffer, size_t size); void dump(String8& out, const char* what, uint32_t flags=0) const; -- cgit v1.1