SkOncePtr -> SkOnce

It's always nice to kill off a synchronization primitive.
And while less terse, I think this new code reads more clearly.

... and, SkOncePtr's tests were the only thing now using sk_num_cores()
outside of SkTaskGroup, so I've hidden it as static inside SkTaskGroup.cpp.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1953533002
CQ_EXTRA_TRYBOTS=client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot

Review-Url: https://codereview.chromium.org/1953533002
diff --git a/gyp/core.gypi b/gyp/core.gypi
index 6322c54..aeffa2b 100644
--- a/gyp/core.gypi
+++ b/gyp/core.gypi
@@ -422,7 +422,6 @@
         '<(skia_include_path)/private/SkMiniRecorder.h',
         '<(skia_include_path)/private/SkMutex.h',
         '<(skia_include_path)/private/SkOnce.h',
-        '<(skia_include_path)/private/SkOncePtr.h',
         '<(skia_include_path)/private/SkRecords.h',
         '<(skia_include_path)/private/SkSemaphore.h',
         '<(skia_include_path)/private/SkSpinlock.h',
diff --git a/include/private/SkOncePtr.h b/include/private/SkOncePtr.h
deleted file mode 100644
index 921c6a6..0000000
--- a/include/private/SkOncePtr.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkOncePtr_DEFINED
-#define SkOncePtr_DEFINED
-
-#include "../private/SkAtomics.h"
-#include <memory>
-
-// Use this to create a global static pointer that's intialized exactly once when you call get().
-#define SK_DECLARE_STATIC_ONCE_PTR(type, name) namespace {} static SkBaseOncePtr<type> name;
-
-template <typename T>
-class SkBaseOncePtr {
-public:
-    template <typename F>
-    T* get(const F& f) const {
-        uintptr_t state = sk_atomic_load(&fState, sk_memory_order_acquire);
-        if (state < 2) {
-            if (state == 0) {
-                // It looks like no one has tried to create our pointer yet.
-                // We try to claim that task by atomically swapping our state from '0' to '1'.
-                // See SkOnce.h for why we use an acquire memory order here rather than relaxed.
-                if (sk_atomic_compare_exchange(
-                    &fState, &state, (uintptr_t)1, sk_memory_order_acquire, sk_memory_order_acquire)) {
-                    // We've claimed it.  Create our pointer and store it into fState.
-                    state = (uintptr_t)f();
-                    SkASSERT(state > 1);
-                    sk_atomic_store(&fState, state, sk_memory_order_release);
-                } else {
-                    // Someone else claimed it.
-                    // We fall through to the spin loop just below to wait for them to finish.
-                }
-            }
-
-            while (state == 1) {
-                // State '1' is our busy-but-not-done state.
-                // Some other thread has claimed the job of creating our pointer.
-                // We just need to wait for it to finish.
-                state = sk_atomic_load(&fState, sk_memory_order_acquire);
-            }
-
-            // We shouldn't be able to get here without having created our pointer.
-            SkASSERT(state > 1);
-        }
-        return (T*)state;
-    }
-
-    operator T*() const {
-        auto state = sk_atomic_load(&fState, sk_memory_order_acquire);
-        return state < 2 ? nullptr : (T*)state;
-        // TODO: If state == 1 spin until it's not?
-    }
-
-    // fState == 0 --> we have not created our ptr yet
-    // fState == 1 --> someone is in the middle of creating our ptr
-    // else        --> (T*)fState is our ptr
-    mutable uintptr_t fState;
-};
-
-#endif//SkOncePtr_DEFINED
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
index 55ab4c1..889746f 100644
--- a/src/core/SkColorSpace.cpp
+++ b/src/core/SkColorSpace.cpp
@@ -7,7 +7,7 @@
 
 #include "SkAtomics.h"
 #include "SkColorSpace.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 
 static bool color_space_almost_equal(float a, float b) {
     return SkTAbs(a - b) < 0.01f;
@@ -43,8 +43,6 @@
     0.1430f, 0.0606f, 0.7139f,    // * B
 };
 
