xref: /aosp_15_r20/hardware/interfaces/media/bufferpool/aidl/default/BufferPool.cpp (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 #define LOG_TAG "AidlBufferPool"
18*4d7e907cSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <sys/types.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <stdint.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <time.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <unistd.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <utils/Log.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <thread>
26*4d7e907cSAndroid Build Coastguard Worker #include "Accessor.h"
27*4d7e907cSAndroid Build Coastguard Worker #include "BufferPool.h"
28*4d7e907cSAndroid Build Coastguard Worker #include "Connection.h"
29*4d7e907cSAndroid Build Coastguard Worker #include "DataHelper.h"
30*4d7e907cSAndroid Build Coastguard Worker 
31*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::media::bufferpool2::implementation {
32*4d7e907cSAndroid Build Coastguard Worker 
33*4d7e907cSAndroid Build Coastguard Worker namespace {
34*4d7e907cSAndroid Build Coastguard Worker     static constexpr int64_t kCleanUpDurationMs = 500; // 0.5 sec
35*4d7e907cSAndroid Build Coastguard Worker     static constexpr int64_t kLogDurationMs = 5000; // 5 secs
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker     static constexpr size_t kMinAllocBytesForEviction = 1024*1024*15;
38*4d7e907cSAndroid Build Coastguard Worker     static constexpr size_t kMinBufferCountForEviction = 25;
39*4d7e907cSAndroid Build Coastguard Worker     static constexpr size_t kMaxUnusedBufferCount = 64;
40*4d7e907cSAndroid Build Coastguard Worker     static constexpr size_t kUnusedBufferCountTarget = kMaxUnusedBufferCount - 16;
41*4d7e907cSAndroid Build Coastguard Worker }
42*4d7e907cSAndroid Build Coastguard Worker 
BufferPool()43*4d7e907cSAndroid Build Coastguard Worker BufferPool::BufferPool()
44*4d7e907cSAndroid Build Coastguard Worker     : mTimestampMs(::android::elapsedRealtime()),
45*4d7e907cSAndroid Build Coastguard Worker       mLastCleanUpMs(mTimestampMs),
46*4d7e907cSAndroid Build Coastguard Worker       mLastLogMs(mTimestampMs),
47*4d7e907cSAndroid Build Coastguard Worker       mSeq(0),
48*4d7e907cSAndroid Build Coastguard Worker       mStartSeq(0) {
49*4d7e907cSAndroid Build Coastguard Worker     mValid = mInvalidationChannel.isValid();
50*4d7e907cSAndroid Build Coastguard Worker }
51*4d7e907cSAndroid Build Coastguard Worker 
52*4d7e907cSAndroid Build Coastguard Worker 
53*4d7e907cSAndroid Build Coastguard Worker // Statistics helper
54*4d7e907cSAndroid Build Coastguard Worker template<typename T, typename S>
percentage(T base,S total)55*4d7e907cSAndroid Build Coastguard Worker int percentage(T base, S total) {
56*4d7e907cSAndroid Build Coastguard Worker     return int(total ? 0.5 + 100. * static_cast<S>(base) / total : 0);
57*4d7e907cSAndroid Build Coastguard Worker }
58*4d7e907cSAndroid Build Coastguard Worker 
59*4d7e907cSAndroid Build Coastguard Worker std::atomic<std::uint32_t> BufferPool::Invalidation::sInvSeqId(0);
60*4d7e907cSAndroid Build Coastguard Worker 
~BufferPool()61*4d7e907cSAndroid Build Coastguard Worker BufferPool::~BufferPool() {
62*4d7e907cSAndroid Build Coastguard Worker     std::lock_guard<std::mutex> lock(mMutex);
63*4d7e907cSAndroid Build Coastguard Worker     ALOGD("Destruction - bufferpool2 %p "
64*4d7e907cSAndroid Build Coastguard Worker           "cached: %zu/%zuM, %zu/%d%% in use; "
65*4d7e907cSAndroid Build Coastguard Worker           "allocs: %zu, %d%% recycled; "
66*4d7e907cSAndroid Build Coastguard Worker           "transfers: %zu, %d%% unfetched",
67*4d7e907cSAndroid Build Coastguard Worker           this, mStats.mBuffersCached, mStats.mSizeCached >> 20,
68*4d7e907cSAndroid Build Coastguard Worker           mStats.mBuffersInUse, percentage(mStats.mBuffersInUse, mStats.mBuffersCached),
69*4d7e907cSAndroid Build Coastguard Worker           mStats.mTotalAllocations, percentage(mStats.mTotalRecycles, mStats.mTotalAllocations),
70*4d7e907cSAndroid Build Coastguard Worker           mStats.mTotalTransfers,
71*4d7e907cSAndroid Build Coastguard Worker           percentage(mStats.mTotalTransfers - mStats.mTotalFetches, mStats.mTotalTransfers));
72*4d7e907cSAndroid Build Coastguard Worker }
73*4d7e907cSAndroid Build Coastguard Worker 
onConnect(ConnectionId conId,const std::shared_ptr<IObserver> & observer)74*4d7e907cSAndroid Build Coastguard Worker void BufferPool::Invalidation::onConnect(
75*4d7e907cSAndroid Build Coastguard Worker         ConnectionId conId, const std::shared_ptr<IObserver>& observer) {
76*4d7e907cSAndroid Build Coastguard Worker     mAcks[conId] = mInvalidationId; // starts from current invalidationId
77*4d7e907cSAndroid Build Coastguard Worker     mObservers.insert(std::make_pair(conId, observer));
78*4d7e907cSAndroid Build Coastguard Worker }
79*4d7e907cSAndroid Build Coastguard Worker 
onClose(ConnectionId conId)80*4d7e907cSAndroid Build Coastguard Worker void BufferPool::Invalidation::onClose(ConnectionId conId) {
81*4d7e907cSAndroid Build Coastguard Worker     mAcks.erase(conId);
82*4d7e907cSAndroid Build Coastguard Worker     mObservers.erase(conId);
83*4d7e907cSAndroid Build Coastguard Worker }
84*4d7e907cSAndroid Build Coastguard Worker 
onAck(ConnectionId conId,uint32_t msgId)85*4d7e907cSAndroid Build Coastguard Worker void BufferPool::Invalidation::onAck(
86*4d7e907cSAndroid Build Coastguard Worker         ConnectionId conId,
87*4d7e907cSAndroid Build Coastguard Worker         uint32_t msgId) {
88*4d7e907cSAndroid Build Coastguard Worker     auto it = mAcks.find(conId);
89*4d7e907cSAndroid Build Coastguard Worker     if (it == mAcks.end()) {
90*4d7e907cSAndroid Build Coastguard Worker         ALOGW("ACK from inconsistent connection! %lld", (long long)conId);
91*4d7e907cSAndroid Build Coastguard Worker         return;
92*4d7e907cSAndroid Build Coastguard Worker     }
93*4d7e907cSAndroid Build Coastguard Worker     if (isMessageLater(msgId, it->second)) {
94*4d7e907cSAndroid Build Coastguard Worker         mAcks[conId] = msgId;
95*4d7e907cSAndroid Build Coastguard Worker     }
96*4d7e907cSAndroid Build Coastguard Worker }
97*4d7e907cSAndroid Build Coastguard Worker 
onBufferInvalidated(BufferId bufferId,BufferInvalidationChannel & channel)98*4d7e907cSAndroid Build Coastguard Worker void BufferPool::Invalidation::onBufferInvalidated(
99*4d7e907cSAndroid Build Coastguard Worker         BufferId bufferId,
100*4d7e907cSAndroid Build Coastguard Worker         BufferInvalidationChannel &channel) {
101*4d7e907cSAndroid Build Coastguard Worker     for (auto it = mPendings.begin(); it != mPendings.end();) {
102*4d7e907cSAndroid Build Coastguard Worker         if (it->isInvalidated(bufferId)) {
103*4d7e907cSAndroid Build Coastguard Worker             uint32_t msgId = 0;
104*4d7e907cSAndroid Build Coastguard Worker             if (it->mNeedsAck) {
105*4d7e907cSAndroid Build Coastguard Worker                 if (mInvalidationId == UINT_MAX) {
106*4d7e907cSAndroid Build Coastguard Worker                     // wrap happens;
107*4d7e907cSAndroid Build Coastguard Worker                     mInvalidationId = 0;
108*4d7e907cSAndroid Build Coastguard Worker                 }
109*4d7e907cSAndroid Build Coastguard Worker                 msgId = ++mInvalidationId;
110*4d7e907cSAndroid Build Coastguard Worker             }
111*4d7e907cSAndroid Build Coastguard Worker             channel.postInvalidation(msgId, it->mFrom, it->mTo);
112*4d7e907cSAndroid Build Coastguard Worker             it = mPendings.erase(it);
113*4d7e907cSAndroid Build Coastguard Worker             continue;
114*4d7e907cSAndroid Build Coastguard Worker         }
115*4d7e907cSAndroid Build Coastguard Worker         ++it;
116*4d7e907cSAndroid Build Coastguard Worker     }
117*4d7e907cSAndroid Build Coastguard Worker }
118*4d7e907cSAndroid Build Coastguard Worker 
onInvalidationRequest(bool needsAck,uint32_t from,uint32_t to,size_t left,BufferInvalidationChannel & channel,const std::shared_ptr<Accessor> & impl)119*4d7e907cSAndroid Build Coastguard Worker void BufferPool::Invalidation::onInvalidationRequest(
120*4d7e907cSAndroid Build Coastguard Worker         bool needsAck,
121*4d7e907cSAndroid Build Coastguard Worker         uint32_t from,
122*4d7e907cSAndroid Build Coastguard Worker         uint32_t to,
123*4d7e907cSAndroid Build Coastguard Worker         size_t left,
124*4d7e907cSAndroid Build Coastguard Worker         BufferInvalidationChannel &channel,
125*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<Accessor> &impl) {
126*4d7e907cSAndroid Build Coastguard Worker         uint32_t msgId = 0;
127*4d7e907cSAndroid Build Coastguard Worker     if (needsAck) {
128*4d7e907cSAndroid Build Coastguard Worker         if (mInvalidationId == UINT_MAX) {
129*4d7e907cSAndroid Build Coastguard Worker             //wrap happens
130*4d7e907cSAndroid Build Coastguard Worker             mInvalidationId = 0;
131*4d7e907cSAndroid Build Coastguard Worker         }
132*4d7e907cSAndroid Build Coastguard Worker         msgId = ++mInvalidationId;
133*4d7e907cSAndroid Build Coastguard Worker     }
134*4d7e907cSAndroid Build Coastguard Worker     ALOGV("bufferpool2 invalidation requested and queued");
135*4d7e907cSAndroid Build Coastguard Worker     if (left == 0) {
136*4d7e907cSAndroid Build Coastguard Worker         channel.postInvalidation(msgId, from, to);
137*4d7e907cSAndroid Build Coastguard Worker     } else {
138*4d7e907cSAndroid Build Coastguard Worker         ALOGV("bufferpoo2 invalidation requested and pending");
139*4d7e907cSAndroid Build Coastguard Worker         Pending pending(needsAck, from, to, left, impl);
140*4d7e907cSAndroid Build Coastguard Worker         mPendings.push_back(pending);
141*4d7e907cSAndroid Build Coastguard Worker     }
142*4d7e907cSAndroid Build Coastguard Worker     Accessor::sInvalidator->addAccessor(mId, impl);
143*4d7e907cSAndroid Build Coastguard Worker }
144*4d7e907cSAndroid Build Coastguard Worker 
onHandleAck(std::map<ConnectionId,const std::shared_ptr<IObserver>> * observers,uint32_t * invalidationId)145*4d7e907cSAndroid Build Coastguard Worker void BufferPool::Invalidation::onHandleAck(
146*4d7e907cSAndroid Build Coastguard Worker         std::map<ConnectionId, const std::shared_ptr<IObserver>> *observers,
147*4d7e907cSAndroid Build Coastguard Worker         uint32_t *invalidationId) {
148*4d7e907cSAndroid Build Coastguard Worker     if (mInvalidationId != 0) {
149*4d7e907cSAndroid Build Coastguard Worker         *invalidationId = mInvalidationId;
150*4d7e907cSAndroid Build Coastguard Worker         std::set<int> deads;
151*4d7e907cSAndroid Build Coastguard Worker         for (auto it = mAcks.begin(); it != mAcks.end(); ++it) {
152*4d7e907cSAndroid Build Coastguard Worker             if (it->second != mInvalidationId) {
153*4d7e907cSAndroid Build Coastguard Worker                 const std::shared_ptr<IObserver> observer = mObservers[it->first];
154*4d7e907cSAndroid Build Coastguard Worker                 if (observer) {
155*4d7e907cSAndroid Build Coastguard Worker                     observers->emplace(it->first, observer);
156*4d7e907cSAndroid Build Coastguard Worker                     ALOGV("connection %lld will call observer (%u: %u)",
157*4d7e907cSAndroid Build Coastguard Worker                           (long long)it->first, it->second, mInvalidationId);
158*4d7e907cSAndroid Build Coastguard Worker                     // N.B: onMessage will be called later. ignore possibility of
159*4d7e907cSAndroid Build Coastguard Worker                     // onMessage# oneway call being lost.
160*4d7e907cSAndroid Build Coastguard Worker                     it->second = mInvalidationId;
161*4d7e907cSAndroid Build Coastguard Worker                 } else {
162*4d7e907cSAndroid Build Coastguard Worker                     ALOGV("bufferpool2 observer died %lld", (long long)it->first);
163*4d7e907cSAndroid Build Coastguard Worker                     deads.insert(it->first);
164*4d7e907cSAndroid Build Coastguard Worker                 }
165*4d7e907cSAndroid Build Coastguard Worker             }
166*4d7e907cSAndroid Build Coastguard Worker         }
167*4d7e907cSAndroid Build Coastguard Worker         if (deads.size() > 0) {
168*4d7e907cSAndroid Build Coastguard Worker             for (auto it = deads.begin(); it != deads.end(); ++it) {
169*4d7e907cSAndroid Build Coastguard Worker                 onClose(*it);
170*4d7e907cSAndroid Build Coastguard Worker             }
171*4d7e907cSAndroid Build Coastguard Worker         }
172*4d7e907cSAndroid Build Coastguard Worker     }
173*4d7e907cSAndroid Build Coastguard Worker     if (mPendings.size() == 0) {
174*4d7e907cSAndroid Build Coastguard Worker         // All invalidation Ids are synced and no more pending invalidations.
175*4d7e907cSAndroid Build Coastguard Worker         Accessor::sInvalidator->delAccessor(mId);
176*4d7e907cSAndroid Build Coastguard Worker     }
177*4d7e907cSAndroid Build Coastguard Worker }
178*4d7e907cSAndroid Build Coastguard Worker 
handleOwnBuffer(ConnectionId connectionId,BufferId bufferId)179*4d7e907cSAndroid Build Coastguard Worker bool BufferPool::handleOwnBuffer(
180*4d7e907cSAndroid Build Coastguard Worker         ConnectionId connectionId, BufferId bufferId) {
181*4d7e907cSAndroid Build Coastguard Worker 
182*4d7e907cSAndroid Build Coastguard Worker     bool added = insert(&mUsingBuffers, connectionId, bufferId);
183*4d7e907cSAndroid Build Coastguard Worker     if (added) {
184*4d7e907cSAndroid Build Coastguard Worker         auto iter = mBuffers.find(bufferId);
185*4d7e907cSAndroid Build Coastguard Worker         iter->second->mOwnerCount++;
186*4d7e907cSAndroid Build Coastguard Worker     }
187*4d7e907cSAndroid Build Coastguard Worker     insert(&mUsingConnections, bufferId, connectionId);
188*4d7e907cSAndroid Build Coastguard Worker     return added;
189*4d7e907cSAndroid Build Coastguard Worker }
190*4d7e907cSAndroid Build Coastguard Worker 
handleReleaseBuffer(ConnectionId connectionId,BufferId bufferId)191*4d7e907cSAndroid Build Coastguard Worker bool BufferPool::handleReleaseBuffer(
192*4d7e907cSAndroid Build Coastguard Worker         ConnectionId connectionId, BufferId bufferId) {
193*4d7e907cSAndroid Build Coastguard Worker     bool deleted = erase(&mUsingBuffers, connectionId, bufferId);
194*4d7e907cSAndroid Build Coastguard Worker     if (deleted) {
195*4d7e907cSAndroid Build Coastguard Worker         auto iter = mBuffers.find(bufferId);
196*4d7e907cSAndroid Build Coastguard Worker         iter->second->mOwnerCount--;
197*4d7e907cSAndroid Build Coastguard Worker         if (iter->second->mOwnerCount == 0 &&
198*4d7e907cSAndroid Build Coastguard Worker                 iter->second->mTransactionCount == 0) {
199*4d7e907cSAndroid Build Coastguard Worker             if (!iter->second->mInvalidated) {
200*4d7e907cSAndroid Build Coastguard Worker                 mStats.onBufferUnused(iter->second->mAllocSize);
201*4d7e907cSAndroid Build Coastguard Worker                 mFreeBuffers.insert(bufferId);
202*4d7e907cSAndroid Build Coastguard Worker             } else {
203*4d7e907cSAndroid Build Coastguard Worker                 mStats.onBufferUnused(iter->second->mAllocSize);
204*4d7e907cSAndroid Build Coastguard Worker                 mStats.onBufferEvicted(iter->second->mAllocSize);
205*4d7e907cSAndroid Build Coastguard Worker                 mBuffers.erase(iter);
206*4d7e907cSAndroid Build Coastguard Worker                 mInvalidation.onBufferInvalidated(bufferId, mInvalidationChannel);
207*4d7e907cSAndroid Build Coastguard Worker             }
208*4d7e907cSAndroid Build Coastguard Worker         }
209*4d7e907cSAndroid Build Coastguard Worker     }
210*4d7e907cSAndroid Build Coastguard Worker     erase(&mUsingConnections, bufferId, connectionId);
211*4d7e907cSAndroid Build Coastguard Worker     ALOGV("release buffer %u : %d", bufferId, deleted);
212*4d7e907cSAndroid Build Coastguard Worker     return deleted;
213*4d7e907cSAndroid Build Coastguard Worker }
214*4d7e907cSAndroid Build Coastguard Worker 
handleTransferTo(const BufferStatusMessage & message)215*4d7e907cSAndroid Build Coastguard Worker bool BufferPool::handleTransferTo(const BufferStatusMessage &message) {
216*4d7e907cSAndroid Build Coastguard Worker     auto completed = mCompletedTransactions.find(
217*4d7e907cSAndroid Build Coastguard Worker             message.transactionId);
218*4d7e907cSAndroid Build Coastguard Worker     if (completed != mCompletedTransactions.end()) {
219*4d7e907cSAndroid Build Coastguard Worker         // already completed
220*4d7e907cSAndroid Build Coastguard Worker         mCompletedTransactions.erase(completed);
221*4d7e907cSAndroid Build Coastguard Worker         return true;
222*4d7e907cSAndroid Build Coastguard Worker     }
223*4d7e907cSAndroid Build Coastguard Worker     // the buffer should exist and be owned.
224*4d7e907cSAndroid Build Coastguard Worker     auto bufferIter = mBuffers.find(message.bufferId);
225*4d7e907cSAndroid Build Coastguard Worker     if (bufferIter == mBuffers.end() ||
226*4d7e907cSAndroid Build Coastguard Worker             !contains(&mUsingBuffers, message.connectionId, FromAidl(message.bufferId))) {
227*4d7e907cSAndroid Build Coastguard Worker         return false;
228*4d7e907cSAndroid Build Coastguard Worker     }
229*4d7e907cSAndroid Build Coastguard Worker     auto found = mTransactions.find(message.transactionId);
230*4d7e907cSAndroid Build Coastguard Worker     if (found != mTransactions.end()) {
231*4d7e907cSAndroid Build Coastguard Worker         // transfer_from was received earlier.
232*4d7e907cSAndroid Build Coastguard Worker         found->second->mSender = message.connectionId;
233*4d7e907cSAndroid Build Coastguard Worker         found->second->mSenderValidated = true;
234*4d7e907cSAndroid Build Coastguard Worker         return true;
235*4d7e907cSAndroid Build Coastguard Worker     }
236*4d7e907cSAndroid Build Coastguard Worker     if (mConnectionIds.find(message.targetConnectionId) == mConnectionIds.end()) {
237*4d7e907cSAndroid Build Coastguard Worker         // N.B: it could be fake or receive connection already closed.
238*4d7e907cSAndroid Build Coastguard Worker         ALOGD("bufferpool2 %p receiver connection %lld is no longer valid",
239*4d7e907cSAndroid Build Coastguard Worker               this, (long long)message.targetConnectionId);
240*4d7e907cSAndroid Build Coastguard Worker         return false;
241*4d7e907cSAndroid Build Coastguard Worker     }
242*4d7e907cSAndroid Build Coastguard Worker     mStats.onBufferSent();
243*4d7e907cSAndroid Build Coastguard Worker     mTransactions.insert(std::make_pair(
244*4d7e907cSAndroid Build Coastguard Worker             message.transactionId,
245*4d7e907cSAndroid Build Coastguard Worker             std::make_unique<TransactionStatus>(message, mTimestampMs)));
246*4d7e907cSAndroid Build Coastguard Worker     insert(&mPendingTransactions, message.targetConnectionId,
247*4d7e907cSAndroid Build Coastguard Worker            FromAidl(message.transactionId));
248*4d7e907cSAndroid Build Coastguard Worker     bufferIter->second->mTransactionCount++;
249*4d7e907cSAndroid Build Coastguard Worker     return true;
250*4d7e907cSAndroid Build Coastguard Worker }
251*4d7e907cSAndroid Build Coastguard Worker 
handleTransferFrom(const BufferStatusMessage & message)252*4d7e907cSAndroid Build Coastguard Worker bool BufferPool::handleTransferFrom(const BufferStatusMessage &message) {
253*4d7e907cSAndroid Build Coastguard Worker     auto found = mTransactions.find(message.transactionId);
254*4d7e907cSAndroid Build Coastguard Worker     if (found == mTransactions.end()) {
255*4d7e907cSAndroid Build Coastguard Worker         // TODO: is it feasible to check ownership here?
256*4d7e907cSAndroid Build Coastguard Worker         mStats.onBufferSent();
257*4d7e907cSAndroid Build Coastguard Worker         mTransactions.insert(std::make_pair(
258*4d7e907cSAndroid Build Coastguard Worker                 message.transactionId,
259*4d7e907cSAndroid Build Coastguard Worker                 std::make_unique<TransactionStatus>(message, mTimestampMs)));
260*4d7e907cSAndroid Build Coastguard Worker         insert(&mPendingTransactions, message.connectionId,
261*4d7e907cSAndroid Build Coastguard Worker                FromAidl(message.transactionId));
262*4d7e907cSAndroid Build Coastguard Worker         auto bufferIter = mBuffers.find(message.bufferId);
263*4d7e907cSAndroid Build Coastguard Worker         bufferIter->second->mTransactionCount++;
264*4d7e907cSAndroid Build Coastguard Worker     } else {
265*4d7e907cSAndroid Build Coastguard Worker         if (message.connectionId == found->second->mReceiver) {
266*4d7e907cSAndroid Build Coastguard Worker             found->second->mStatus = BufferStatus::TRANSFER_FROM;
267*4d7e907cSAndroid Build Coastguard Worker         }
268*4d7e907cSAndroid Build Coastguard Worker     }
269*4d7e907cSAndroid Build Coastguard Worker     return true;
270*4d7e907cSAndroid Build Coastguard Worker }
271*4d7e907cSAndroid Build Coastguard Worker 
handleTransferResult(const BufferStatusMessage & message)272*4d7e907cSAndroid Build Coastguard Worker bool BufferPool::handleTransferResult(const BufferStatusMessage &message) {
273*4d7e907cSAndroid Build Coastguard Worker     auto found = mTransactions.find(message.transactionId);
274*4d7e907cSAndroid Build Coastguard Worker     if (found != mTransactions.end()) {
275*4d7e907cSAndroid Build Coastguard Worker         bool deleted = erase(&mPendingTransactions, message.connectionId,
276*4d7e907cSAndroid Build Coastguard Worker                              FromAidl(message.transactionId));
277*4d7e907cSAndroid Build Coastguard Worker         if (deleted) {
278*4d7e907cSAndroid Build Coastguard Worker             if (!found->second->mSenderValidated) {
279*4d7e907cSAndroid Build Coastguard Worker                 mCompletedTransactions.insert(message.transactionId);
280*4d7e907cSAndroid Build Coastguard Worker             }
281*4d7e907cSAndroid Build Coastguard Worker             auto bufferIter = mBuffers.find(message.bufferId);
282*4d7e907cSAndroid Build Coastguard Worker             if (message.status == BufferStatus::TRANSFER_OK) {
283*4d7e907cSAndroid Build Coastguard Worker                 handleOwnBuffer(message.connectionId, message.bufferId);
284*4d7e907cSAndroid Build Coastguard Worker             }
285*4d7e907cSAndroid Build Coastguard Worker             bufferIter->second->mTransactionCount--;
286*4d7e907cSAndroid Build Coastguard Worker             if (bufferIter->second->mOwnerCount == 0
287*4d7e907cSAndroid Build Coastguard Worker                 && bufferIter->second->mTransactionCount == 0) {
288*4d7e907cSAndroid Build Coastguard Worker                 if (!bufferIter->second->mInvalidated) {
289*4d7e907cSAndroid Build Coastguard Worker                     mStats.onBufferUnused(bufferIter->second->mAllocSize);
290*4d7e907cSAndroid Build Coastguard Worker                     mFreeBuffers.insert(message.bufferId);
291*4d7e907cSAndroid Build Coastguard Worker                 } else {
292*4d7e907cSAndroid Build Coastguard Worker                     mStats.onBufferUnused(bufferIter->second->mAllocSize);
293*4d7e907cSAndroid Build Coastguard Worker                     mStats.onBufferEvicted(bufferIter->second->mAllocSize);
294*4d7e907cSAndroid Build Coastguard Worker                     mBuffers.erase(bufferIter);
295*4d7e907cSAndroid Build Coastguard Worker                     mInvalidation.onBufferInvalidated(message.bufferId, mInvalidationChannel);
296*4d7e907cSAndroid Build Coastguard Worker                 }
297*4d7e907cSAndroid Build Coastguard Worker             }
298*4d7e907cSAndroid Build Coastguard Worker             mTransactions.erase(found);
299*4d7e907cSAndroid Build Coastguard Worker         }
300*4d7e907cSAndroid Build Coastguard Worker         ALOGV("transfer finished %llu %u - %d", (unsigned long long)message.transactionId,
301*4d7e907cSAndroid Build Coastguard Worker               message.bufferId, deleted);
302*4d7e907cSAndroid Build Coastguard Worker         return deleted;
303*4d7e907cSAndroid Build Coastguard Worker     }
304*4d7e907cSAndroid Build Coastguard Worker     ALOGV("transfer not found %llu %u", (unsigned long long)message.transactionId,
305*4d7e907cSAndroid Build Coastguard Worker           message.bufferId);
306*4d7e907cSAndroid Build Coastguard Worker     return false;
307*4d7e907cSAndroid Build Coastguard Worker }
308*4d7e907cSAndroid Build Coastguard Worker 
processStatusMessages()309*4d7e907cSAndroid Build Coastguard Worker void BufferPool::processStatusMessages() {
310*4d7e907cSAndroid Build Coastguard Worker     std::vector<BufferStatusMessage> messages;
311*4d7e907cSAndroid Build Coastguard Worker     mObserver.getBufferStatusChanges(messages);
312*4d7e907cSAndroid Build Coastguard Worker     mTimestampMs = ::android::elapsedRealtime();
313*4d7e907cSAndroid Build Coastguard Worker     for (BufferStatusMessage& message: messages) {
314*4d7e907cSAndroid Build Coastguard Worker         bool ret = false;
315*4d7e907cSAndroid Build Coastguard Worker         switch (message.status) {
316*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::NOT_USED:
317*4d7e907cSAndroid Build Coastguard Worker                 ret = handleReleaseBuffer(
318*4d7e907cSAndroid Build Coastguard Worker                         message.connectionId, message.bufferId);
319*4d7e907cSAndroid Build Coastguard Worker                 break;
320*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::USED:
321*4d7e907cSAndroid Build Coastguard Worker                 // not happening
322*4d7e907cSAndroid Build Coastguard Worker                 break;
323*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::TRANSFER_TO:
324*4d7e907cSAndroid Build Coastguard Worker                 ret = handleTransferTo(message);
325*4d7e907cSAndroid Build Coastguard Worker                 break;
326*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::TRANSFER_FROM:
327*4d7e907cSAndroid Build Coastguard Worker                 ret = handleTransferFrom(message);
328*4d7e907cSAndroid Build Coastguard Worker                 break;
329*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::TRANSFER_TIMEOUT:
330*4d7e907cSAndroid Build Coastguard Worker                 // TODO
331*4d7e907cSAndroid Build Coastguard Worker                 break;
332*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::TRANSFER_LOST:
333*4d7e907cSAndroid Build Coastguard Worker                 // TODO
334*4d7e907cSAndroid Build Coastguard Worker                 break;
335*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::TRANSFER_FETCH:
336*4d7e907cSAndroid Build Coastguard Worker                 // not happening
337*4d7e907cSAndroid Build Coastguard Worker                 break;
338*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::TRANSFER_OK:
339*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::TRANSFER_ERROR:
340*4d7e907cSAndroid Build Coastguard Worker                 ret = handleTransferResult(message);
341*4d7e907cSAndroid Build Coastguard Worker                 break;
342*4d7e907cSAndroid Build Coastguard Worker             case BufferStatus::INVALIDATION_ACK:
343*4d7e907cSAndroid Build Coastguard Worker                 mInvalidation.onAck(message.connectionId, message.bufferId);
344*4d7e907cSAndroid Build Coastguard Worker                 ret = true;
345*4d7e907cSAndroid Build Coastguard Worker                 break;
346*4d7e907cSAndroid Build Coastguard Worker         }
347*4d7e907cSAndroid Build Coastguard Worker         if (ret == false) {
348*4d7e907cSAndroid Build Coastguard Worker             ALOGW("buffer status message processing failure - message : %d connection : %lld",
349*4d7e907cSAndroid Build Coastguard Worker                   message.status, (long long)message.connectionId);
350*4d7e907cSAndroid Build Coastguard Worker         }
351*4d7e907cSAndroid Build Coastguard Worker     }
352*4d7e907cSAndroid Build Coastguard Worker     messages.clear();
353*4d7e907cSAndroid Build Coastguard Worker }
354*4d7e907cSAndroid Build Coastguard Worker 
handleClose(ConnectionId connectionId)355*4d7e907cSAndroid Build Coastguard Worker bool BufferPool::handleClose(ConnectionId connectionId) {
356*4d7e907cSAndroid Build Coastguard Worker     // Cleaning buffers
357*4d7e907cSAndroid Build Coastguard Worker     auto buffers = mUsingBuffers.find(connectionId);
358*4d7e907cSAndroid Build Coastguard Worker     if (buffers != mUsingBuffers.end()) {
359*4d7e907cSAndroid Build Coastguard Worker         for (const BufferId& bufferId : buffers->second) {
360*4d7e907cSAndroid Build Coastguard Worker             bool deleted = erase(&mUsingConnections, bufferId, connectionId);
361*4d7e907cSAndroid Build Coastguard Worker             if (deleted) {
362*4d7e907cSAndroid Build Coastguard Worker                 auto bufferIter = mBuffers.find(bufferId);
363*4d7e907cSAndroid Build Coastguard Worker                 bufferIter->second->mOwnerCount--;
364*4d7e907cSAndroid Build Coastguard Worker                 if (bufferIter->second->mOwnerCount == 0 &&
365*4d7e907cSAndroid Build Coastguard Worker                         bufferIter->second->mTransactionCount == 0) {
366*4d7e907cSAndroid Build Coastguard Worker                     // TODO: handle freebuffer insert fail
367*4d7e907cSAndroid Build Coastguard Worker                     if (!bufferIter->second->mInvalidated) {
368*4d7e907cSAndroid Build Coastguard Worker                         mStats.onBufferUnused(bufferIter->second->mAllocSize);
369*4d7e907cSAndroid Build Coastguard Worker                         mFreeBuffers.insert(bufferId);
370*4d7e907cSAndroid Build Coastguard Worker                     } else {
371*4d7e907cSAndroid Build Coastguard Worker                         mStats.onBufferUnused(bufferIter->second->mAllocSize);
372*4d7e907cSAndroid Build Coastguard Worker                         mStats.onBufferEvicted(bufferIter->second->mAllocSize);
373*4d7e907cSAndroid Build Coastguard Worker                         mBuffers.erase(bufferIter);
374*4d7e907cSAndroid Build Coastguard Worker                         mInvalidation.onBufferInvalidated(bufferId, mInvalidationChannel);
375*4d7e907cSAndroid Build Coastguard Worker                     }
376*4d7e907cSAndroid Build Coastguard Worker                 }
377*4d7e907cSAndroid Build Coastguard Worker             }
378*4d7e907cSAndroid Build Coastguard Worker         }
379*4d7e907cSAndroid Build Coastguard Worker         mUsingBuffers.erase(buffers);
380*4d7e907cSAndroid Build Coastguard Worker     }
381*4d7e907cSAndroid Build Coastguard Worker 
382*4d7e907cSAndroid Build Coastguard Worker     // Cleaning transactions
383*4d7e907cSAndroid Build Coastguard Worker     auto pending = mPendingTransactions.find(connectionId);
384*4d7e907cSAndroid Build Coastguard Worker     if (pending != mPendingTransactions.end()) {
385*4d7e907cSAndroid Build Coastguard Worker         for (const TransactionId& transactionId : pending->second) {
386*4d7e907cSAndroid Build Coastguard Worker             auto iter = mTransactions.find(transactionId);
387*4d7e907cSAndroid Build Coastguard Worker             if (iter != mTransactions.end()) {
388*4d7e907cSAndroid Build Coastguard Worker                 if (!iter->second->mSenderValidated) {
389*4d7e907cSAndroid Build Coastguard Worker                     mCompletedTransactions.insert(transactionId);
390*4d7e907cSAndroid Build Coastguard Worker                 }
391*4d7e907cSAndroid Build Coastguard Worker                 BufferId bufferId = iter->second->mBufferId;
392*4d7e907cSAndroid Build Coastguard Worker                 auto bufferIter = mBuffers.find(bufferId);
393*4d7e907cSAndroid Build Coastguard Worker                 bufferIter->second->mTransactionCount--;
394*4d7e907cSAndroid Build Coastguard Worker                 if (bufferIter->second->mOwnerCount == 0 &&
395*4d7e907cSAndroid Build Coastguard Worker                     bufferIter->second->mTransactionCount == 0) {
396*4d7e907cSAndroid Build Coastguard Worker                     // TODO: handle freebuffer insert fail
397*4d7e907cSAndroid Build Coastguard Worker                     if (!bufferIter->second->mInvalidated) {
398*4d7e907cSAndroid Build Coastguard Worker                         mStats.onBufferUnused(bufferIter->second->mAllocSize);
399*4d7e907cSAndroid Build Coastguard Worker                         mFreeBuffers.insert(bufferId);
400*4d7e907cSAndroid Build Coastguard Worker                     } else {
401*4d7e907cSAndroid Build Coastguard Worker                         mStats.onBufferUnused(bufferIter->second->mAllocSize);
402*4d7e907cSAndroid Build Coastguard Worker                         mStats.onBufferEvicted(bufferIter->second->mAllocSize);
403*4d7e907cSAndroid Build Coastguard Worker                         mBuffers.erase(bufferIter);
404*4d7e907cSAndroid Build Coastguard Worker                         mInvalidation.onBufferInvalidated(bufferId, mInvalidationChannel);
405*4d7e907cSAndroid Build Coastguard Worker                     }
406*4d7e907cSAndroid Build Coastguard Worker                 }
407*4d7e907cSAndroid Build Coastguard Worker                 mTransactions.erase(iter);
408*4d7e907cSAndroid Build Coastguard Worker             }
409*4d7e907cSAndroid Build Coastguard Worker         }
410*4d7e907cSAndroid Build Coastguard Worker     }
411*4d7e907cSAndroid Build Coastguard Worker     mConnectionIds.erase(connectionId);
412*4d7e907cSAndroid Build Coastguard Worker     return true;
413*4d7e907cSAndroid Build Coastguard Worker }
414*4d7e907cSAndroid Build Coastguard Worker 
getFreeBuffer(const std::shared_ptr<BufferPoolAllocator> & allocator,const std::vector<uint8_t> & params,BufferId * pId,const native_handle_t ** handle)415*4d7e907cSAndroid Build Coastguard Worker bool BufferPool::getFreeBuffer(
416*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<BufferPoolAllocator> &allocator,
417*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t> &params, BufferId *pId,
418*4d7e907cSAndroid Build Coastguard Worker         const native_handle_t** handle) {
419*4d7e907cSAndroid Build Coastguard Worker     auto bufferIt = mFreeBuffers.begin();
420*4d7e907cSAndroid Build Coastguard Worker     for (;bufferIt != mFreeBuffers.end(); ++bufferIt) {
421*4d7e907cSAndroid Build Coastguard Worker         BufferId bufferId = *bufferIt;
422*4d7e907cSAndroid Build Coastguard Worker         if (allocator->compatible(params, mBuffers[bufferId]->mConfig)) {
423*4d7e907cSAndroid Build Coastguard Worker             break;
424*4d7e907cSAndroid Build Coastguard Worker         }
425*4d7e907cSAndroid Build Coastguard Worker     }
426*4d7e907cSAndroid Build Coastguard Worker     if (bufferIt != mFreeBuffers.end()) {
427*4d7e907cSAndroid Build Coastguard Worker         BufferId id = *bufferIt;
428*4d7e907cSAndroid Build Coastguard Worker         mFreeBuffers.erase(bufferIt);
429*4d7e907cSAndroid Build Coastguard Worker         mStats.onBufferRecycled(mBuffers[id]->mAllocSize);
430*4d7e907cSAndroid Build Coastguard Worker         *handle = mBuffers[id]->handle();
431*4d7e907cSAndroid Build Coastguard Worker         *pId = id;
432*4d7e907cSAndroid Build Coastguard Worker         ALOGV("recycle a buffer %u %p", id, *handle);
433*4d7e907cSAndroid Build Coastguard Worker         return true;
434*4d7e907cSAndroid Build Coastguard Worker     }
435*4d7e907cSAndroid Build Coastguard Worker     return false;
436*4d7e907cSAndroid Build Coastguard Worker }
437*4d7e907cSAndroid Build Coastguard Worker 
addNewBuffer(const std::shared_ptr<BufferPoolAllocation> & alloc,const size_t allocSize,const std::vector<uint8_t> & params,BufferId * pId,const native_handle_t ** handle)438*4d7e907cSAndroid Build Coastguard Worker BufferPoolStatus BufferPool::addNewBuffer(
439*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<BufferPoolAllocation> &alloc,
440*4d7e907cSAndroid Build Coastguard Worker         const size_t allocSize,
441*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t> &params,
442*4d7e907cSAndroid Build Coastguard Worker         BufferId *pId,
443*4d7e907cSAndroid Build Coastguard Worker         const native_handle_t** handle) {
444*4d7e907cSAndroid Build Coastguard Worker 
445*4d7e907cSAndroid Build Coastguard Worker     BufferId bufferId = mSeq++;
446*4d7e907cSAndroid Build Coastguard Worker     if (mSeq == Connection::SYNC_BUFFERID) {
447*4d7e907cSAndroid Build Coastguard Worker         mSeq = 0;
448*4d7e907cSAndroid Build Coastguard Worker     }
449*4d7e907cSAndroid Build Coastguard Worker     std::unique_ptr<InternalBuffer> buffer =
450*4d7e907cSAndroid Build Coastguard Worker             std::make_unique<InternalBuffer>(
451*4d7e907cSAndroid Build Coastguard Worker                     bufferId, alloc, allocSize, params);
452*4d7e907cSAndroid Build Coastguard Worker     if (buffer) {
453*4d7e907cSAndroid Build Coastguard Worker         auto res = mBuffers.insert(std::make_pair(
454*4d7e907cSAndroid Build Coastguard Worker                 bufferId, std::move(buffer)));
455*4d7e907cSAndroid Build Coastguard Worker         if (res.second) {
456*4d7e907cSAndroid Build Coastguard Worker             mStats.onBufferAllocated(allocSize);
457*4d7e907cSAndroid Build Coastguard Worker             *handle = alloc->handle();
458*4d7e907cSAndroid Build Coastguard Worker             *pId = bufferId;
459*4d7e907cSAndroid Build Coastguard Worker             return ResultStatus::OK;
460*4d7e907cSAndroid Build Coastguard Worker         }
461*4d7e907cSAndroid Build Coastguard Worker     }
462*4d7e907cSAndroid Build Coastguard Worker     return ResultStatus::NO_MEMORY;
463*4d7e907cSAndroid Build Coastguard Worker }
464*4d7e907cSAndroid Build Coastguard Worker 
cleanUp(bool clearCache)465*4d7e907cSAndroid Build Coastguard Worker void BufferPool::cleanUp(bool clearCache) {
466*4d7e907cSAndroid Build Coastguard Worker     if (clearCache || mTimestampMs > mLastCleanUpMs + kCleanUpDurationMs ||
467*4d7e907cSAndroid Build Coastguard Worker             mStats.buffersNotInUse() > kMaxUnusedBufferCount) {
468*4d7e907cSAndroid Build Coastguard Worker         mLastCleanUpMs = mTimestampMs;
469*4d7e907cSAndroid Build Coastguard Worker         if (mTimestampMs > mLastLogMs + kLogDurationMs ||
470*4d7e907cSAndroid Build Coastguard Worker                 mStats.buffersNotInUse() > kMaxUnusedBufferCount) {
471*4d7e907cSAndroid Build Coastguard Worker             mLastLogMs = mTimestampMs;
472*4d7e907cSAndroid Build Coastguard Worker             ALOGD("bufferpool2 %p : %zu(%zu size) total buffers - "
473*4d7e907cSAndroid Build Coastguard Worker                   "%zu(%zu size) used buffers - %zu/%zu (recycle/alloc) - "
474*4d7e907cSAndroid Build Coastguard Worker                   "%zu/%zu (fetch/transfer)",
475*4d7e907cSAndroid Build Coastguard Worker                   this, mStats.mBuffersCached, mStats.mSizeCached,
476*4d7e907cSAndroid Build Coastguard Worker                   mStats.mBuffersInUse, mStats.mSizeInUse,
477*4d7e907cSAndroid Build Coastguard Worker                   mStats.mTotalRecycles, mStats.mTotalAllocations,
478*4d7e907cSAndroid Build Coastguard Worker                   mStats.mTotalFetches, mStats.mTotalTransfers);
479*4d7e907cSAndroid Build Coastguard Worker         }
480*4d7e907cSAndroid Build Coastguard Worker         for (auto freeIt = mFreeBuffers.begin(); freeIt != mFreeBuffers.end();) {
481*4d7e907cSAndroid Build Coastguard Worker             if (!clearCache && mStats.buffersNotInUse() <= kUnusedBufferCountTarget &&
482*4d7e907cSAndroid Build Coastguard Worker                     (mStats.mSizeCached < kMinAllocBytesForEviction ||
483*4d7e907cSAndroid Build Coastguard Worker                      mBuffers.size() < kMinBufferCountForEviction)) {
484*4d7e907cSAndroid Build Coastguard Worker                 break;
485*4d7e907cSAndroid Build Coastguard Worker             }
486*4d7e907cSAndroid Build Coastguard Worker             auto it = mBuffers.find(*freeIt);
487*4d7e907cSAndroid Build Coastguard Worker             if (it != mBuffers.end() &&
488*4d7e907cSAndroid Build Coastguard Worker                     it->second->mOwnerCount == 0 && it->second->mTransactionCount == 0) {
489*4d7e907cSAndroid Build Coastguard Worker                 mStats.onBufferEvicted(it->second->mAllocSize);
490*4d7e907cSAndroid Build Coastguard Worker                 mBuffers.erase(it);
491*4d7e907cSAndroid Build Coastguard Worker                 freeIt = mFreeBuffers.erase(freeIt);
492*4d7e907cSAndroid Build Coastguard Worker             } else {
493*4d7e907cSAndroid Build Coastguard Worker                 ++freeIt;
494*4d7e907cSAndroid Build Coastguard Worker                 ALOGW("bufferpool2 inconsistent!");
495*4d7e907cSAndroid Build Coastguard Worker             }
496*4d7e907cSAndroid Build Coastguard Worker         }
497*4d7e907cSAndroid Build Coastguard Worker     }
498*4d7e907cSAndroid Build Coastguard Worker }
499*4d7e907cSAndroid Build Coastguard Worker 
invalidate(bool needsAck,BufferId from,BufferId to,const std::shared_ptr<Accessor> & impl)500*4d7e907cSAndroid Build Coastguard Worker void BufferPool::invalidate(
501*4d7e907cSAndroid Build Coastguard Worker         bool needsAck, BufferId from, BufferId to,
502*4d7e907cSAndroid Build Coastguard Worker         const std::shared_ptr<Accessor> &impl) {
503*4d7e907cSAndroid Build Coastguard Worker     for (auto freeIt = mFreeBuffers.begin(); freeIt != mFreeBuffers.end();) {
504*4d7e907cSAndroid Build Coastguard Worker         if (isBufferInRange(from, to, *freeIt)) {
505*4d7e907cSAndroid Build Coastguard Worker             auto it = mBuffers.find(*freeIt);
506*4d7e907cSAndroid Build Coastguard Worker             if (it != mBuffers.end() &&
507*4d7e907cSAndroid Build Coastguard Worker                 it->second->mOwnerCount == 0 && it->second->mTransactionCount == 0) {
508*4d7e907cSAndroid Build Coastguard Worker                 mStats.onBufferEvicted(it->second->mAllocSize);
509*4d7e907cSAndroid Build Coastguard Worker                 mBuffers.erase(it);
510*4d7e907cSAndroid Build Coastguard Worker                 freeIt = mFreeBuffers.erase(freeIt);
511*4d7e907cSAndroid Build Coastguard Worker                 continue;
512*4d7e907cSAndroid Build Coastguard Worker             } else {
513*4d7e907cSAndroid Build Coastguard Worker                 ALOGW("bufferpool2 inconsistent!");
514*4d7e907cSAndroid Build Coastguard Worker             }
515*4d7e907cSAndroid Build Coastguard Worker         }
516*4d7e907cSAndroid Build Coastguard Worker         ++freeIt;
517*4d7e907cSAndroid Build Coastguard Worker     }
518*4d7e907cSAndroid Build Coastguard Worker 
519*4d7e907cSAndroid Build Coastguard Worker     size_t left = 0;
520*4d7e907cSAndroid Build Coastguard Worker     for (auto it = mBuffers.begin(); it != mBuffers.end(); ++it) {
521*4d7e907cSAndroid Build Coastguard Worker         if (isBufferInRange(from, to, it->first)) {
522*4d7e907cSAndroid Build Coastguard Worker             it->second->invalidate();
523*4d7e907cSAndroid Build Coastguard Worker             ++left;
524*4d7e907cSAndroid Build Coastguard Worker         }
525*4d7e907cSAndroid Build Coastguard Worker     }
526*4d7e907cSAndroid Build Coastguard Worker     mInvalidation.onInvalidationRequest(needsAck, from, to, left, mInvalidationChannel, impl);
527*4d7e907cSAndroid Build Coastguard Worker }
528*4d7e907cSAndroid Build Coastguard Worker 
flush(const std::shared_ptr<Accessor> & impl)529*4d7e907cSAndroid Build Coastguard Worker void BufferPool::flush(const std::shared_ptr<Accessor> &impl) {
530*4d7e907cSAndroid Build Coastguard Worker     BufferId from = mStartSeq;
531*4d7e907cSAndroid Build Coastguard Worker     BufferId to = mSeq;
532*4d7e907cSAndroid Build Coastguard Worker     mStartSeq = mSeq;
533*4d7e907cSAndroid Build Coastguard Worker     // TODO: needsAck params
534*4d7e907cSAndroid Build Coastguard Worker     ALOGV("buffer invalidation request bp:%u %u %u", mInvalidation.mId, from, to);
535*4d7e907cSAndroid Build Coastguard Worker     if (from != to) {
536*4d7e907cSAndroid Build Coastguard Worker         invalidate(true, from, to, impl);
537*4d7e907cSAndroid Build Coastguard Worker     }
538*4d7e907cSAndroid Build Coastguard Worker }
539*4d7e907cSAndroid Build Coastguard Worker 
540*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::media::bufferpool2::implementation
541