xref: /aosp_15_r20/hardware/interfaces/media/bufferpool/aidl/default/BufferPool.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #pragma once
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include <map>
20*4d7e907cSAndroid Build Coastguard Worker #include <set>
21*4d7e907cSAndroid Build Coastguard Worker #include <vector>
22*4d7e907cSAndroid Build Coastguard Worker #include <mutex>
23*4d7e907cSAndroid Build Coastguard Worker #include <condition_variable>
24*4d7e907cSAndroid Build Coastguard Worker #include <utils/Timers.h>
25*4d7e907cSAndroid Build Coastguard Worker 
26*4d7e907cSAndroid Build Coastguard Worker #include "BufferStatus.h"
27*4d7e907cSAndroid Build Coastguard Worker 
28*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::media::bufferpool2::implementation {
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker using BufferStatus = aidl::android::hardware::media::bufferpool2::BufferStatus;
31*4d7e907cSAndroid Build Coastguard Worker using BufferStatusMessage = aidl::android::hardware::media::bufferpool2::BufferStatusMessage;
32*4d7e907cSAndroid Build Coastguard Worker 
33*4d7e907cSAndroid Build Coastguard Worker struct Accessor;
34*4d7e907cSAndroid Build Coastguard Worker struct InternalBuffer;
35*4d7e907cSAndroid Build Coastguard Worker struct TransactionStatus;
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker /**
38*4d7e907cSAndroid Build Coastguard Worker  * Buffer pool implementation.
39*4d7e907cSAndroid Build Coastguard Worker  *
40*4d7e907cSAndroid Build Coastguard Worker  * Handles buffer status messages. Handles buffer allocation/recycling.
41*4d7e907cSAndroid Build Coastguard Worker  * Handles buffer transfer between buffer pool clients.
42*4d7e907cSAndroid Build Coastguard Worker  */
43*4d7e907cSAndroid Build Coastguard Worker struct BufferPool {
44*4d7e907cSAndroid Build Coastguard Worker private:
45*4d7e907cSAndroid Build Coastguard Worker     std::mutex mMutex;
46*4d7e907cSAndroid Build Coastguard Worker     int64_t mTimestampMs;
47*4d7e907cSAndroid Build Coastguard Worker     int64_t mLastCleanUpMs;
48*4d7e907cSAndroid Build Coastguard Worker     int64_t mLastLogMs;
49*4d7e907cSAndroid Build Coastguard Worker     BufferId mSeq;
50*4d7e907cSAndroid Build Coastguard Worker     BufferId mStartSeq;
51*4d7e907cSAndroid Build Coastguard Worker     bool mValid;
52*4d7e907cSAndroid Build Coastguard Worker     BufferStatusObserver mObserver;
53*4d7e907cSAndroid Build Coastguard Worker     BufferInvalidationChannel mInvalidationChannel;
54*4d7e907cSAndroid Build Coastguard Worker 
55*4d7e907cSAndroid Build Coastguard Worker     std::map<ConnectionId, std::set<BufferId>> mUsingBuffers;
56*4d7e907cSAndroid Build Coastguard Worker     std::map<BufferId, std::set<ConnectionId>> mUsingConnections;
57*4d7e907cSAndroid Build Coastguard Worker 
58*4d7e907cSAndroid Build Coastguard Worker     std::map<ConnectionId, std::set<TransactionId>> mPendingTransactions;
59*4d7e907cSAndroid Build Coastguard Worker     // Transactions completed before TRANSFER_TO message arrival.
60*4d7e907cSAndroid Build Coastguard Worker     // Fetch does not occur for the transactions.
61*4d7e907cSAndroid Build Coastguard Worker     // Only transaction id is kept for the transactions in short duration.
62*4d7e907cSAndroid Build Coastguard Worker     std::set<TransactionId> mCompletedTransactions;
63*4d7e907cSAndroid Build Coastguard Worker     // Currently active(pending) transations' status & information.
64*4d7e907cSAndroid Build Coastguard Worker     std::map<TransactionId, std::unique_ptr<TransactionStatus>>
65*4d7e907cSAndroid Build Coastguard Worker             mTransactions;
66*4d7e907cSAndroid Build Coastguard Worker 
67*4d7e907cSAndroid Build Coastguard Worker     std::map<BufferId, std::unique_ptr<InternalBuffer>> mBuffers;
68*4d7e907cSAndroid Build Coastguard Worker     std::set<BufferId> mFreeBuffers;
69*4d7e907cSAndroid Build Coastguard Worker     std::set<ConnectionId> mConnectionIds;
70*4d7e907cSAndroid Build Coastguard Worker 
71*4d7e907cSAndroid Build Coastguard Worker     struct Invalidation {
72*4d7e907cSAndroid Build Coastguard Worker         static std::atomic<std::uint32_t> sInvSeqId;
73*4d7e907cSAndroid Build Coastguard Worker 
74*4d7e907cSAndroid Build Coastguard Worker         struct Pending {
75*4d7e907cSAndroid Build Coastguard Worker             bool mNeedsAck;
76*4d7e907cSAndroid Build Coastguard Worker             uint32_t mFrom;
77*4d7e907cSAndroid Build Coastguard Worker             uint32_t mTo;
78*4d7e907cSAndroid Build Coastguard Worker             size_t mLeft;
79*4d7e907cSAndroid Build Coastguard Worker             const std::weak_ptr<Accessor> mImpl;
PendingBufferPool::Invalidation::Pending80*4d7e907cSAndroid Build Coastguard Worker             Pending(bool needsAck, uint32_t from, uint32_t to, size_t left,
81*4d7e907cSAndroid Build Coastguard Worker                     const std::shared_ptr<Accessor> &impl)
82*4d7e907cSAndroid Build Coastguard Worker                     : mNeedsAck(needsAck),
83*4d7e907cSAndroid Build Coastguard Worker                       mFrom(from),
84*4d7e907cSAndroid Build Coastguard Worker                       mTo(to),
85*4d7e907cSAndroid Build Coastguard Worker                       mLeft(left),
86*4d7e907cSAndroid Build Coastguard Worker                       mImpl(impl)
87*4d7e907cSAndroid Build Coastguard Worker             {}
88*4d7e907cSAndroid Build Coastguard Worker 
isInvalidatedBufferPool::Invalidation::Pending89*4d7e907cSAndroid Build Coastguard Worker             bool isInvalidated(uint32_t bufferId) {
90*4d7e907cSAndroid Build Coastguard Worker                 return isBufferInRange(mFrom, mTo, bufferId) && --mLeft == 0;
91*4d7e907cSAndroid Build Coastguard Worker             }
92*4d7e907cSAndroid Build Coastguard Worker         };
93*4d7e907cSAndroid Build Coastguard Worker 
94*4d7e907cSAndroid Build Coastguard Worker         std::list<Pending> mPendings;
95*4d7e907cSAndroid Build Coastguard Worker         std::map<ConnectionId, uint32_t> mAcks;
96*4d7e907cSAndroid Build Coastguard Worker         std::map<ConnectionId, const std::shared_ptr<IObserver>> mObservers;
97*4d7e907cSAndroid Build Coastguard Worker         uint32_t mInvalidationId;
98*4d7e907cSAndroid Build Coastguard Worker         uint32_t mId;
99*4d7e907cSAndroid Build Coastguard Worker 
InvalidationBufferPool::Invalidation100*4d7e907cSAndroid Build Coastguard Worker         Invalidation() : mInvalidationId(0), mId(sInvSeqId.fetch_add(1)) {}
101*4d7e907cSAndroid Build Coastguard Worker 
102*4d7e907cSAndroid Build Coastguard Worker         void onConnect(ConnectionId conId, const std::shared_ptr<IObserver> &observer);
103*4d7e907cSAndroid Build Coastguard Worker 
104*4d7e907cSAndroid Build Coastguard Worker         void onClose(ConnectionId conId);
105*4d7e907cSAndroid Build Coastguard Worker 
106*4d7e907cSAndroid Build Coastguard Worker         void onAck(ConnectionId conId, uint32_t msgId);
107*4d7e907cSAndroid Build Coastguard Worker 
108*4d7e907cSAndroid Build Coastguard Worker         void onBufferInvalidated(
109*4d7e907cSAndroid Build Coastguard Worker                 BufferId bufferId,
110*4d7e907cSAndroid Build Coastguard Worker                 BufferInvalidationChannel &channel);
111*4d7e907cSAndroid Build Coastguard Worker 
112*4d7e907cSAndroid Build Coastguard Worker         void onInvalidationRequest(
113*4d7e907cSAndroid Build Coastguard Worker                 bool needsAck, uint32_t from, uint32_t to, size_t left,
114*4d7e907cSAndroid Build Coastguard Worker                 BufferInvalidationChannel &channel,
115*4d7e907cSAndroid Build Coastguard Worker                 const std::shared_ptr<Accessor> &impl);
116*4d7e907cSAndroid Build Coastguard Worker 
117*4d7e907cSAndroid Build Coastguard Worker         void onHandleAck(
118*4d7e907cSAndroid Build Coastguard Worker                 std::map<ConnectionId, const std::shared_ptr<IObserver>> *observers,
119*4d7e907cSAndroid Build Coastguard Worker                 uint32_t *invalidationId);
120*4d7e907cSAndroid Build Coastguard Worker     } mInvalidation;
121*4d7e907cSAndroid Build Coastguard Worker     /// Buffer pool statistics which tracks allocation and transfer statistics.
122*4d7e907cSAndroid Build Coastguard Worker     struct Stats {
123*4d7e907cSAndroid Build Coastguard Worker         /// Total size of allocations which are used or available to use.
124*4d7e907cSAndroid Build Coastguard Worker         /// (bytes or pixels)
125*4d7e907cSAndroid Build Coastguard Worker         size_t mSizeCached;
126*4d7e907cSAndroid Build Coastguard Worker         /// # of cached buffers which are used or available to use.
127*4d7e907cSAndroid Build Coastguard Worker         size_t mBuffersCached;
128*4d7e907cSAndroid Build Coastguard Worker         /// Total size of allocations which are currently used. (bytes or pixels)
129*4d7e907cSAndroid Build Coastguard Worker         size_t mSizeInUse;
130*4d7e907cSAndroid Build Coastguard Worker         /// # of currently used buffers
131*4d7e907cSAndroid Build Coastguard Worker         size_t mBuffersInUse;
132*4d7e907cSAndroid Build Coastguard Worker 
133*4d7e907cSAndroid Build Coastguard Worker         /// # of allocations called on bufferpool. (# of fetched from BlockPool)
134*4d7e907cSAndroid Build Coastguard Worker         size_t mTotalAllocations;
135*4d7e907cSAndroid Build Coastguard Worker         /// # of allocations that were served from the cache.
136*4d7e907cSAndroid Build Coastguard Worker         /// (# of allocator alloc prevented)
137*4d7e907cSAndroid Build Coastguard Worker         size_t mTotalRecycles;
138*4d7e907cSAndroid Build Coastguard Worker         /// # of buffer transfers initiated.
139*4d7e907cSAndroid Build Coastguard Worker         size_t mTotalTransfers;
140*4d7e907cSAndroid Build Coastguard Worker         /// # of transfers that had to be fetched.
141*4d7e907cSAndroid Build Coastguard Worker         size_t mTotalFetches;
142*4d7e907cSAndroid Build Coastguard Worker 
StatsBufferPool::Stats143*4d7e907cSAndroid Build Coastguard Worker         Stats()
144*4d7e907cSAndroid Build Coastguard Worker             : mSizeCached(0), mBuffersCached(0), mSizeInUse(0), mBuffersInUse(0),
145*4d7e907cSAndroid Build Coastguard Worker               mTotalAllocations(0), mTotalRecycles(0), mTotalTransfers(0), mTotalFetches(0) {}
146*4d7e907cSAndroid Build Coastguard Worker 
147*4d7e907cSAndroid Build Coastguard Worker         /// # of currently unused buffers
buffersNotInUseBufferPool::Stats148*4d7e907cSAndroid Build Coastguard Worker         size_t buffersNotInUse() const {
149*4d7e907cSAndroid Build Coastguard Worker             ALOG_ASSERT(mBuffersCached >= mBuffersInUse);
150*4d7e907cSAndroid Build Coastguard Worker             return mBuffersCached - mBuffersInUse;
151*4d7e907cSAndroid Build Coastguard Worker         }
152*4d7e907cSAndroid Build Coastguard Worker 
153*4d7e907cSAndroid Build Coastguard Worker         /// A new buffer is allocated on an allocation request.
onBufferAllocatedBufferPool::Stats154*4d7e907cSAndroid Build Coastguard Worker         void onBufferAllocated(size_t allocSize) {
155*4d7e907cSAndroid Build Coastguard Worker             mSizeCached += allocSize;
156*4d7e907cSAndroid Build Coastguard Worker             mBuffersCached++;
157*4d7e907cSAndroid Build Coastguard Worker 
158*4d7e907cSAndroid Build Coastguard Worker             mSizeInUse += allocSize;
159*4d7e907cSAndroid Build Coastguard Worker             mBuffersInUse++;
160*4d7e907cSAndroid Build Coastguard Worker 
161*4d7e907cSAndroid Build Coastguard Worker             mTotalAllocations++;
162*4d7e907cSAndroid Build Coastguard Worker         }
163*4d7e907cSAndroid Build Coastguard Worker 
164*4d7e907cSAndroid Build Coastguard Worker         /// A buffer is evicted and destroyed.
onBufferEvictedBufferPool::Stats165*4d7e907cSAndroid Build Coastguard Worker         void onBufferEvicted(size_t allocSize) {
166*4d7e907cSAndroid Build Coastguard Worker             mSizeCached -= allocSize;
167*4d7e907cSAndroid Build Coastguard Worker             mBuffersCached--;
168*4d7e907cSAndroid Build Coastguard Worker         }
169*4d7e907cSAndroid Build Coastguard Worker 
170*4d7e907cSAndroid Build Coastguard Worker         /// A buffer is recycled on an allocation request.
onBufferRecycledBufferPool::Stats171*4d7e907cSAndroid Build Coastguard Worker         void onBufferRecycled(size_t allocSize) {
172*4d7e907cSAndroid Build Coastguard Worker             mSizeInUse += allocSize;
173*4d7e907cSAndroid Build Coastguard Worker             mBuffersInUse++;
174*4d7e907cSAndroid Build Coastguard Worker 
175*4d7e907cSAndroid Build Coastguard Worker             mTotalAllocations++;
176*4d7e907cSAndroid Build Coastguard Worker             mTotalRecycles++;
177*4d7e907cSAndroid Build Coastguard Worker         }
178*4d7e907cSAndroid Build Coastguard Worker 
179*4d7e907cSAndroid Build Coastguard Worker         /// A buffer is available to be recycled.
onBufferUnusedBufferPool::Stats180*4d7e907cSAndroid Build Coastguard Worker         void onBufferUnused(size_t allocSize) {
181*4d7e907cSAndroid Build Coastguard Worker             mSizeInUse -= allocSize;
182*4d7e907cSAndroid Build Coastguard Worker             mBuffersInUse--;
183*4d7e907cSAndroid Build Coastguard Worker         }
184*4d7e907cSAndroid Build Coastguard Worker 
185*4d7e907cSAndroid Build Coastguard Worker         /// A buffer transfer is initiated.
onBufferSentBufferPool::Stats186*4d7e907cSAndroid Build Coastguard Worker         void onBufferSent() {
187*4d7e907cSAndroid Build Coastguard Worker             mTotalTransfers++;
188*4d7e907cSAndroid Build Coastguard Worker         }
189*4d7e907cSAndroid Build Coastguard Worker 
190*4d7e907cSAndroid Build Coastguard Worker         /// A buffer fetch is invoked by a buffer transfer.
onBufferFetchedBufferPool::Stats191*4d7e907cSAndroid Build Coastguard Worker         void onBufferFetched() {
192*4d7e907cSAndroid Build Coastguard Worker             mTotalFetches++;
193*4d7e907cSAndroid Build Coastguard Worker         }
194*4d7e907cSAndroid Build Coastguard Worker     } mStats;
195*4d7e907cSAndroid Build Coastguard Worker 
isValidBufferPool196*4d7e907cSAndroid Build Coastguard Worker     bool isValid() {
197*4d7e907cSAndroid Build Coastguard Worker         return mValid;
198*4d7e907cSAndroid Build Coastguard Worker     }
199*4d7e907cSAndroid Build Coastguard Worker 
200*4d7e907cSAndroid Build Coastguard Worker     void invalidate(bool needsAck, BufferId from, BufferId to,
201*4d7e907cSAndroid Build Coastguard Worker                     const std::shared_ptr<Accessor> &impl);
202*4d7e907cSAndroid Build Coastguard Worker 
203*4d7e907cSAndroid Build Coastguard Worker     static void createInvalidator();
204*4d7e907cSAndroid Build Coastguard Worker 
205*4d7e907cSAndroid Build Coastguard Worker public:
206*4d7e907cSAndroid Build Coastguard Worker     /** Creates a buffer pool. */
207*4d7e907cSAndroid Build Coastguard Worker     BufferPool();
208*4d7e907cSAndroid Build Coastguard Worker 
209*4d7e907cSAndroid Build Coastguard Worker     /** Destroys a buffer pool. */
210*4d7e907cSAndroid Build Coastguard Worker     ~BufferPool();
211*4d7e907cSAndroid Build Coastguard Worker 
212*4d7e907cSAndroid Build Coastguard Worker     /**
213*4d7e907cSAndroid Build Coastguard Worker      * Processes all pending buffer status messages, and returns the result.
214*4d7e907cSAndroid Build Coastguard Worker      * Each status message is handled by methods with 'handle' prefix.
215*4d7e907cSAndroid Build Coastguard Worker      */
216*4d7e907cSAndroid Build Coastguard Worker     void processStatusMessages();
217*4d7e907cSAndroid Build Coastguard Worker 
218*4d7e907cSAndroid Build Coastguard Worker     /**
219*4d7e907cSAndroid Build Coastguard Worker      * Handles a buffer being owned by a connection.
220*4d7e907cSAndroid Build Coastguard Worker      *
221*4d7e907cSAndroid Build Coastguard Worker      * @param connectionId  the id of the buffer owning connection.
222*4d7e907cSAndroid Build Coastguard Worker      * @param bufferId      the id of the buffer.
223*4d7e907cSAndroid Build Coastguard Worker      *
224*4d7e907cSAndroid Build Coastguard Worker      * @return {@code true} when the buffer is owned,
225*4d7e907cSAndroid Build Coastguard Worker      *         {@code false} otherwise.
226*4d7e907cSAndroid Build Coastguard Worker      */
227*4d7e907cSAndroid Build Coastguard Worker     bool handleOwnBuffer(ConnectionId connectionId, BufferId bufferId);
228*4d7e907cSAndroid Build Coastguard Worker 
229*4d7e907cSAndroid Build Coastguard Worker     /**
230*4d7e907cSAndroid Build Coastguard Worker      * Handles a buffer being released by a connection.
231*4d7e907cSAndroid Build Coastguard Worker      *
232*4d7e907cSAndroid Build Coastguard Worker      * @param connectionId  the id of the buffer owning connection.
233*4d7e907cSAndroid Build Coastguard Worker      * @param bufferId      the id of the buffer.
234*4d7e907cSAndroid Build Coastguard Worker      *
235*4d7e907cSAndroid Build Coastguard Worker      * @return {@code true} when the buffer ownership is released,
236*4d7e907cSAndroid Build Coastguard Worker      *         {@code false} otherwise.
237*4d7e907cSAndroid Build Coastguard Worker      */
238*4d7e907cSAndroid Build Coastguard Worker     bool handleReleaseBuffer(ConnectionId connectionId, BufferId bufferId);
239*4d7e907cSAndroid Build Coastguard Worker 
240*4d7e907cSAndroid Build Coastguard Worker     /**
241*4d7e907cSAndroid Build Coastguard Worker      * Handles a transfer transaction start message from the sender.
242*4d7e907cSAndroid Build Coastguard Worker      *
243*4d7e907cSAndroid Build Coastguard Worker      * @param message   a buffer status message for the transaction.
244*4d7e907cSAndroid Build Coastguard Worker      *
245*4d7e907cSAndroid Build Coastguard Worker      * @result {@code true} when transfer_to message is acknowledged,
246*4d7e907cSAndroid Build Coastguard Worker      *         {@code false} otherwise.
247*4d7e907cSAndroid Build Coastguard Worker      */
248*4d7e907cSAndroid Build Coastguard Worker     bool handleTransferTo(const BufferStatusMessage &message);
249*4d7e907cSAndroid Build Coastguard Worker 
250*4d7e907cSAndroid Build Coastguard Worker     /**
251*4d7e907cSAndroid Build Coastguard Worker      * Handles a transfer transaction being acked by the receiver.
252*4d7e907cSAndroid Build Coastguard Worker      *
253*4d7e907cSAndroid Build Coastguard Worker      * @param message   a buffer status message for the transaction.
254*4d7e907cSAndroid Build Coastguard Worker      *
255*4d7e907cSAndroid Build Coastguard Worker      * @result {@code true} when transfer_from message is acknowledged,
256*4d7e907cSAndroid Build Coastguard Worker      *         {@code false} otherwise.
257*4d7e907cSAndroid Build Coastguard Worker      */
258*4d7e907cSAndroid Build Coastguard Worker     bool handleTransferFrom(const BufferStatusMessage &message);
259*4d7e907cSAndroid Build Coastguard Worker 
260*4d7e907cSAndroid Build Coastguard Worker     /**
261*4d7e907cSAndroid Build Coastguard Worker      * Handles a transfer transaction result message from the receiver.
262*4d7e907cSAndroid Build Coastguard Worker      *
263*4d7e907cSAndroid Build Coastguard Worker      * @param message   a buffer status message for the transaction.
264*4d7e907cSAndroid Build Coastguard Worker      *
265*4d7e907cSAndroid Build Coastguard Worker      * @result {@code true} when the existing transaction is finished,
266*4d7e907cSAndroid Build Coastguard Worker      *         {@code false} otherwise.
267*4d7e907cSAndroid Build Coastguard Worker      */
268*4d7e907cSAndroid Build Coastguard Worker     bool handleTransferResult(const BufferStatusMessage &message);
269*4d7e907cSAndroid Build Coastguard Worker 
270*4d7e907cSAndroid Build Coastguard Worker     /**
271*4d7e907cSAndroid Build Coastguard Worker      * Handles a connection being closed, and returns the result. All the
272*4d7e907cSAndroid Build Coastguard Worker      * buffers and transactions owned by the connection will be cleaned up.
273*4d7e907cSAndroid Build Coastguard Worker      * The related FMQ will be cleaned up too.
274*4d7e907cSAndroid Build Coastguard Worker      *
275*4d7e907cSAndroid Build Coastguard Worker      * @param connectionId  the id of the connection.
276*4d7e907cSAndroid Build Coastguard Worker      *
277*4d7e907cSAndroid Build Coastguard Worker      * @result {@code true} when the connection existed,
278*4d7e907cSAndroid Build Coastguard Worker      *         {@code false} otherwise.
279*4d7e907cSAndroid Build Coastguard Worker      */
280*4d7e907cSAndroid Build Coastguard Worker     bool handleClose(ConnectionId connectionId);
281*4d7e907cSAndroid Build Coastguard Worker 
282*4d7e907cSAndroid Build Coastguard Worker     /**
283*4d7e907cSAndroid Build Coastguard Worker      * Recycles a existing free buffer if it is possible.
284*4d7e907cSAndroid Build Coastguard Worker      *
285*4d7e907cSAndroid Build Coastguard Worker      * @param allocator the buffer allocator
286*4d7e907cSAndroid Build Coastguard Worker      * @param params    the allocation parameters.
287*4d7e907cSAndroid Build Coastguard Worker      * @param pId       the id of the recycled buffer.
288*4d7e907cSAndroid Build Coastguard Worker      * @param handle    the native handle of the recycled buffer.
289*4d7e907cSAndroid Build Coastguard Worker      *
290*4d7e907cSAndroid Build Coastguard Worker      * @return {@code true} when a buffer is recycled, {@code false}
291*4d7e907cSAndroid Build Coastguard Worker      *         otherwise.
292*4d7e907cSAndroid Build Coastguard Worker      */
293*4d7e907cSAndroid Build Coastguard Worker     bool getFreeBuffer(
294*4d7e907cSAndroid Build Coastguard Worker             const std::shared_ptr<BufferPoolAllocator> &allocator,
295*4d7e907cSAndroid Build Coastguard Worker             const std::vector<uint8_t> &params,
296*4d7e907cSAndroid Build Coastguard Worker             BufferId *pId, const native_handle_t **handle);
297*4d7e907cSAndroid Build Coastguard Worker 
298*4d7e907cSAndroid Build Coastguard Worker     /**
299*4d7e907cSAndroid Build Coastguard Worker      * Adds a newly allocated buffer to bufferpool.
300*4d7e907cSAndroid Build Coastguard Worker      *
301*4d7e907cSAndroid Build Coastguard Worker      * @param alloc     the newly allocated buffer.
302*4d7e907cSAndroid Build Coastguard Worker      * @param allocSize the size of the newly allocated buffer.
303*4d7e907cSAndroid Build Coastguard Worker      * @param params    the allocation parameters.
304*4d7e907cSAndroid Build Coastguard Worker      * @param pId       the buffer id for the newly allocated buffer.
305*4d7e907cSAndroid Build Coastguard Worker      * @param handle    the native handle for the newly allocated buffer.
306*4d7e907cSAndroid Build Coastguard Worker      *
307*4d7e907cSAndroid Build Coastguard Worker      * @return OK when an allocation is successfully allocated.
308*4d7e907cSAndroid Build Coastguard Worker      *         NO_MEMORY when there is no memory.
309*4d7e907cSAndroid Build Coastguard Worker      *         CRITICAL_ERROR otherwise.
310*4d7e907cSAndroid Build Coastguard Worker      */
311*4d7e907cSAndroid Build Coastguard Worker     BufferPoolStatus addNewBuffer(
312*4d7e907cSAndroid Build Coastguard Worker             const std::shared_ptr<BufferPoolAllocation> &alloc,
313*4d7e907cSAndroid Build Coastguard Worker             const size_t allocSize,
314*4d7e907cSAndroid Build Coastguard Worker             const std::vector<uint8_t> &params,
315*4d7e907cSAndroid Build Coastguard Worker             BufferId *pId,
316*4d7e907cSAndroid Build Coastguard Worker             const native_handle_t **handle);
317*4d7e907cSAndroid Build Coastguard Worker 
318*4d7e907cSAndroid Build Coastguard Worker     /**
319*4d7e907cSAndroid Build Coastguard Worker      * Processes pending buffer status messages and performs periodic cache
320*4d7e907cSAndroid Build Coastguard Worker      * cleaning.
321*4d7e907cSAndroid Build Coastguard Worker      *
322*4d7e907cSAndroid Build Coastguard Worker      * @param clearCache    if clearCache is true, it frees all buffers
323*4d7e907cSAndroid Build Coastguard Worker      *                      waiting to be recycled.
324*4d7e907cSAndroid Build Coastguard Worker      */
325*4d7e907cSAndroid Build Coastguard Worker     void cleanUp(bool clearCache = false);
326*4d7e907cSAndroid Build Coastguard Worker 
327*4d7e907cSAndroid Build Coastguard Worker     /**
328*4d7e907cSAndroid Build Coastguard Worker      * Processes pending buffer status messages and invalidate all current
329*4d7e907cSAndroid Build Coastguard Worker      * free buffers. Active buffers are invalidated after being inactive.
330*4d7e907cSAndroid Build Coastguard Worker      */
331*4d7e907cSAndroid Build Coastguard Worker     void flush(const std::shared_ptr<Accessor> &impl);
332*4d7e907cSAndroid Build Coastguard Worker 
333*4d7e907cSAndroid Build Coastguard Worker     friend struct Accessor;
334*4d7e907cSAndroid Build Coastguard Worker };
335*4d7e907cSAndroid Build Coastguard Worker 
336*4d7e907cSAndroid Build Coastguard Worker 
337*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::media::bufferpool2::implementation
338