-SK_DECLARE_STATIC_ONCE_PTR(SkColorSpace, sRGB);
-
 sk_sp<SkColorSpace> SkColorSpace::NewRGB(SkGammas gammas, const SkMatrix44& toXYZD50) {
     // Check if we really have sRGB
     if (color_space_almost_equal(2.2f, gammas.fRed.fValue) &&
@@ -74,13 +72,17 @@
 }
 
 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
+    static SkOnce once;
+    static SkColorSpace* sRGB;
+
     switch (named) {
         case kSRGB_Named: {
-            SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor);
-            srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50);
-            return sk_ref_sp(sRGB.get([=]{
-                return new SkColorSpace(SkGammas(2.2f, 2.2f, 2.2f), srgbToxyzD50, kSRGB_Named);
-            }));
+            once([] {
+                SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor);
+                srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50);
+                sRGB = new SkColorSpace(SkGammas(2.2f, 2.2f, 2.2f), srgbToxyzD50, kSRGB_Named);
+            });
+            return sk_ref_sp(sRGB);
         }
         default:
             break;
diff --git a/src/core/SkData.cpp b/src/core/SkData.cpp
index 995a30a..ea2da3d 100644
--- a/src/core/SkData.cpp
+++ b/src/core/SkData.cpp
@@ -7,7 +7,7 @@
 
 #include "SkData.h"
 #include "SkOSFile.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkReadBuffer.h"
 #include "SkStream.h"
 #include "SkWriteBuffer.h"
@@ -80,10 +80,12 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-SK_DECLARE_STATIC_ONCE_PTR(SkData, gEmpty);
 sk_sp<SkData> SkData::MakeEmpty() {
-    SkData* data = SkRef(gEmpty.get([]{return new SkData(nullptr, 0, nullptr, nullptr); }));
-    return sk_sp<SkData>(data);
+    static SkOnce once;
+    static SkData* empty;
+
+    once([]{ empty = new SkData(nullptr, 0, nullptr, nullptr); });
+    return sk_ref_sp(empty);
 }
 
 // assumes fPtr was allocated via sk_malloc
diff --git a/src/core/SkFontMgr.cpp b/src/core/SkFontMgr.cpp
index ebb9a89..0f00667 100644
--- a/src/core/SkFontMgr.cpp
+++ b/src/core/SkFontMgr.cpp
@@ -7,7 +7,7 @@
 
 #include "SkFontDescriptor.h"
 #include "SkFontMgr.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkStream.h"
 #include "SkTypes.h"
 
@@ -169,12 +169,15 @@
     return this->onLegacyCreateTypeface(familyName, style);
 }
 
