diff options
author | Brian Osman <brianosman@google.com> | 2017-07-21 11:06:24 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-21 16:38:23 +0000 |
commit | 65e4c614f0edbcf8d05bfc2a25a6e60d277fb7df (patch) | |
tree | 4fac7baec4b6f5ace655263b65262a23cefc8f4d | |
parent | 57aa367aa3c5911cd4a21230799b147e44190282 (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.h | 7 | ||||
-rw-r--r-- | src/core/SkBigPicture.cpp | 2 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 60 | ||||
-rw-r--r-- | src/core/SkTraceEventCommon.h | 4 | ||||
-rw-r--r-- | tools/trace/SkChromeTracingTracer.cpp | 7 | ||||
-rw-r--r-- | tools/trace/SkChromeTracingTracer.h | 9 | ||||
-rw-r--r-- | tools/trace/SkDebugfTracer.cpp | 10 | ||||
-rw-r--r-- | tools/trace/SkDebugfTracer.h | 9 | ||||
-rw-r--r-- | tools/trace/SkEventTracingPriv.cpp | 41 | ||||
-rw-r--r-- | tools/trace/SkEventTracingPriv.h | 25 |
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 |