Fix bufferpool
Fix bufferpool carsh sporadically on invalidation. use android::sp
instead of android::wp for caching IObserver hidl interface.
Bug: 112203066
Change-Id: I69aafa11cc617f9ae36cce88283a3294fcab9bbd
diff --git a/media/bufferpool/2.0/AccessorImpl.h b/media/bufferpool/2.0/AccessorImpl.h
index 6b03494..b3faa96 100644
--- a/media/bufferpool/2.0/AccessorImpl.h
+++ b/media/bufferpool/2.0/AccessorImpl.h
@@ -34,7 +34,7 @@
/**
* An implementation of a buffer pool accessor(or a buffer pool implementation.) */
-class Accessor::Impl
+class Accessor::Impl
: public std::enable_shared_from_this<Accessor::Impl> {
public:
Impl(const std::shared_ptr<BufferPoolAllocator> &allocator);
@@ -69,6 +69,8 @@
void handleInvalidateAck();
+ static void createInvalidator();
+
private:
// ConnectionId = pid : (timestamp_created + seqId)
// in order to guarantee uniqueness for each connection
@@ -111,7 +113,7 @@
std::set<BufferId> mFreeBuffers;
struct Invalidation {
- static std::atomic<std::uint32_t> sSeqId;
+ static std::atomic<std::uint32_t> sInvSeqId;
struct Pending {
bool mNeedsAck;
@@ -128,18 +130,18 @@
mImpl(impl)
{}
- bool invalidate(uint32_t bufferId) {
+ bool isInvalidated(uint32_t bufferId) {
return isBufferInRange(mFrom, mTo, bufferId) && --mLeft == 0;
}
};
std::list<Pending> mPendings;
std::map<ConnectionId, uint32_t> mAcks;
- std::map<ConnectionId, const wp<IObserver>> mObservers;
+ std::map<ConnectionId, const sp<IObserver>> mObservers;
uint32_t mInvalidationId;
uint32_t mId;
- Invalidation() : mInvalidationId(0), mId(sSeqId.fetch_add(1)) {}
+ Invalidation() : mInvalidationId(0), mId(sInvSeqId.fetch_add(1)) {}
void onConnect(ConnectionId conId, const sp<IObserver> &observer);
@@ -234,6 +236,8 @@
void invalidate(bool needsAck, BufferId from, BufferId to,
const std::shared_ptr<Accessor::Impl> &impl);
+ static void createInvalidator();
+
public:
/** Creates a buffer pool. */
BufferPool();
@@ -376,7 +380,7 @@
void delAccessor(uint32_t accessorId);
};
- static AccessorInvalidator sInvalidator;
+ static std::unique_ptr<AccessorInvalidator> sInvalidator;
static void invalidatorThread(
std::map<uint32_t, const std::weak_ptr<Accessor::Impl>> &accessors,