Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Unified Diff: src/utils/SkEventTracer.cpp

Issue 1099123002: Split default and user-supplied event tracers. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: tweaks Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/utils/SkEventTracer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/utils/SkEventTracer.cpp
diff --git a/src/utils/SkEventTracer.cpp b/src/utils/SkEventTracer.cpp
index bbd8c3d6b38b11646e7a10b727011a498fca515a..1a669a3f8ebce471319cfc4d02df745d3e882099 100644
--- a/src/utils/SkEventTracer.cpp
+++ b/src/utils/SkEventTracer.cpp
@@ -5,10 +5,11 @@
* found in the LICENSE file.
*/
+#include "SkAtomics.h"
#include "SkEventTracer.h"
-#include "SkOnce.h"
+#include "SkLazyPtr.h"
-class SkDefaultEventTracer: public SkEventTracer {
+class SkDefaultEventTracer : public SkEventTracer {
virtual SkEventTracer::Handle
addTraceEvent(char phase,
const uint8_t* categoryEnabledFlag,
@@ -36,24 +37,23 @@ class SkDefaultEventTracer: public SkEventTracer {
};
};
-SkEventTracer* SkEventTracer::gInstance;
+// We prefer gUserTracer if it's been set, otherwise we fall back on gDefaultTracer.
+static SkEventTracer* gUserTracer = nullptr;
+SK_DECLARE_STATIC_LAZY_PTR(SkDefaultEventTracer, gDefaultTracer);
-static void cleanup_tracer() {
- // calling SetInstance will delete the existing instance.
- SkEventTracer::SetInstance(NULL);
-}
+// We can use relaxed memory order for gUserTracer loads and stores.
+// It's not guarding anything but itself.
-static void intialize_default_tracer(SkEventTracer* current_instance) {
- if (NULL == current_instance) {
- SkEventTracer::SetInstance(SkNEW(SkDefaultEventTracer));
- }
- atexit(cleanup_tracer);
+void SkEventTracer::SetInstance(SkEventTracer* tracer) {
+ SkASSERT(nullptr == sk_atomic_load(&gUserTracer, sk_memory_order_relaxed));
+ sk_atomic_store(&gUserTracer, tracer, sk_memory_order_relaxed);
+ // An atomic load during process shutdown is probably overkill, but safe overkill.
+ atexit([](){ SkDELETE(sk_atomic_load(&gUserTracer, sk_memory_order_relaxed)); });
}
-
-SK_DECLARE_STATIC_ONCE(once);
SkEventTracer* SkEventTracer::GetInstance() {
- SkOnce(&once, intialize_default_tracer, SkEventTracer::gInstance);
- SkASSERT(SkEventTracer::gInstance);
- return SkEventTracer::gInstance;
+ if (SkEventTracer* tracer = sk_atomic_load(&gUserTracer, sk_memory_order_relaxed)) {
Alexander Potapenko 2015/04/21 15:55:38 Since you're dereferincing this pointer, you need
+ return tracer;
+ }
+ return gDefaultTracer.get();
}
« no previous file with comments | « include/utils/SkEventTracer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698