-SK_DECLARE_STATIC_ONCE_PTR(SkFontMgr, singleton);
 SkFontMgr* SkFontMgr::RefDefault() {
-    return SkRef(singleton.get([]{
+    static SkOnce once;
+    static SkFontMgr* singleton;
+
+    once([]{
         SkFontMgr* fm = SkFontMgr::Factory();
-        return fm ? fm : new SkEmptyFontMgr;
-    }));
+        singleton = fm ? fm : new SkEmptyFontMgr;
+    });
+    return SkRef(singleton);
 }
 
 /**
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp
index 309f494..7256de6 100644
--- a/src/core/SkGlyphCache.cpp
+++ b/src/core/SkGlyphCache.cpp
@@ -8,7 +8,7 @@
 #include "SkGlyphCache.h"
 #include "SkGlyphCache_Globals.h"
 #include "SkGraphics.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkPath.h"
 #include "SkTemplates.h"
 #include "SkTraceMemoryDump.h"
@@ -23,9 +23,12 @@
 }  // namespace
 
 // Returns the shared globals
-SK_DECLARE_STATIC_ONCE_PTR(SkGlyphCache_Globals, globals);
 static SkGlyphCache_Globals& get_globals() {
-    return *globals.get([]{ return new SkGlyphCache_Globals; });
+    static SkOnce once;
+    static SkGlyphCache_Globals* globals;
+
+    once([]{ globals = new SkGlyphCache_Globals; });
+    return *globals;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkImageFilterCache.cpp b/src/core/SkImageFilterCache.cpp
index d87cf6b..ba8a32c 100644
--- a/src/core/SkImageFilterCache.cpp
+++ b/src/core/SkImageFilterCache.cpp
@@ -9,7 +9,7 @@
 
 #include "SkChecksum.h"
 #include "SkMutex.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkRefCnt.h"
 #include "SkSpecialImage.h"
 #include "SkTDynamicHash.h"
@@ -125,7 +125,10 @@
     return new CacheImpl(maxBytes);
 }
 
-SK_DECLARE_STATIC_ONCE_PTR(SkImageFilterCache, cache);
 SkImageFilterCache* SkImageFilterCache::Get() {
-    return cache.get([]{ return SkImageFilterCache::Create(kDefaultCacheSize); });
+    static SkOnce once;
+    static SkImageFilterCache* cache;
+
+    once([]{ cache = SkImageFilterCache::Create(kDefaultCacheSize); });
+    return cache;
 }
diff --git a/src/core/SkMessageBus.h b/src/core/SkMessageBus.h
index a2802f0..79f5c02 100644
--- a/src/core/SkMessageBus.h
+++ b/src/core/SkMessageBus.h
@@ -9,7 +9,7 @@
 #define SkMessageBus_DEFINED
 
 #include "SkMutex.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkTArray.h"
 #include "SkTDArray.h"
 #include "SkTypes.h"
@@ -47,10 +47,12 @@
 // This must go in a single .cpp file, not some .h, or we risk creating more than one global
 // SkMessageBus per type when using shared libraries.  NOTE: at most one per file will compile.
 #define DECLARE_SKMESSAGEBUS_MESSAGE(Message)                      \
-    SK_DECLARE_STATIC_ONCE_PTR(SkMessageBus<Message>, bus);        \
     template <>                                                    \
     SkMessageBus<Message>* SkMessageBus<Message>::Get() {          \
-        return bus.get([]{ return new SkMessageBus<Message>(); }); \
+        static SkOnce once;                                        \
+        static SkMessageBus<Message>* bus;                         \
+        once([] { bus = new SkMessageBus<Message>(); });           \
+        return bus;                                                \
     }
 
 //   ----------------------- Implementation of SkMessageBus::Inbox -----------------------
diff --git a/src/core/SkMiniRecorder.cpp b/src/core/SkMiniRecorder.cpp
index 2d5b094..378f430 100644
--- a/src/core/SkMiniRecorder.cpp
+++ b/src/core/SkMiniRecorder.cpp
@@ -8,7 +8,7 @@
 #include "SkCanvas.h"
 #include "SkTLazy.h"
 #include "SkMiniRecorder.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkPicture.h"
 #include "SkPictureCommon.h"
 #include "SkRecordDraw.h"
@@ -27,7 +27,6 @@
     int    numSlowPaths()         const override { return 0; }
     bool   willPlayBackBitmaps()  const override { return false; }
 };
-SK_DECLARE_STATIC_ONCE_PTR(SkEmptyPicture, gEmptyPicture);
 
 template <typename T>
 class SkMiniPicture final : public SkPicture {
@@ -107,8 +106,13 @@
         fState = State::kEmpty; \
         return sk_make_sp<SkMiniPicture<Type>>(cull, reinterpret_cast<Type*>(fBuffer.get()))
 
+    static SkOnce once;
+    static SkPicture* empty;
+
     switch (fState) {
-        case State::kEmpty: return sk_ref_sp(gEmptyPicture.get([]{ return new SkEmptyPicture; }));
+        case State::kEmpty:
+            once([]{ empty = new SkEmptyPicture; });
+            return sk_ref_sp(empty);
         CASE(DrawBitmapRectFixedSize);
         CASE(DrawPath);
         CASE(DrawRect);
diff --git a/src/core/SkPathRef.cpp b/src/core/SkPathRef.cpp
index b180551..2fc2de9 100644
--- a/src/core/SkPathRef.cpp
+++ b/src/core/SkPathRef.cpp
@@ -6,7 +6,7 @@
  */
 
 #include "SkBuffer.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkPath.h"
 #include "SkPathRef.h"
 #include <limits>
@@ -45,13 +45,15 @@
     SkDEBUGCODE(fEditorsAttached = 0x7777777;)
 }
 
