aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/utils/SkEventTracer.h13
-rw-r--r--src/utils/SkEventTracer.cpp12
-rw-r--r--tools/viewer/Viewer.cpp2
3 files changed, 20 insertions, 7 deletions
diff --git a/include/utils/SkEventTracer.h b/include/utils/SkEventTracer.h
index f4f8676a74..a0289ce9eb 100644
--- a/include/utils/SkEventTracer.h
+++ b/include/utils/SkEventTracer.h
@@ -27,9 +27,18 @@ public:
typedef uint64_t Handle;
- static SkEventTracer* GetInstance();
+ /**
+ * 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*);
- static void 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() { }
diff --git a/src/utils/SkEventTracer.cpp b/src/utils/SkEventTracer.cpp
index 0a748d1464..5fb60bdf8a 100644
--- a/src/utils/SkEventTracer.cpp
+++ b/src/utils/SkEventTracer.cpp
@@ -42,11 +42,15 @@ class SkDefaultEventTracer : public SkEventTracer {
// We prefer gUserTracer if it's been set, otherwise we fall back on a default tracer;
static SkEventTracer* gUserTracer = nullptr;
-void SkEventTracer::SetInstance(SkEventTracer* tracer) {
- SkASSERT(nullptr == sk_atomic_load(&gUserTracer, sk_memory_order_acquire));
- sk_atomic_store(&gUserTracer, tracer, sk_memory_order_release);
+bool SkEventTracer::SetInstance(SkEventTracer* tracer) {
+ SkEventTracer* expected = nullptr;
+ if (!sk_atomic_compare_exchange(&gUserTracer, &expected, tracer)) {
+ delete tracer;
+ return false;
+ }
// An atomic load during process shutdown is probably overkill, but safe overkill.
- atexit([]() { delete sk_atomic_load(&gUserTracer, sk_memory_order_acquire); });
+ atexit([]() { delete sk_atomic_load(&gUserTracer); });
+ return true;
}
SkEventTracer* SkEventTracer::GetInstance() {
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index 7cf8cd8825..a1c0b5bbea 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -285,7 +285,7 @@ Viewer::Viewer(int argc, char** argv, void* platformData)
#endif
if (FLAGS_atrace) {
- SkEventTracer::SetInstance(new SkATrace());
+ SkAssertResult(SkEventTracer::SetInstance(new SkATrace()));
}
fBackendType = get_backend_type(FLAGS_backend[0]);