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> ¶ms, 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> ¶ms, 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