-SK_DECLARE_STATIC_ONCE_PTR(SkPathRef, empty);
+static SkPathRef* gEmpty = nullptr;
+
 SkPathRef* SkPathRef::CreateEmpty() {
-    return SkRef(empty.get([]{
-        SkPathRef* pr = new SkPathRef;
-        pr->computeBounds();   // Avoids races later to be the first to do this.
-        return pr;
-    }));
+    static SkOnce once;
+    once([]{
+        gEmpty = new SkPathRef;
+        gEmpty->computeBounds();   // Avoids races later to be the first to do this.
+    });
+    return SkRef(gEmpty);
 }
 
 void SkPathRef::CreateTransformedCopy(SkAutoTUnref<SkPathRef>* dst,
@@ -469,7 +471,7 @@
 }
 
 void SkPathRef::addGenIDChangeListener(GenIDChangeListener* listener) {
-    if (nullptr == listener || this == (SkPathRef*)empty) {
+    if (nullptr == listener || this == gEmpty) {
         delete listener;
         return;
     }
diff --git a/src/core/SkTaskGroup.cpp b/src/core/SkTaskGroup.cpp
index 2ae1b59..7a58c86 100644
--- a/src/core/SkTaskGroup.cpp
+++ b/src/core/SkTaskGroup.cpp
@@ -14,25 +14,25 @@
 #include "SkThreadUtils.h"
 
 #if defined(SK_BUILD_FOR_WIN32)
-    static void query_num_cores(int* num_cores) {
+    static void query_num_cores(int* cores) {
         SYSTEM_INFO sysinfo;
         GetNativeSystemInfo(&sysinfo);
-        *num_cores = sysinfo.dwNumberOfProcessors;
+        *cores = sysinfo.dwNumberOfProcessors;
     }
 #else
     #include <unistd.h>
-    static void query_num_cores(int* num_cores) {
-        *num_cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
+    static void query_num_cores(int* cores) {
+        *cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
     }
 #endif
 
-int sk_num_cores() {
-    // We cache sk_num_cores() so we only query the OS once.
-    static int num_cores = 0;
+static int num_cores() {
+    // We cache num_cores() so we only query the OS once.
+    static int cores = 0;
     static SkOnce once;
-    once(query_num_cores, &num_cores);
-    SkASSERT(num_cores > 0);
-    return num_cores;
+    once(query_num_cores, &cores);
+    SkASSERT(cores > 0);
+    return cores;
 }
 
 namespace {
@@ -98,7 +98,7 @@
 
     explicit ThreadPool(int threads) {
         if (threads == -1) {
-            threads = sk_num_cores();
+            threads = num_cores();
         }
         for (int i = 0; i < threads; i++) {
             fThreads.push(new SkThread(&ThreadPool::Loop, this));
diff --git a/src/core/SkTaskGroup.h b/src/core/SkTaskGroup.h
index 0d86cdb..0f793f3 100644
--- a/src/core/SkTaskGroup.h
+++ b/src/core/SkTaskGroup.h
@@ -39,7 +39,4 @@
     SkAtomic<int32_t> fPending;
 };
 
-// Returns best estimate of number of CPU cores available to use.
-int sk_num_cores();
-
 #endif//SkTaskGroup_DEFINED
diff --git a/src/core/SkTypeface.cpp b/src/core/SkTypeface.cpp
index 3830c46..75bb05c 100644
--- a/src/core/SkTypeface.cpp
+++ b/src/core/SkTypeface.cpp
@@ -11,7 +11,7 @@
 #include "SkFontMgr.h"
 #include "SkMutex.h"
 #include "SkOTTable_OS_2.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkStream.h"
 #include "SkTypeface.h"
 
@@ -79,21 +79,23 @@
 }
 
 SK_DECLARE_STATIC_MUTEX(gCreateDefaultMutex);
-SK_DECLARE_STATIC_ONCE_PTR(SkTypeface, defaults[4]);
 
 SkTypeface* SkTypeface::GetDefaultTypeface(Style style) {
+    static SkOnce once[4];
+    static SkTypeface* defaults[4];
+
     SkASSERT((int)style < 4);
-    return defaults[style].get([=]{
+    once[style]([style] {
         // It is not safe to call FontConfigTypeface::LegacyCreateTypeface concurrently.
         // To be safe, we serialize here with a mutex so only one call to
         // CreateTypeface is happening at any given time.
         // TODO(bungeman, mtklein): This is sad.  Make our fontconfig code safe?
         SkAutoMutexAcquire lock(&gCreateDefaultMutex);
-
         SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault());
         SkTypeface* t = fm->legacyCreateTypeface(nullptr, SkFontStyle::FromOldStyle(style));
-        return t ? t : SkEmptyTypeface::Create();
+        defaults[style] = t ? t : SkEmptyTypeface::Create();
     });
+    return defaults[style];
 }
 
 SkTypeface* SkTypeface::RefDefault(Style style) {
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 1cfe864..b6d2388 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -9,7 +9,7 @@
 #include "SkXfermode_proccoeff.h"
 #include "SkColorPriv.h"
 #include "SkMathPriv.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkOpts.h"
 #include "SkReadBuffer.h"
 #include "SkString.h"
@@ -1303,11 +1303,7 @@
 #endif
 
 
-SK_DECLARE_STATIC_ONCE_PTR(SkXfermode, cached[SkXfermode::kLastMode + 1]);
-
 sk_sp<SkXfermode> SkXfermode::Make(Mode mode) {
-    SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
-
     if ((unsigned)mode >= kModeCount) {
         // report error
         return nullptr;
@@ -1319,13 +1315,20 @@
         return nullptr;
     }
 
-    return sk_ref_sp(cached[mode].get([=]{
+    SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
+
+    static SkOnce        once[SkXfermode::kLastMode+1];
+    static SkXfermode* cached[SkXfermode::kLastMode+1];
+
+    once[mode]([mode] {
         ProcCoeff rec = gProcCoeffs[mode];
         if (auto xfermode = SkOpts::create_xfermode(rec, mode)) {
-            return xfermode;
+            cached[mode] = xfermode;
+        } else {
+            cached[mode] = new SkProcCoeffXfermode(rec, mode);
         }
-        return (SkXfermode*) new SkProcCoeffXfermode(rec, mode);
-    }));
+    });
+    return sk_ref_sp(cached[mode]);
 }
 
 SkXfermodeProc SkXfermode::GetProc(Mode mode) {
diff --git a/src/fonts/SkRemotableFontMgr.cpp b/src/fonts/SkRemotableFontMgr.cpp
index 41e3bc3..aca8a0b 100644
--- a/src/fonts/SkRemotableFontMgr.cpp
+++ b/src/fonts/SkRemotableFontMgr.cpp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkRemotableFontMgr.h"
 
 SkRemotableFontIdentitySet::SkRemotableFontIdentitySet(int count, SkFontIdentity** data)
@@ -15,7 +15,9 @@
     *data = fData;
 }
 
-SK_DECLARE_STATIC_ONCE_PTR(SkRemotableFontIdentitySet, empty);
 SkRemotableFontIdentitySet* SkRemotableFontIdentitySet::NewEmpty() {
-    return SkRef(empty.get([]{ return new SkRemotableFontIdentitySet; }));
+    static SkOnce once;
+    static SkRemotableFontIdentitySet* empty;
+    once([]{ empty = new SkRemotableFontIdentitySet; });
+    return SkRef(empty);
 }
diff --git a/src/lazy/SkDiscardableMemoryPool.cpp b/src/lazy/SkDiscardableMemoryPool.cpp
index 2be4c75..d6753de 100644
--- a/src/lazy/SkDiscardableMemoryPool.cpp
+++ b/src/lazy/SkDiscardableMemoryPool.cpp
@@ -9,7 +9,7 @@
 #include "SkDiscardableMemoryPool.h"
 #include "SkImageGenerator.h"
 #include "SkMutex.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkTInternalLList.h"
 
 // Note:
@@ -245,11 +245,13 @@
 }
 
 SK_DECLARE_STATIC_MUTEX(gMutex);
-SK_DECLARE_STATIC_ONCE_PTR(SkDiscardableMemoryPool, global);
 
 SkDiscardableMemoryPool* SkGetGlobalDiscardableMemoryPool() {
-    return global.get([] {
-        return SkDiscardableMemoryPool::Create(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE,
-                                               &gMutex);
+    static SkOnce once;
+    static SkDiscardableMemoryPool* global;
+    once([]{
+        global = SkDiscardableMemoryPool::Create(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE,
+                                                 &gMutex);
     });
+    return global;
 }
diff --git a/src/opts/opts_check_x86.cpp b/src/opts/opts_check_x86.cpp
index 2cb2e65..dacb49b 100644
--- a/src/opts/opts_check_x86.cpp
+++ b/src/opts/opts_check_x86.cpp
@@ -13,7 +13,6 @@
 #include "SkBlitRow.h"
 #include "SkBlitRow_opts_SSE2.h"
 #include "SkCpu.h"
-#include "SkOncePtr.h"
 #include "SkRTConf.h"
 
 
diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp
index 72d4690..8593b39 100644
--- a/src/ports/SkFontHost_mac.cpp
+++ b/src/ports/SkFontHost_mac.cpp
@@ -35,7 +35,7 @@
 #include "SkOTTable_hhea.h"
 #include "SkOTTable_loca.h"
 #include "SkOTUtils.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 #include "SkPaint.h"
 #include "SkPath.h"
 #include "SkSFNTHeader.h"
@@ -778,12 +778,12 @@
     return &legacy_CTFontDrawGlyphs;
 }
 
-SK_DECLARE_STATIC_ONCE_PTR(CTFontDrawGlyphsProc, gCTFontDrawGlyphs);
-
 CGRGBPixel* Offscreen::getCG(const SkScalerContext_Mac& context, const SkGlyph& glyph,
                              CGGlyph glyphID, size_t* rowBytesPtr,
                              bool generateA8FromLCD) {
-    auto ctFontDrawGlyphs = gCTFontDrawGlyphs.get(choose_CTFontDrawGlyphs);
+    static SkOnce once;
+    static CTFontDrawGlyphsProc* ctFontDrawGlyphs;
+    once([]{ ctFontDrawGlyphs = choose_CTFontDrawGlyphs(); });
 
     if (!fRGBSpace) {
         //It doesn't appear to matter what color space is specified.
diff --git a/src/utils/SkEventTracer.cpp b/src/utils/SkEventTracer.cpp
index 32a0207..0a748d1 100644
--- a/src/utils/SkEventTracer.cpp
+++ b/src/utils/SkEventTracer.cpp
@@ -7,7 +7,7 @@
 
 #include "SkAtomics.h"
 #include "SkEventTracer.h"
-#include "SkOncePtr.h"
+#include "SkOnce.h"
 
 #include <stdlib.h>
 
@@ -39,9 +39,8 @@
     }
 };
 
-// We prefer gUserTracer if it's been set, otherwise we fall back on gDefaultTracer.
+// We prefer gUserTracer if it's been set, otherwise we fall back on a default tracer;
 static SkEventTracer* gUserTracer = nullptr;
-SK_DECLARE_STATIC_ONCE_PTR(SkDefaultEventTracer, gDefaultTracer);
 
 void SkEventTracer::SetInstance(SkEventTracer* tracer) {
     SkASSERT(nullptr == sk_atomic_load(&gUserTracer, sk_memory_order_acquire));
@@ -54,5 +53,8 @@
     if (SkEventTracer* tracer = sk_atomic_load(&gUserTracer, sk_memory_order_acquire)) {
         return tracer;
     }
-    return gDefaultTracer.get([]{ return new SkDefaultEventTracer; });
+    static SkOnce once;
+    static SkDefaultEventTracer* defaultTracer;
+    once([] { defaultTracer = new SkDefaultEventTracer; });
+    return defaultTracer;
 }
diff --git a/tests/OncePtrTest.cpp b/tests/OncePtrTest.cpp
deleted file mode 100644
index 0aacdf5..0000000
--- a/tests/OncePtrTest.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "Test.h"
-#include "SkOncePtr.h"
-#include "SkTaskGroup.h"
-
-SK_DECLARE_STATIC_ONCE_PTR(int, once);
-
-DEF_TEST(OncePtr, r) {
-    static SkAtomic<int> calls(0);
-    auto create = [&] {
-        calls.fetch_add(1);
-        return new int(5);
-    };
-
-    SkTaskGroup().batch(sk_num_cores()*4, [&](size_t) {
-        int* n = once.get(create);
-        REPORTER_ASSERT(r, *n == 5);
-    });
-    REPORTER_ASSERT(r, calls.load() == 1);
-}