aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-07-21 11:06:24 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-21 16:38:23 +0000
commit65e4c614f0edbcf8d05bfc2a25a6e60d277fb7df (patch)
tree4fac7baec4b6f5ace655263b65262a23cefc8f4d
parent57aa367aa3c5911cd4a21230799b147e44190282 (diff)
Add category support to JSON and SkDebugf tracing
Bug: skia: Change-Id: I4d0bdb9d954e49b79ace0552d7b74b36a512c00d Reviewed-on: https://skia-review.googlesource.com/25642 Reviewed-by: Mike Klein <mtklein@chromium.org> Commit-Queue: Brian Osman <brianosman@google.com>
-rw-r--r--include/utils/SkEventTracer.h7
-rw-r--r--src/core/SkBigPicture.cpp2
-rw-r--r--src/core/SkCanvas.cpp60
-rw-r--r--src/core/SkTraceEventCommon.h4
-rw-r--r--tools/trace/SkChromeTracingTracer.cpp7
-rw-r--r--tools/trace/SkChromeTracingTracer.h9
-rw-r--r--tools/trace/SkDebugfTracer.cpp10
-rw-r--r--tools/trace/SkDebugfTracer.h9
-rw-r--r--tools/trace/SkEventTracingPriv.cpp41
-rw-r--r--tools/trace/SkEventTracingPriv.h25
10 files changed, 114 insertions, 60 deletions
diff --git a/include/utils/SkEventTracer.h b/include/utils/SkEventTracer.h
index a0289ce9eb..d3cc04dc0f 100644
--- a/include/utils/SkEventTracer.h
+++ b/include/utils/SkEventTracer.h
@@ -18,10 +18,6 @@
#include "SkTypes.h"
-// This will mark the trace event as disabled by default. The user will need
-// to explicitly enable the event.
-#define TRACE_DISABLED_BY_DEFAULT(name) "disabled-by-default-" name
-
class SK_API SkEventTracer {
public:
@@ -56,8 +52,7 @@ public:
};
virtual const uint8_t* getCategoryGroupEnabled(const char* name) = 0;
- virtual const char* getCategoryGroupName(
- const uint8_t* categoryEnabledFlag) = 0;
+ virtual const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) = 0;
virtual SkEventTracer::Handle
addTraceEvent(char phase,
diff --git a/src/core/SkBigPicture.cpp b/src/core/SkBigPicture.cpp
index 1281b5bc9f..1492ecd8d5 100644
--- a/src/core/SkBigPicture.cpp
+++ b/src/core/SkBigPicture.cpp
@@ -77,7 +77,7 @@ SkPicture const* const* SkBigPicture::drawablePicts() const {
}
void SkBigPicture::Analysis::init(const SkRecord& record) {
- TRACE_EVENT0("disabled-by-default-skia", "SkBigPicture::Analysis::init()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkBigPicture::Analysis::init()");
SkBitmapHunter bitmap;
SkPathCounter path;
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 809c2014bf..640e05f468 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1677,7 +1677,7 @@ GrContext* SkCanvas::getGrContext() {
void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner,
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawDRRect()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawDRRect()");
if (outer.isEmpty()) {
return;
}
@@ -1933,7 +1933,7 @@ void SkCanvas::onDiscard() {
}
void SkCanvas::onDrawPaint(const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPaint()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPaint()");
this->internalDrawPaint(paint);
}
@@ -1949,7 +1949,7 @@ void SkCanvas::internalDrawPaint(const SkPaint& paint) {
void SkCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
const SkPaint& paint) {
- TRACE_EVENT1("disabled-by-default-skia", "SkCanvas::drawPoints()", "count", static_cast<uint64_t>(count));
+ TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPoints()", "count", static_cast<uint64_t>(count));
if ((long)count <= 0) {
return;
}
@@ -1990,7 +1990,7 @@ static bool needs_autodrawlooper(SkCanvas* canvas, const SkPaint& paint) {
}
void SkCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRect()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawRect()");
SkASSERT(r.isSorted());
if (paint.canComputeFastBounds()) {
SkRect storage;
@@ -2035,7 +2035,7 @@ void SkCanvas::onDrawRegion(const SkRegion& region, const SkPaint& paint) {
}
void SkCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawOval()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawOval()");
SkASSERT(oval.isSorted());
if (paint.canComputeFastBounds()) {
SkRect storage;
@@ -2056,7 +2056,7 @@ void SkCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint) {
void SkCanvas::onDrawArc(const SkRect& oval, SkScalar startAngle,
SkScalar sweepAngle, bool useCenter,
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawArc()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawArc()");
SkASSERT(oval.isSorted());
if (paint.canComputeFastBounds()) {
SkRect storage;
@@ -2076,7 +2076,7 @@ void SkCanvas::onDrawArc(const SkRect& oval, SkScalar startAngle,
}
void SkCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRRect()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawRRect()");
if (paint.canComputeFastBounds()) {
SkRect storage;
if (this->quickReject(paint.computeFastBounds(rrect.getBounds(), &storage))) {
@@ -2121,7 +2121,7 @@ void SkCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const Sk
}
void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPath()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPath()");
if (!path.isFinite()) {
return;
}
@@ -2172,7 +2172,7 @@ bool SkCanvas::canDrawBitmapAsSprite(SkScalar x, SkScalar y, int w, int h, const
}
void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawImage()");
SkRect bounds = SkRect::MakeXYWH(x, y,
SkIntToScalar(image->width()), SkIntToScalar(image->height()));
if (nullptr == paint || paint->canComputeFastBounds()) {
@@ -2221,7 +2221,7 @@ void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S
void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
const SkPaint* paint, SrcRectConstraint constraint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawImageRect()");
if (nullptr == paint || paint->canComputeFastBounds()) {
SkRect storage = dst;
if (paint) {
@@ -2247,7 +2247,7 @@ void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const Sk
}
void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, const SkPaint* paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmap()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawBitmap()");
SkDEBUGCODE(bitmap.validate();)
if (bitmap.drawsNothing()) {
@@ -2331,14 +2331,14 @@ void SkCanvas::internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src,
void SkCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
const SkPaint* paint, SrcRectConstraint constraint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapRectToRect()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawBitmapRectToRect()");
SkDEBUGCODE(bitmap.validate();)
this->internalDrawBitmapRect(bitmap, src, dst, paint, constraint);
}
void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst,
const SkPaint* paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageNine()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawImageNine()");
if (nullptr == paint || paint->canComputeFastBounds()) {
SkRect storage;
@@ -2363,7 +2363,7 @@ void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, cons
void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst,
const SkPaint* paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawBitmapNine()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawBitmapNine()");
SkDEBUGCODE(bitmap.validate();)
if (nullptr == paint || paint->canComputeFastBounds()) {
@@ -2561,35 +2561,35 @@ void SkCanvas::drawString(const SkString& string, SkScalar x, SkScalar y, const
// These will become non-virtual, so they always call the (virtual) onDraw... method
void SkCanvas::drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawText()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawText()");
if (byteLength) {
this->onDrawText(text, byteLength, x, y, paint);
}
}
void SkCanvas::drawPosText(const void* text, size_t byteLength, const SkPoint pos[],
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPosText()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPosText()");
if (byteLength) {
this->onDrawPosText(text, byteLength, pos, paint);
}
}
void SkCanvas::drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
SkScalar constY, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPosTextH()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPosTextH()");
if (byteLength) {
this->onDrawPosTextH(text, byteLength, xpos, constY, paint);
}
}
void SkCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
const SkMatrix* matrix, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextOnPath()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawTextOnPath()");
if (byteLength) {
this->onDrawTextOnPath(text, byteLength, path, matrix, paint);
}
}
void SkCanvas::drawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
const SkRect* cullRect, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextRSXform()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawTextRSXform()");
if (byteLength) {
this->onDrawTextRSXform(text, byteLength, xform, cullRect, paint);
}
@@ -2597,13 +2597,13 @@ void SkCanvas::drawTextRSXform(const void* text, size_t byteLength, const SkRSXf
void SkCanvas::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
const SkPaint& paint) {
RETURN_ON_NULL(blob);
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextBlob()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawTextBlob()");
this->onDrawTextBlob(blob, x, y, paint);
}
void SkCanvas::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode bmode,
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawVertices()");
LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr)
while (iter.next()) {
@@ -2617,7 +2617,7 @@ void SkCanvas::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode bmod
void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4],
const SkPoint texCoords[4], SkBlendMode bmode,
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPatch()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPatch()");
if (nullptr == cubics) {
return;
}
@@ -2707,7 +2707,7 @@ void SkCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* va
//////////////////////////////////////////////////////////////////////////////
void SkCanvas::drawColor(SkColor c, SkBlendMode mode) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawColor()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawColor()");
SkPaint paint;
paint.setColor(c);
@@ -2716,13 +2716,13 @@ void SkCanvas::drawColor(SkColor c, SkBlendMode mode) {
}
void SkCanvas::drawPoint(SkScalar x, SkScalar y, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPoint(SkPaint)");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPoint(SkPaint)");
const SkPoint pt = { x, y };
this->drawPoints(kPoints_PointMode, 1, &pt, paint);
}
void SkCanvas::drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawLine()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawLine()");
SkPoint pts[2];
pts[0].set(x0, y0);
@@ -2731,7 +2731,7 @@ void SkCanvas::drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, cons
}
void SkCanvas::drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawCircle()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawCircle()");
if (radius < 0) {
radius = 0;
}
@@ -2743,7 +2743,7 @@ void SkCanvas::drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPai
void SkCanvas::drawRoundRect(const SkRect& r, SkScalar rx, SkScalar ry,
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawRoundRect()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawRoundRect()");
if (rx > 0 && ry > 0) {
SkRRect rrect;
rrect.setRectXY(r, rx, ry);
@@ -2756,7 +2756,7 @@ void SkCanvas::drawRoundRect(const SkRect& r, SkScalar rx, SkScalar ry,
void SkCanvas::drawArc(const SkRect& oval, SkScalar startAngle,
SkScalar sweepAngle, bool useCenter,
const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawArc()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawArc()");
if (oval.isEmpty() || !sweepAngle) {
return;
}
@@ -2766,7 +2766,7 @@ void SkCanvas::drawArc(const SkRect& oval, SkScalar startAngle,
void SkCanvas::drawTextOnPathHV(const void* text, size_t byteLength,
const SkPath& path, SkScalar hOffset,
SkScalar vOffset, const SkPaint& paint) {
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawTextOnPathHV()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawTextOnPathHV()");
SkMatrix matrix;
matrix.setTranslate(hOffset, vOffset);
@@ -2787,7 +2787,7 @@ void SkCanvas::drawTextOnPathHV(const void* text, size_t byteLength,
void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) {
RETURN_ON_NULL(picture);
- TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPicture()");
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), "SkCanvas::drawPicture()");
if (matrix && matrix->isIdentity()) {
matrix = nullptr;
}
diff --git a/src/core/SkTraceEventCommon.h b/src/core/SkTraceEventCommon.h
index c4d0f431bc..be705eef06 100644
--- a/src/core/SkTraceEventCommon.h
+++ b/src/core/SkTraceEventCommon.h
@@ -54,9 +54,11 @@
#error "Another copy of this file has already been included."
#endif
+#define TRACE_DISABLED_BY_DEFAULT_PREFIX "disabled-by-default-"
+
// This will mark the trace event as disabled by default. The user will need
// to explicitly enable the event.
-#define TRACE_DISABLED_BY_DEFAULT(name) "disabled-by-default-" name
+#define TRACE_DISABLED_BY_DEFAULT(name) TRACE_DISABLED_BY_DEFAULT_PREFIX name
// Records a pair of begin and end events called "name" for the current scope, with 0, 1 or 2
// associated arguments. If the category is not enabled, then this does nothing.
diff --git a/tools/trace/SkChromeTracingTracer.cpp b/tools/trace/SkChromeTracingTracer.cpp
index aa71ff0448..4d76d2956d 100644
--- a/tools/trace/SkChromeTracingTracer.cpp
+++ b/tools/trace/SkChromeTracingTracer.cpp
@@ -27,7 +27,7 @@ SkEventTracer::Handle SkChromeTracingTracer::addTraceEvent(char phase,
char phaseString[2] = { phase, 0 };
traceEvent["ph"] = phaseString;
traceEvent["name"] = name;
- traceEvent["cat"] = "skia"; // TODO
+ traceEvent["cat"] = this->getCategoryGroupName(categoryEnabledFlag);
auto now = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::nano> ns = now.time_since_epoch();
traceEvent["ts"] = ns.count() * 1E-3;
@@ -78,11 +78,6 @@ void SkChromeTracingTracer::updateTraceEventDuration(const uint8_t* categoryEnab
(*traceEvent)["dur"] = us - (*traceEvent)["ts"].asDouble();
}
-const uint8_t* SkChromeTracingTracer::getCategoryGroupEnabled(const char* name) {
- static uint8_t yes = SkEventTracer::kEnabledForRecording_CategoryGroupEnabledFlags;
- return &yes;
-}
-
void SkChromeTracingTracer::flush() {
SkString dirname = SkOSPath::Dirname(fFilename.c_str());
if (!sk_exists(dirname.c_str(), kWrite_SkFILE_Flag)) {
diff --git a/tools/trace/SkChromeTracingTracer.h b/tools/trace/SkChromeTracingTracer.h
index da34205aa5..152771bef0 100644
--- a/tools/trace/SkChromeTracingTracer.h
+++ b/tools/trace/SkChromeTracingTracer.h
@@ -9,6 +9,7 @@
#define SkChromeTracingTracer_DEFINED
#include "SkEventTracer.h"
+#include "SkEventTracingPriv.h"
#include "SkJSONCPP.h"
#include "SkString.h"
@@ -34,11 +35,12 @@ public:
const char* name,
SkEventTracer::Handle handle) override;
- const uint8_t* getCategoryGroupEnabled(const char* name) override;
+ const uint8_t* getCategoryGroupEnabled(const char* name) override {
+ return fCategories.getCategoryGroupEnabled(name);
+ }
const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override {
- static const char* category = "category?";
- return category;
+ return fCategories.getCategoryGroupName(categoryEnabledFlag);
}
private:
@@ -46,6 +48,7 @@ private:
Json::Value fRoot;
SkString fFilename;
+ SkEventTracingCategories fCategories;
};
#endif
diff --git a/tools/trace/SkDebugfTracer.cpp b/tools/trace/SkDebugfTracer.cpp
index 272af7827d..fe0da30b84 100644
--- a/tools/trace/SkDebugfTracer.cpp
+++ b/tools/trace/SkDebugfTracer.cpp
@@ -67,8 +67,9 @@ SkEventTracer::Handle SkDebugfTracer::addTraceEvent(char phase,
}
bool open = (phase == TRACE_EVENT_PHASE_COMPLETE);
if (open) {
- SkDebugf(
- "[% 2d]%s %s%s #%d {\n", fIndent.size(), fIndent.c_str(), name, args.c_str(), fCnt);
+ const char* category = this->getCategoryGroupName(categoryEnabledFlag);
+ SkDebugf("[% 2d]%s <%s> %s%s #%d {\n", fIndent.size(), fIndent.c_str(), category, name,
+ args.c_str(), fCnt);
fIndent.append(" ");
} else {
SkDebugf("%s%s #%d\n", name, args.c_str(), fCnt);
@@ -83,8 +84,3 @@ void SkDebugfTracer::updateTraceEventDuration(const uint8_t* categoryEnabledFlag
fIndent.resize(fIndent.size() - 1);
SkDebugf("[% 2d]%s } %s\n", fIndent.size(), fIndent.c_str(), name);
}
-
-const uint8_t* SkDebugfTracer::getCategoryGroupEnabled(const char* name) {
- static uint8_t yes = SkEventTracer::kEnabledForRecording_CategoryGroupEnabledFlags;
- return &yes;
-}
diff --git a/tools/trace/SkDebugfTracer.h b/tools/trace/SkDebugfTracer.h
index 4350d1ac3c..ca049d707b 100644
--- a/tools/trace/SkDebugfTracer.h
+++ b/tools/trace/SkDebugfTracer.h
@@ -9,6 +9,7 @@
#define SkDebugfTracer_DEFINED
#include "SkEventTracer.h"
+#include "SkEventTracingPriv.h"
#include "SkString.h"
/**
@@ -32,16 +33,18 @@ public:
const char* name,
SkEventTracer::Handle handle) override;
- const uint8_t* getCategoryGroupEnabled(const char* name) override;
+ const uint8_t* getCategoryGroupEnabled(const char* name) override {
+ return fCategories.getCategoryGroupEnabled(name);
+ }
const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override {
- static const char* category = "category?";
- return category;
+ return fCategories.getCategoryGroupName(categoryEnabledFlag);
}
private:
SkString fIndent;
int fCnt = 0;
+ SkEventTracingCategories fCategories;
};
#endif
diff --git a/tools/trace/SkEventTracingPriv.cpp b/tools/trace/SkEventTracingPriv.cpp
index 217511ffa7..c4c793b06e 100644
--- a/tools/trace/SkEventTracingPriv.cpp
+++ b/tools/trace/SkEventTracingPriv.cpp
@@ -8,10 +8,11 @@
#include "SkEventTracingPriv.h"
#include "SkATrace.h"
-#include "SkCommandLineFlags.h"
-#include "SkEventTracer.h"
#include "SkChromeTracingTracer.h"
+#include "SkCommandLineFlags.h"
#include "SkDebugfTracer.h"
+#include "SkEventTracer.h"
+#include "SkTraceEventCommon.h"
DEFINE_string(trace, "",
"Log trace events in one of several modes:\n"
@@ -42,3 +43,39 @@ void initializeEventTracingForTools(int32_t* threadsFlag) {
SkAssertResult(SkEventTracer::SetInstance(eventTracer));
}
+
+uint8_t* SkEventTracingCategories::getCategoryGroupEnabled(const char* name) {
+ static_assert(0 == offsetof(CategoryState, fEnabled), "CategoryState");
+
+ // We ignore the "disabled-by-default-" prefix in our internal tools (though we could honor it)
+ if (SkStrStartsWith(name, TRACE_DISABLED_BY_DEFAULT_PREFIX)) {
+ name += strlen(TRACE_DISABLED_BY_DEFAULT_PREFIX);
+ }
+
+ // Chrome's implementation of this API does a two-phase lookup (once without a lock, then again
+ // with a lock. But the tracing macros avoid calling these functions more than once per site,
+ // so just do something simple (and easier to reason about):
+ SkAutoMutexAcquire lock(&fMutex);
+ for (int i = 0; i < fNumCategories; ++i) {
+ if (0 == strcmp(name, fCategories[i].fName)) {
+ return reinterpret_cast<uint8_t*>(&fCategories[i]);
+ }
+ }
+
+ if (fNumCategories >= kMaxCategories) {
+ SkDEBUGFAIL("Exhausted event tracing categories. Increase kMaxCategories.");
+ return reinterpret_cast<uint8_t*>(&fCategories[0]);
+ }
+
+ fCategories[fNumCategories].fEnabled =
+ SkEventTracer::kEnabledForRecording_CategoryGroupEnabledFlags;
+ fCategories[fNumCategories].fName = name;
+ return reinterpret_cast<uint8_t*>(&fCategories[fNumCategories++]);
+}
+
+const char* SkEventTracingCategories::getCategoryGroupName(const uint8_t* categoryEnabledFlag) {
+ if (categoryEnabledFlag) {
+ return reinterpret_cast<const CategoryState*>(categoryEnabledFlag)->fName;
+ }
+ return nullptr;
+}
diff --git a/tools/trace/SkEventTracingPriv.h b/tools/trace/SkEventTracingPriv.h
index 330f3f83ed..a4f04caefb 100644
--- a/tools/trace/SkEventTracingPriv.h
+++ b/tools/trace/SkEventTracingPriv.h
@@ -8,7 +8,7 @@
#ifndef SkEventTracingPriv_DEFINED
#define SkEventTracingPriv_DEFINED
-#include "SkTypes.h"
+#include "SkMutex.h"
/**
* Construct and install an SkEventTracer, based on the 'trace' command line argument.
@@ -19,4 +19,27 @@
*/
void initializeEventTracingForTools(int32_t* threadsFlag);
+/**
+ * Helper class used by internal implementations of SkEventTracer to manage categories.
+ */
+class SkEventTracingCategories {
+public:
+ SkEventTracingCategories() : fNumCategories(0) {}
+
+ uint8_t* getCategoryGroupEnabled(const char* name);
+ const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag);
+
+private:
+ enum { kMaxCategories = 256 };
+
+ struct CategoryState {
+ uint8_t fEnabled;
+ const char* fName;
+ };
+
+ CategoryState fCategories[kMaxCategories];
+ int fNumCategories;
+ SkMutex fMutex;
+};
+
#endif