blob: bc69191cc1a067aff901507b3098fb24b2c3860d [file] [log] [blame]
Vishnu Nair7891e962021-11-11 12:07:21 -08001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "TransactionTracing"
19#define ATRACE_TAG ATRACE_TAG_GRAPHICS
20
21#include <android-base/stringprintf.h>
22#include <log/log.h>
23#include <utils/SystemClock.h>
24#include <utils/Trace.h>
25
Vishnu Nair81750622023-03-08 15:02:06 -080026#include "Client.h"
27#include "FrontEnd/LayerCreationArgs.h"
Vishnu Nair7891e962021-11-11 12:07:21 -080028#include "TransactionTracing.h"
29
30namespace android {
Vishnu Naird1f74982023-06-15 20:16:51 -070031ANDROID_SINGLETON_STATIC_INSTANCE(android::TransactionTraceWriter)
Vishnu Nair7891e962021-11-11 12:07:21 -080032
Vishnu Nair685cfef2022-02-02 10:01:25 -080033TransactionTracing::TransactionTracing()
Vishnu Nair81750622023-03-08 15:02:06 -080034 : mProtoParser(std::make_unique<TransactionProtoParser::FlingerDataMapper>()) {
Vishnu Nair7891e962021-11-11 12:07:21 -080035 std::scoped_lock lock(mTraceLock);
Dominik Laskowski46471e62022-01-14 15:34:03 -080036
Diwas Sharmaa0021172023-09-01 00:43:31 +000037 mBuffer.setSize(mBufferSizeInBytes);
Vishnu Nair0cc69e12021-11-18 09:05:49 -080038 mStartingTimestamp = systemTime();
Vishnu Nair7891e962021-11-11 12:07:21 -080039 {
40 std::scoped_lock lock(mMainThreadLock);
Vishnu Nair7891e962021-11-11 12:07:21 -080041 mThread = std::thread(&TransactionTracing::loop, this);
42 }
Vishnu Nair7891e962021-11-11 12:07:21 -080043}
44
Dominik Laskowski46471e62022-01-14 15:34:03 -080045TransactionTracing::~TransactionTracing() {
Vishnu Nair7891e962021-11-11 12:07:21 -080046 std::thread thread;
47 {
48 std::scoped_lock lock(mMainThreadLock);
49 mDone = true;
50 mTransactionsAvailableCv.notify_all();
51 thread = std::move(mThread);
52 }
53 if (thread.joinable()) {
54 thread.join();
55 }
56
Diwas Sharmaa0021172023-09-01 00:43:31 +000057 writeToFile();
Vishnu Nair7891e962021-11-11 12:07:21 -080058}
59
Vishnu Naird1f74982023-06-15 20:16:51 -070060status_t TransactionTracing::writeToFile(const std::string& filename) {
Diwas Sharmaa0021172023-09-01 00:43:31 +000061 std::scoped_lock lock(mTraceLock);
Diwas Sharma2401daf2023-09-01 00:45:24 +000062 proto::TransactionTraceFile fileProto = createTraceFileProto();
Diwas Sharmaa0021172023-09-01 00:43:31 +000063 addStartingStateToProtoLocked(fileProto);
64 return mBuffer.writeToFile(fileProto, filename);
Vishnu Nair7891e962021-11-11 12:07:21 -080065}
66
67void TransactionTracing::setBufferSize(size_t bufferSizeInBytes) {
68 std::scoped_lock lock(mTraceLock);
Diwas Sharmaa0021172023-09-01 00:43:31 +000069 mBufferSizeInBytes = bufferSizeInBytes;
70 mBuffer.setSize(mBufferSizeInBytes);
Vishnu Nair7891e962021-11-11 12:07:21 -080071}
72
Diwas Sharma2401daf2023-09-01 00:45:24 +000073proto::TransactionTraceFile TransactionTracing::createTraceFileProto() const {
74 proto::TransactionTraceFile proto;
75 proto.set_magic_number(uint64_t(proto::TransactionTraceFile_MagicNumber_MAGIC_NUMBER_H) << 32 |
76 proto::TransactionTraceFile_MagicNumber_MAGIC_NUMBER_L);
Diwas Sharmaa0021172023-09-01 00:43:31 +000077 auto timeOffsetNs = static_cast<std::uint64_t>(systemTime(SYSTEM_TIME_REALTIME) -
78 systemTime(SYSTEM_TIME_MONOTONIC));
Kean Mariottic44fdaf2022-07-29 14:20:39 +000079 proto.set_real_to_elapsed_time_offset_nanos(timeOffsetNs);
Vishnu Nair81750622023-03-08 15:02:06 -080080 proto.set_version(TRACING_VERSION);
Vishnu Nair7891e962021-11-11 12:07:21 -080081 return proto;
82}
83
84void TransactionTracing::dump(std::string& result) const {
85 std::scoped_lock lock(mTraceLock);
Vishnu Nair81750622023-03-08 15:02:06 -080086 base::StringAppendF(&result, " queued transactions=%zu created layers=%zu states=%zu\n",
87 mQueuedTransactions.size(), mCreatedLayers.size(), mStartingStates.size());
Dominik Laskowski46471e62022-01-14 15:34:03 -080088 mBuffer.dump(result);
Vishnu Nair7891e962021-11-11 12:07:21 -080089}
90
91void TransactionTracing::addQueuedTransaction(const TransactionState& transaction) {
Diwas Sharma2401daf2023-09-01 00:45:24 +000092 proto::TransactionState* state = new proto::TransactionState(mProtoParser.toProto(transaction));
Robert Carra63d52a2022-03-03 08:03:37 -080093 mTransactionQueue.push(state);
Vishnu Nair7891e962021-11-11 12:07:21 -080094}
95
Dominik Laskowski6b049ff2023-01-29 15:46:45 -050096void TransactionTracing::addCommittedTransactions(int64_t vsyncId, nsecs_t commitTime,
97 frontend::Update& newUpdate,
98 const frontend::DisplayInfos& displayInfos,
99 bool displayInfoChanged) {
Vishnu Nair81750622023-03-08 15:02:06 -0800100 CommittedUpdates update;
101 update.vsyncId = vsyncId;
102 update.timestamp = commitTime;
103 update.transactionIds.reserve(newUpdate.transactions.size());
104 for (const auto& transaction : newUpdate.transactions) {
105 update.transactionIds.emplace_back(transaction.id);
Vishnu Nair286f4f92022-06-08 16:37:39 -0700106 }
Vishnu Nair81750622023-03-08 15:02:06 -0800107 update.displayInfoChanged = displayInfoChanged;
108 if (displayInfoChanged) {
109 update.displayInfos = displayInfos;
Vishnu Nair7891e962021-11-11 12:07:21 -0800110 }
Vishnu Nair81750622023-03-08 15:02:06 -0800111 update.createdLayers = std::move(newUpdate.layerCreationArgs);
112 newUpdate.layerCreationArgs.clear();
113 update.destroyedLayerHandles.reserve(newUpdate.destroyedHandles.size());
Vishnu Nair606d9d02023-08-19 14:20:18 -0700114 for (auto& [handle, _] : newUpdate.destroyedHandles) {
Vishnu Nair81750622023-03-08 15:02:06 -0800115 update.destroyedLayerHandles.push_back(handle);
116 }
117 mPendingUpdates.emplace_back(update);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800118 tryPushToTracingThread();
Vishnu Naird1f74982023-06-15 20:16:51 -0700119 mLastUpdatedVsyncId = vsyncId;
Vishnu Nair7891e962021-11-11 12:07:21 -0800120}
121
122void TransactionTracing::loop() {
123 while (true) {
Vishnu Nair81750622023-03-08 15:02:06 -0800124 std::vector<CommittedUpdates> committedUpdates;
125 std::vector<uint32_t> destroyedLayers;
Vishnu Nair7891e962021-11-11 12:07:21 -0800126 {
127 std::unique_lock<std::mutex> lock(mMainThreadLock);
128 base::ScopedLockAssertion assumeLocked(mMainThreadLock);
129 mTransactionsAvailableCv.wait(lock, [&]() REQUIRES(mMainThreadLock) {
Vishnu Nair81750622023-03-08 15:02:06 -0800130 return mDone || !mUpdates.empty();
Vishnu Nair7891e962021-11-11 12:07:21 -0800131 });
132 if (mDone) {
Vishnu Nair81750622023-03-08 15:02:06 -0800133 mUpdates.clear();
134 mDestroyedLayers.clear();
Vishnu Nair7891e962021-11-11 12:07:21 -0800135 break;
136 }
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800137
Vishnu Nair81750622023-03-08 15:02:06 -0800138 destroyedLayers = std::move(mDestroyedLayers);
139 mDestroyedLayers.clear();
140 committedUpdates = std::move(mUpdates);
141 mUpdates.clear();
Vishnu Nair7891e962021-11-11 12:07:21 -0800142 } // unlock mMainThreadLock
143
Vishnu Nair81750622023-03-08 15:02:06 -0800144 if (!committedUpdates.empty() || !destroyedLayers.empty()) {
145 addEntry(committedUpdates, destroyedLayers);
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800146 }
Vishnu Nair7891e962021-11-11 12:07:21 -0800147 }
148}
149
Vishnu Nair81750622023-03-08 15:02:06 -0800150void TransactionTracing::addEntry(const std::vector<CommittedUpdates>& committedUpdates,
151 const std::vector<uint32_t>& destroyedLayers) {
Vishnu Nair7891e962021-11-11 12:07:21 -0800152 ATRACE_CALL();
153 std::scoped_lock lock(mTraceLock);
Vishnu Nair62863552021-12-10 13:34:48 -0800154 std::vector<std::string> removedEntries;
Diwas Sharma2401daf2023-09-01 00:45:24 +0000155 proto::TransactionTraceEntry entryProto;
Robert Carra63d52a2022-03-03 08:03:37 -0800156
157 while (auto incomingTransaction = mTransactionQueue.pop()) {
158 auto transaction = *incomingTransaction;
Robert Carra63d52a2022-03-03 08:03:37 -0800159 mQueuedTransactions[incomingTransaction->transaction_id()] = transaction;
160 delete incomingTransaction;
161 }
Vishnu Nair81750622023-03-08 15:02:06 -0800162 for (const CommittedUpdates& update : committedUpdates) {
163 entryProto.set_elapsed_realtime_nanos(update.timestamp);
164 entryProto.set_vsync_id(update.vsyncId);
Vishnu Nair286f4f92022-06-08 16:37:39 -0700165 entryProto.mutable_added_layers()->Reserve(
Vishnu Nair81750622023-03-08 15:02:06 -0800166 static_cast<int32_t>(update.createdLayers.size()));
Vishnu Nair286f4f92022-06-08 16:37:39 -0700167
Vishnu Nair81750622023-03-08 15:02:06 -0800168 for (const auto& args : update.createdLayers) {
169 entryProto.mutable_added_layers()->Add(std::move(mProtoParser.toProto(args)));
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800170 }
Vishnu Nair286f4f92022-06-08 16:37:39 -0700171
Vishnu Nair81750622023-03-08 15:02:06 -0800172 entryProto.mutable_destroyed_layers()->Reserve(
173 static_cast<int32_t>(destroyedLayers.size()));
174 for (auto& destroyedLayer : destroyedLayers) {
175 entryProto.mutable_destroyed_layers()->Add(destroyedLayer);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800176 }
Vishnu Nair7891e962021-11-11 12:07:21 -0800177 entryProto.mutable_transactions()->Reserve(
Vishnu Nair81750622023-03-08 15:02:06 -0800178 static_cast<int32_t>(update.transactionIds.size()));
179 for (const uint64_t& id : update.transactionIds) {
Vishnu Nair7891e962021-11-11 12:07:21 -0800180 auto it = mQueuedTransactions.find(id);
181 if (it != mQueuedTransactions.end()) {
182 entryProto.mutable_transactions()->Add(std::move(it->second));
183 mQueuedTransactions.erase(it);
184 } else {
Vishnu Nair047fb332021-12-09 09:54:36 -0800185 ALOGW("Could not find transaction id %" PRIu64, id);
Vishnu Nair7891e962021-11-11 12:07:21 -0800186 }
187 }
Vishnu Nair62863552021-12-10 13:34:48 -0800188
Vishnu Nair81750622023-03-08 15:02:06 -0800189 entryProto.mutable_destroyed_layer_handles()->Reserve(
190 static_cast<int32_t>(update.destroyedLayerHandles.size()));
191 for (auto layerId : update.destroyedLayerHandles) {
192 entryProto.mutable_destroyed_layer_handles()->Add(layerId);
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700193 }
Vishnu Nair81750622023-03-08 15:02:06 -0800194
195 entryProto.set_displays_changed(update.displayInfoChanged);
196 if (update.displayInfoChanged) {
197 entryProto.mutable_displays()->Reserve(
198 static_cast<int32_t>(update.displayInfos.size()));
199 for (auto& [layerStack, displayInfo] : update.displayInfos) {
200 entryProto.mutable_displays()->Add(
201 std::move(mProtoParser.toProto(displayInfo, layerStack.id)));
202 }
203 }
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700204
Vishnu Nair62863552021-12-10 13:34:48 -0800205 std::string serializedProto;
206 entryProto.SerializeToString(&serializedProto);
Diwas Sharmaa0021172023-09-01 00:43:31 +0000207 entryProto.Clear();
Dominik Laskowski46471e62022-01-14 15:34:03 -0800208 std::vector<std::string> entries = mBuffer.emplace(std::move(serializedProto));
Vishnu Nair62863552021-12-10 13:34:48 -0800209 removedEntries.reserve(removedEntries.size() + entries.size());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800210 removedEntries.insert(removedEntries.end(), std::make_move_iterator(entries.begin()),
211 std::make_move_iterator(entries.end()));
212 }
213
Diwas Sharma2401daf2023-09-01 00:45:24 +0000214 proto::TransactionTraceEntry removedEntryProto;
Vishnu Nair62863552021-12-10 13:34:48 -0800215 for (const std::string& removedEntry : removedEntries) {
216 removedEntryProto.ParseFromString(removedEntry);
217 updateStartingStateLocked(removedEntryProto);
218 removedEntryProto.Clear();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800219 }
220 mTransactionsAddedToBufferCv.notify_one();
221}
222
Vishnu Naird1f74982023-06-15 20:16:51 -0700223void TransactionTracing::flush() {
224 {
225 std::scoped_lock lock(mMainThreadLock);
226 // Collect any pending transactions and wait for transactions to be added to
227 mUpdates.insert(mUpdates.end(), std::make_move_iterator(mPendingUpdates.begin()),
228 std::make_move_iterator(mPendingUpdates.end()));
229 mPendingUpdates.clear();
230 mDestroyedLayers.insert(mDestroyedLayers.end(), mPendingDestroyedLayers.begin(),
231 mPendingDestroyedLayers.end());
232 mPendingDestroyedLayers.clear();
233 mTransactionsAvailableCv.notify_one();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800234 }
235 std::unique_lock<std::mutex> lock(mTraceLock);
236 base::ScopedLockAssertion assumeLocked(mTraceLock);
Vishnu Naird1f74982023-06-15 20:16:51 -0700237 mTransactionsAddedToBufferCv.wait_for(lock, std::chrono::milliseconds(100),
238 [&]() REQUIRES(mTraceLock) {
Diwas Sharma2401daf2023-09-01 00:45:24 +0000239 proto::TransactionTraceEntry entry;
Vishnu Naird1f74982023-06-15 20:16:51 -0700240 if (mBuffer.used() > 0) {
241 entry.ParseFromString(mBuffer.back());
242 }
243 return mBuffer.used() > 0 &&
244 entry.vsync_id() >= mLastUpdatedVsyncId;
245 });
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800246}
247
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800248void TransactionTracing::onLayerRemoved(int32_t layerId) {
Vishnu Nair81750622023-03-08 15:02:06 -0800249 mPendingDestroyedLayers.emplace_back(layerId);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800250 tryPushToTracingThread();
251}
252
253void TransactionTracing::tryPushToTracingThread() {
254 // Try to acquire the lock from main thread.
255 if (mMainThreadLock.try_lock()) {
256 // We got the lock! Collect any pending transactions and continue.
Vishnu Nair81750622023-03-08 15:02:06 -0800257 mUpdates.insert(mUpdates.end(), std::make_move_iterator(mPendingUpdates.begin()),
258 std::make_move_iterator(mPendingUpdates.end()));
259 mPendingUpdates.clear();
260 mDestroyedLayers.insert(mDestroyedLayers.end(), mPendingDestroyedLayers.begin(),
261 mPendingDestroyedLayers.end());
262 mPendingDestroyedLayers.clear();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800263 mTransactionsAvailableCv.notify_one();
264 mMainThreadLock.unlock();
265 } else {
266 ALOGV("Couldn't get lock");
Vishnu Nair7891e962021-11-11 12:07:21 -0800267 }
268}
269
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800270void TransactionTracing::updateStartingStateLocked(
Diwas Sharma2401daf2023-09-01 00:45:24 +0000271 const proto::TransactionTraceEntry& removedEntry) {
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800272 mStartingTimestamp = removedEntry.elapsed_realtime_nanos();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800273 // Keep track of layer starting state so we can reconstruct the layer state as we purge
274 // transactions from the buffer.
Diwas Sharma2401daf2023-09-01 00:45:24 +0000275 for (const proto::LayerCreationArgs& addedLayer : removedEntry.added_layers()) {
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800276 TracingLayerState& startingState = mStartingStates[addedLayer.layer_id()];
277 startingState.layerId = addedLayer.layer_id();
Vishnu Nair685cfef2022-02-02 10:01:25 -0800278 mProtoParser.fromProto(addedLayer, startingState.args);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800279 }
280
281 // Merge layer states to starting transaction state.
Diwas Sharma2401daf2023-09-01 00:45:24 +0000282 for (const proto::TransactionState& transaction : removedEntry.transactions()) {
283 for (const proto::LayerState& layerState : transaction.layer_changes()) {
Vishnu Nair81750622023-03-08 15:02:06 -0800284 auto it = mStartingStates.find(layerState.layer_id());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800285 if (it == mStartingStates.end()) {
Vishnu Nair20e1f962023-03-29 15:58:34 -0700286 // TODO(b/238781169) make this log fatal when we switch over to using new fe
Vishnu Nair81750622023-03-08 15:02:06 -0800287 ALOGW("Could not find layer id %d", layerState.layer_id());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800288 continue;
289 }
Vishnu Nair685cfef2022-02-02 10:01:25 -0800290 mProtoParser.mergeFromProto(layerState, it->second);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800291 }
292 }
293
Vishnu Nair81750622023-03-08 15:02:06 -0800294 for (const uint32_t destroyedLayerHandleId : removedEntry.destroyed_layer_handles()) {
295 mRemovedLayerHandlesAtStart.insert(destroyedLayerHandleId);
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700296 }
297
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800298 // Clean up stale starting states since the layer has been removed and the buffer does not
299 // contain any references to the layer.
Vishnu Nair81750622023-03-08 15:02:06 -0800300 for (const uint32_t destroyedLayerId : removedEntry.destroyed_layers()) {
301 mStartingStates.erase(destroyedLayerId);
302 mRemovedLayerHandlesAtStart.erase(destroyedLayerId);
303 }
304
305 if (removedEntry.displays_changed()) {
306 mProtoParser.fromProto(removedEntry.displays(), mStartingDisplayInfos);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800307 }
308}
309
Diwas Sharma2401daf2023-09-01 00:45:24 +0000310void TransactionTracing::addStartingStateToProtoLocked(proto::TransactionTraceFile& proto) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000311 if (mStartingStates.size() == 0) {
312 return;
Vishnu Nair84125ac2021-12-02 08:47:48 -0800313 }
314
Diwas Sharma2401daf2023-09-01 00:45:24 +0000315 proto::TransactionTraceEntry* entryProto = proto.add_entry();
Diwas Sharmaa0021172023-09-01 00:43:31 +0000316 entryProto->set_elapsed_realtime_nanos(mStartingTimestamp);
317 entryProto->set_vsync_id(0);
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800318
Diwas Sharmaa0021172023-09-01 00:43:31 +0000319 entryProto->mutable_added_layers()->Reserve(static_cast<int32_t>(mStartingStates.size()));
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800320 for (auto& [layerId, state] : mStartingStates) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000321 entryProto->mutable_added_layers()->Add(mProtoParser.toProto(state.args));
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800322 }
323
Diwas Sharma2401daf2023-09-01 00:45:24 +0000324 proto::TransactionState transactionProto = mProtoParser.toProto(mStartingStates);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800325 transactionProto.set_vsync_id(0);
326 transactionProto.set_post_time(mStartingTimestamp);
Diwas Sharmaa0021172023-09-01 00:43:31 +0000327 entryProto->mutable_transactions()->Add(std::move(transactionProto));
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700328
Diwas Sharmaa0021172023-09-01 00:43:31 +0000329 entryProto->mutable_destroyed_layer_handles()->Reserve(
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700330 static_cast<int32_t>(mRemovedLayerHandlesAtStart.size()));
Vishnu Nair81750622023-03-08 15:02:06 -0800331 for (const uint32_t destroyedLayerHandleId : mRemovedLayerHandlesAtStart) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000332 entryProto->mutable_destroyed_layer_handles()->Add(destroyedLayerHandleId);
Vishnu Nair81750622023-03-08 15:02:06 -0800333 }
334
Diwas Sharmaa0021172023-09-01 00:43:31 +0000335 entryProto->mutable_displays()->Reserve(static_cast<int32_t>(mStartingDisplayInfos.size()));
Vishnu Nair81750622023-03-08 15:02:06 -0800336 for (auto& [layerStack, displayInfo] : mStartingDisplayInfos) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000337 entryProto->mutable_displays()->Add(mProtoParser.toProto(displayInfo, layerStack.id));
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700338 }
Diwas Sharmaa0021172023-09-01 00:43:31 +0000339}
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800340
Diwas Sharma2401daf2023-09-01 00:45:24 +0000341proto::TransactionTraceFile TransactionTracing::writeToProto() {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000342 std::scoped_lock<std::mutex> lock(mTraceLock);
Diwas Sharma2401daf2023-09-01 00:45:24 +0000343 proto::TransactionTraceFile proto = createTraceFileProto();
Diwas Sharmaa0021172023-09-01 00:43:31 +0000344 addStartingStateToProtoLocked(proto);
345 mBuffer.writeToProto(proto);
346 return proto;
Vishnu Nair7891e962021-11-11 12:07:21 -0800347}
348
349} // namespace android