skia2/include/utils/SkEventTracer.h
Brian Salomon 175f588831 Modify SkEventTracer::SetInstance to fail rather than assert if a tracer has already been installed.
Chromium usually calls SetInstance once per process. However, when run in single process more renderer threads will try to set the instance after the browser process already has done so. This allows them to fail gracefully without asserting.

Bug: skia:6603
Change-Id: Ic8a35422d787335aa67eefc07d0658f0fbe73db4
Reviewed-on: https://skia-review.googlesource.com/16664
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
2017-05-12 16:49:07 +00:00

80 lines
2.9 KiB
C++

/*
* Copyright (C) 2014 Google Inc. All rights reserved.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkEventTracer_DEFINED
#define SkEventTracer_DEFINED
// The class in this header defines the interface between Skia's internal
// tracing macros and an external entity (e.g., Chrome) that will consume them.
// Such an entity should subclass SkEventTracer and provide an instance of
// that event to SkEventTracer::SetInstance.
// If you're looking for the tracing macros to instrument Skia itself, those
// live in src/core/SkTraceEvent.h
#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:
typedef uint64_t Handle;
/**
* If this is the first call to SetInstance or GetInstance then the passed instance is
* installed and true is returned. Otherwise, false is returned. In either case ownership of the
* tracer is transferred and it will be deleted when no longer needed.
*/
static bool SetInstance(SkEventTracer*);
/**
* Gets the event tracer. If this is the first call to SetInstance or GetIntance then a default
* event tracer is installed and returned.
*/
static SkEventTracer* GetInstance();
virtual ~SkEventTracer() { }
// The pointer returned from GetCategoryGroupEnabled() points to a
// value with zero or more of the following bits. Used in this class only.
// The TRACE_EVENT macros should only use the value as a bool.
// These values must be in sync with macro values in trace_event.h in chromium.
enum CategoryGroupEnabledFlags {
// Category group enabled for the recording mode.
kEnabledForRecording_CategoryGroupEnabledFlags = 1 << 0,
// Category group enabled for the monitoring mode.
kEnabledForMonitoring_CategoryGroupEnabledFlags = 1 << 1,
// Category group enabled by SetEventCallbackEnabled().
kEnabledForEventCallback_CategoryGroupEnabledFlags = 1 << 2,
};
virtual const uint8_t* getCategoryGroupEnabled(const char* name) = 0;
virtual const char* getCategoryGroupName(
const uint8_t* categoryEnabledFlag) = 0;
virtual SkEventTracer::Handle
addTraceEvent(char phase,
const uint8_t* categoryEnabledFlag,
const char* name,
uint64_t id,
int32_t numArgs,
const char** argNames,
const uint8_t* argTypes,
const uint64_t* argValues,
uint8_t flags) = 0;
virtual void
updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
const char* name,
SkEventTracer::Handle handle) = 0;
};
#endif // SkEventTracer_DEFINED