diff options
-rw-r--r-- | include/utils/SkEventTracer.h | 13 | ||||
-rw-r--r-- | src/utils/SkEventTracer.cpp | 12 | ||||
-rw-r--r-- | tools/viewer/Viewer.cpp | 2 |
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]); |