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