blob: 5ea2355d4d24358e3217ec713b4dda9ac270c5a9 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.util;
import androidx.annotation.NonNull;
import androidx.tracing.Trace;
public final class TraceSection implements AutoCloseable {
/**
* Factory used to support the try-with-resource construct.
*
* <p>To get scoped trace events, use the try-with-resource construct, for instance:
*
* <pre>{@code
* try (TraceSection e = TraceSection.scoped("MyTraceEvent")) {
* // code.
* }
* }</pre>
*/
public static TraceSection scoped(String name) {
return new TraceSection(name);
}
/** Constructor used to support the try-with-resource construct. */
private TraceSection(String name) {
begin(name);
}
@Override
public void close() {
end();
}
private static String cropSectionName(@NonNull String sectionName) {
return sectionName.length() < 124 ? sectionName : sectionName.substring(0, 124) + "...";
}
/**
* Wraps Trace.beginSection to ensure that the line length stays below 127 code units.
*
* @param sectionName The string to display as the section name in the trace.
*/
public static void begin(@NonNull String sectionName) {
Trace.beginSection(cropSectionName(sectionName));
}
/** Wraps Trace.endSection. */
public static void end() throws RuntimeException {
Trace.endSection();
}
/**
* Wraps Trace.beginAsyncSection to ensure that the line length stays below 127 code units.
*
* @param sectionName The string to display as the section name in the trace.
* @param cookie Unique integer defining the section.
*/
public static void beginAsyncSection(String sectionName, int cookie) {
Trace.beginAsyncSection(cropSectionName(sectionName), cookie);
}
/** Wraps Trace.endAsyncSection to ensure that the line length stays below 127 code units. */
public static void endAsyncSection(String sectionName, int cookie) {
Trace.endAsyncSection(cropSectionName(sectionName), cookie);
}
}