Skip to content

Commit c3130a5

Browse files
author
Anton Ivanov
committed
Avoid copying Transaction objects unneccessarily.
Flag: EXEMPT refactor Bug: 385156191 Test: presubmit Change-Id: Ibd9d64bd7d41adbf5af0dacd660b6aaed6bc8741
1 parent 11a92a9 commit c3130a5

File tree

8 files changed

+35
-19
lines changed

8 files changed

+35
-19
lines changed

libs/gui/BLASTBufferQueue.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,7 @@ void BLASTBufferQueue::mergeWithNextTransaction(SurfaceComposerClient::Transacti
10321032
// Apply the transaction since we have already acquired the desired frame.
10331033
t->setApplyToken(mApplyToken).apply();
10341034
} else {
1035-
mPendingTransactions.emplace_back(frameNumber, *t);
1035+
mPendingTransactions.emplace_back(frameNumber, std::move(*t));
10361036
// Clear the transaction so it can't be applied elsewhere.
10371037
t->clear();
10381038
}
@@ -1050,8 +1050,8 @@ void BLASTBufferQueue::applyPendingTransactions(uint64_t frameNumber) {
10501050
void BLASTBufferQueue::mergePendingTransactions(SurfaceComposerClient::Transaction* t,
10511051
uint64_t frameNumber) {
10521052
auto mergeTransaction =
1053-
[&t, currentFrameNumber = frameNumber](
1054-
std::tuple<uint64_t, SurfaceComposerClient::Transaction> pendingTransaction) {
1053+
[t, currentFrameNumber = frameNumber](
1054+
std::pair<uint64_t, SurfaceComposerClient::Transaction>& pendingTransaction) {
10551055
auto& [targetFrameNumber, transaction] = pendingTransaction;
10561056
if (currentFrameNumber < targetFrameNumber) {
10571057
return false;

libs/gui/SurfaceComposerClient.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -828,11 +828,10 @@ SurfaceComposerClient::Transaction::Transaction() {
828828
mTransactionCompletedListener = TransactionCompletedListener::getInstance();
829829
}
830830

831-
SurfaceComposerClient::Transaction::Transaction(const Transaction& other) {
832-
mState = other.mState;
833-
mListenerCallbacks = other.mListenerCallbacks;
834-
mTransactionCompletedListener = TransactionCompletedListener::getInstance();
835-
}
831+
SurfaceComposerClient::Transaction::Transaction(Transaction&& other)
832+
: mTransactionCompletedListener(TransactionCompletedListener::getInstance()),
833+
mState(std::move(other.mState)),
834+
mListenerCallbacks(std::move(other.mListenerCallbacks)) {}
836835

837836
void SurfaceComposerClient::Transaction::sanitize(int pid, int uid) {
838837
uint32_t permissions = LayerStatePermissions::getTransactionPermissions(pid, uid);

libs/gui/include/gui/BLASTBufferQueue.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ class BLASTBufferQueue : public ConsumerBase::FrameAvailableListener {
284284
std::function<void(SurfaceComposerClient::Transaction*)> mTransactionReadyCallback
285285
GUARDED_BY(mMutex);
286286
SurfaceComposerClient::Transaction* mSyncTransaction GUARDED_BY(mMutex);
287-
std::vector<std::tuple<uint64_t /* framenumber */, SurfaceComposerClient::Transaction>>
287+
std::vector<std::pair<uint64_t /* framenumber */, SurfaceComposerClient::Transaction>>
288288
mPendingTransactions GUARDED_BY(mMutex);
289289

290290
std::queue<std::pair<uint64_t, FrameTimelineInfo>> mPendingFrameTimelines GUARDED_BY(mMutex);

libs/gui/include/gui/SurfaceComposerClient.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ class SurfaceComposerClient : public RefBase
443443
virtual ~PresentationCallbackRAII();
444444
};
445445

446-
class Transaction : public Parcelable {
446+
class Transaction {
447447
private:
448448
static sp<IBinder> sApplyToken;
449449
static std::mutex sApplyTokenMutex;
@@ -464,19 +464,20 @@ class SurfaceComposerClient : public RefBase
464464

465465
protected:
466466
// Accessed in tests.
467+
explicit Transaction(Transaction const& other) = default;
467468
std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash>
468469
mListenerCallbacks;
469470

470471
public:
471472
Transaction();
472-
virtual ~Transaction() = default;
473-
Transaction(Transaction const& other);
473+
Transaction(Transaction&& other);
474+
Transaction& operator=(Transaction&& other) = default;
474475

475476
// Factory method that creates a new Transaction instance from the parcel.
476477
static std::unique_ptr<Transaction> createFromParcel(const Parcel* parcel);
477478

478-
status_t writeToParcel(Parcel* parcel) const override;
479-
status_t readFromParcel(const Parcel* parcel) override;
479+
status_t writeToParcel(Parcel* parcel) const;
480+
status_t readFromParcel(const Parcel* parcel);
480481

481482
// Clears the contents of the transaction without applying it.
482483
void clear();

libs/gui/include/gui/TransactionState.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace android {
2626
class TransactionState {
2727
public:
2828
explicit TransactionState() = default;
29-
TransactionState(TransactionState const& other) = default;
29+
TransactionState(TransactionState&& other) = default;
30+
TransactionState& operator=(TransactionState&& other) = default;
3031
status_t writeToParcel(Parcel* parcel) const;
3132
status_t readFromParcel(const Parcel* parcel);
3233
layer_state_t* getLayerState(const sp<SurfaceControl>& sc);
@@ -86,6 +87,9 @@ class TransactionState {
8687
std::vector<ListenerCallbacks> mListenerCallbacks;
8788

8889
private:
90+
explicit TransactionState(TransactionState const& other) = default;
91+
friend class TransactionApplicationTest;
92+
friend class SurfaceComposerClient;
8993
// We keep track of the last MAX_MERGE_HISTORY_LENGTH merged transaction ids.
9094
// Ordered most recently merged to least recently merged.
9195
static constexpr size_t MAX_MERGE_HISTORY_LENGTH = 10u;

services/surfaceflinger/tests/DereferenceSurfaceControl_test.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class DereferenceSurfaceControlTest : public LayerTransactionTest {
5252
};
5353

5454
TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
55+
// Last strong pointer is removed, the layer is destroyed and is removed
56+
// from compostion.
5557
fgLayer = nullptr;
5658
{
5759
SCOPED_TRACE("after setting null");
@@ -61,7 +63,9 @@ TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) {
6163
}
6264

6365
TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) {
64-
auto transaction = Transaction().show(fgLayer);
66+
Transaction transaction;
67+
transaction.show(fgLayer);
68+
// |transaction| retains a strong pointer, so layer is retained.
6569
fgLayer = nullptr;
6670
{
6771
SCOPED_TRACE("after setting null");

services/surfaceflinger/tests/IPC_test.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,22 @@ using CallbackInfo = SurfaceComposerClient::CallbackInfo;
4242
using TCLHash = SurfaceComposerClient::TCLHash;
4343
using android::hardware::graphics::common::V1_1::BufferUsage;
4444

45-
class TransactionHelper : public Transaction {
45+
class TransactionHelper : public Transaction, public Parcelable {
4646
public:
47+
TransactionHelper() : Transaction() {}
4748
size_t getNumListeners() { return mListenerCallbacks.size(); }
4849

4950
std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash>
5051
getListenerCallbacks() {
5152
return mListenerCallbacks;
5253
}
54+
status_t writeToParcel(Parcel* parcel) const override {
55+
return Transaction::writeToParcel(parcel);
56+
}
57+
58+
status_t readFromParcel(const Parcel* parcel) override {
59+
return Transaction::readFromParcel(parcel);
60+
}
5361
};
5462

5563
class IPCTestUtils {

services/surfaceflinger/tests/unittests/TransactionApplicationTest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class TransactionApplicationTest : public testing::Test {
7878
}
7979
};
8080

81-
void checkEqual(TransactionInfo info, QueuedTransactionState state) {
81+
void checkEqual(const TransactionInfo& info, const QueuedTransactionState& state) {
8282
EXPECT_EQ(0u, info.mComposerStates.size());
8383
EXPECT_EQ(0u, state.states.size());
8484

@@ -383,7 +383,7 @@ class LatchUnsignaledTest : public TransactionApplicationTest {
383383
EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
384384
EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
385385
std::unordered_set<uint32_t> createdLayers;
386-
for (auto transaction : transactions) {
386+
for (auto& transaction : transactions) {
387387
for (auto& state : transaction.mComposerStates) {
388388
auto layerId = static_cast<uint32_t>(state.state.layerId);
389389
if (createdLayers.find(layerId) == createdLayers.end()) {

0 commit comments

Comments
 (0)