Move SkMessageBus.h into src/core

Not used by anything else in the include directory, probably don't want
to accidentially expose it either.

Change-Id: I50d255e2cac43d8405305a825fd194bb36edd8fd
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213826
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
diff --git a/src/core/SkClipStack.h b/src/core/SkClipStack.h
index f8653d7..5f502ee 100644
--- a/src/core/SkClipStack.h
+++ b/src/core/SkClipStack.h
@@ -14,8 +14,8 @@
 #include "include/core/SkRRect.h"
 #include "include/core/SkRect.h"
 #include "include/core/SkRegion.h"
-#include "include/private/SkMessageBus.h"
 #include "src/core/SkClipOpPriv.h"
+#include "src/core/SkMessageBus.h"
 #include "src/core/SkTLazy.h"
 
 #if SK_SUPPORT_GPU
diff --git a/src/core/SkDeferredDisplayListRecorder.cpp b/src/core/SkDeferredDisplayListRecorder.cpp
index 4925edd..1b0168e 100644
--- a/src/core/SkDeferredDisplayListRecorder.cpp
+++ b/src/core/SkDeferredDisplayListRecorder.cpp
@@ -9,7 +9,7 @@
 #include "include/core/SkSurface.h"
 #include "include/core/SkSurfaceCharacterization.h"
 #include "include/private/SkDeferredDisplayList.h"
-#include "include/private/SkMessageBus.h"
+#include "src/core/SkMessageBus.h"
 
 #if !SK_SUPPORT_GPU
 SkDeferredDisplayListRecorder::SkDeferredDisplayListRecorder(const SkSurfaceCharacterization&) {}
diff --git a/src/core/SkMessageBus.h b/src/core/SkMessageBus.h
new file mode 100644
index 0000000..2a40b28
--- /dev/null
+++ b/src/core/SkMessageBus.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkMessageBus_DEFINED
+#define SkMessageBus_DEFINED
+
+#include "include/core/SkTypes.h"
+#include "include/private/SkMutex.h"
+#include "include/private/SkNoncopyable.h"
+#include "include/private/SkOnce.h"
+#include "include/private/SkTArray.h"
+#include "include/private/SkTDArray.h"
+
+/**
+ * The following method must have a specialization for type 'Message':
+ *
+ *     bool SkShouldPostMessageToBus(const Message&, uint32_t msgBusUniqueID)
+ *
+ * We may want to consider providing a default template implementation, to avoid this requirement by
+ * sending to all inboxes when the specialization for type 'Message' is not present.
+ */
+template <typename Message>
+class SkMessageBus : SkNoncopyable {
+public:
+    // Post a message to be received by Inboxes for this Message type. Checks
+    // SkShouldPostMessageToBus() for each inbox. Threadsafe.
+    static void Post(const Message& m);
+
+    class Inbox {
+    public:
+        Inbox(uint32_t uniqueID = SK_InvalidUniqueID);
+        ~Inbox();
+
+        uint32_t uniqueID() const { return fUniqueID; }
+
+        // Overwrite out with all the messages we've received since the last call.  Threadsafe.
+        void poll(SkTArray<Message>* out);
+
+    private:
+        SkTArray<Message>  fMessages;
+        SkMutex            fMessagesMutex;
+        uint32_t           fUniqueID;
+
+        friend class SkMessageBus;
+        void receive(const Message& m);  // SkMessageBus is a friend only to call this.
+    };
+
+private:
+    SkMessageBus();
+    static SkMessageBus* Get();
+
+    SkTDArray<Inbox*> fInboxes;
+    SkMutex           fInboxesMutex;
+};
+
+// 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)                      \
+    template <>                                                    \
+    SkMessageBus<Message>* SkMessageBus<Message>::Get() {          \
+        static SkOnce once;                                        \
+        static SkMessageBus<Message>* bus;                         \
+        once([] { bus = new SkMessageBus<Message>(); });           \
+        return bus;                                                \
+    }
+
+//   ----------------------- Implementation of SkMessageBus::Inbox -----------------------
+
+template<typename Message>
+SkMessageBus<Message>::Inbox::Inbox(uint32_t uniqueID) : fUniqueID(uniqueID) {
+    // Register ourselves with the corresponding message bus.
+    SkMessageBus<Message>* bus = SkMessageBus<Message>::Get();
+    SkAutoMutexExclusive lock(bus->fInboxesMutex);
+    bus->fInboxes.push_back(this);
+}
+
+template<typename Message>
+SkMessageBus<Message>::Inbox::~Inbox() {
+    // Remove ourselves from the corresponding message bus.
+    SkMessageBus<Message>* bus = SkMessageBus<Message>::Get();
+    SkAutoMutexExclusive lock(bus->fInboxesMutex);
+    // This is a cheaper fInboxes.remove(fInboxes.find(this)) when order doesn't matter.
+    for (int i = 0; i < bus->fInboxes.count(); i++) {
+        if (this == bus->fInboxes[i]) {
+            bus->fInboxes.removeShuffle(i);
+            break;
+        }
+    }
+}
+
+template<typename Message>
+void SkMessageBus<Message>::Inbox::receive(const Message& m) {
+    SkAutoMutexExclusive lock(fMessagesMutex);
+    fMessages.push_back(m);
+}
+
+template<typename Message>
+void SkMessageBus<Message>::Inbox::poll(SkTArray<Message>* messages) {
+    SkASSERT(messages);
+    messages->reset();
+    SkAutoMutexExclusive lock(fMessagesMutex);
+    fMessages.swap(*messages);
+}
+
+//   ----------------------- Implementation of SkMessageBus -----------------------
+
+template <typename Message>
+SkMessageBus<Message>::SkMessageBus() {}
+
+template <typename Message>
+/*static*/ void SkMessageBus<Message>::Post(const Message& m) {
+    SkMessageBus<Message>* bus = SkMessageBus<Message>::Get();
+    SkAutoMutexExclusive lock(bus->fInboxesMutex);
+    for (int i = 0; i < bus->fInboxes.count(); i++) {
+        if (SkShouldPostMessageToBus(m, bus->fInboxes[i]->fUniqueID)) {
+            bus->fInboxes[i]->receive(m);
+        }
+    }
+}
+
+#endif  // SkMessageBus_DEFINED
diff --git a/src/core/SkPromiseImageTexture.cpp b/src/core/SkPromiseImageTexture.cpp
index 761ae93..d8d8dfe 100644
--- a/src/core/SkPromiseImageTexture.cpp
+++ b/src/core/SkPromiseImageTexture.cpp
@@ -6,7 +6,7 @@
  */
 
 #include "include/core/SkPromiseImageTexture.h"
-#include "include/private/SkMessageBus.h"
+#include "src/core/SkMessageBus.h"
 
 #if SK_SUPPORT_GPU
 
diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp
index ff52a49..a528430 100644
--- a/src/core/SkResourceCache.cpp
+++ b/src/core/SkResourceCache.cpp
@@ -8,10 +8,10 @@
 #include "src/core/SkResourceCache.h"
 
 #include "include/core/SkTraceMemoryDump.h"
-#include "include/private/SkMessageBus.h"
 #include "include/private/SkMutex.h"
 #include "include/private/SkTo.h"
 #include "src/core/SkDiscardableMemory.h"
+#include "src/core/SkMessageBus.h"
 #include "src/core/SkMipMap.h"
 #include "src/core/SkOpts.h"
 
diff --git a/src/core/SkResourceCache.h b/src/core/SkResourceCache.h
index 0e183f7..4805b28 100644
--- a/src/core/SkResourceCache.h
+++ b/src/core/SkResourceCache.h
@@ -9,8 +9,8 @@
 #define SkResourceCache_DEFINED
 
 #include "include/core/SkBitmap.h"
-#include "include/private/SkMessageBus.h"
 #include "include/private/SkTDArray.h"
+#include "src/core/SkMessageBus.h"
 
 class SkCachedData;
 class SkDiscardableMemory;
diff --git a/src/gpu/GrAHardwareBufferImageGenerator.cpp b/src/gpu/GrAHardwareBufferImageGenerator.cpp
index 59f59a9..8bb6be5 100644
--- a/src/gpu/GrAHardwareBufferImageGenerator.cpp
+++ b/src/gpu/GrAHardwareBufferImageGenerator.cpp
@@ -22,8 +22,8 @@
 #include "include/gpu/gl/GrGLTypes.h"
 #include "include/private/GrRecordingContext.h"
 #include "include/private/GrTextureProxy.h"
-#include "include/private/SkMessageBus.h"
 #include "src/core/SkExchange.h"
+#include "src/core/SkMessageBus.h"
 #include "src/gpu/GrAHardwareBufferUtils.h"
 #include "src/gpu/GrContextPriv.h"
 #include "src/gpu/GrProxyProvider.h"
diff --git a/src/gpu/GrBackendTextureImageGenerator.cpp b/src/gpu/GrBackendTextureImageGenerator.cpp
index 7c3e403..4df0bd4 100644
--- a/src/gpu/GrBackendTextureImageGenerator.cpp
+++ b/src/gpu/GrBackendTextureImageGenerator.cpp
@@ -8,7 +8,7 @@
 #include "include/gpu/GrContext.h"
 #include "include/gpu/GrTexture.h"
 #include "include/private/GrRecordingContext.h"
-#include "include/private/SkMessageBus.h"
+#include "src/core/SkMessageBus.h"
 #include "src/gpu/GrBackendTextureImageGenerator.h"
 #include "src/gpu/GrContextPriv.h"
 #include "src/gpu/GrGpu.h"
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp
index bbd7f70..4dd0481 100644
--- a/src/gpu/GrResourceCache.cpp
+++ b/src/gpu/GrResourceCache.cpp
@@ -10,10 +10,10 @@
 #include "include/gpu/GrContext.h"
 #include "include/gpu/GrTexture.h"
 #include "include/private/GrSingleOwner.h"
-#include "include/private/SkMessageBus.h"
 #include "include/private/SkTo.h"
 #include "include/utils/SkRandom.h"
 #include "src/core/SkExchange.h"
+#include "src/core/SkMessageBus.h"
 #include "src/core/SkOpts.h"
 #include "src/core/SkScopeExit.h"
 #include "src/core/SkTSort.h"
diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h
index 99b8e52..7796b23 100644
--- a/src/gpu/GrResourceCache.h
+++ b/src/gpu/GrResourceCache.h
@@ -11,10 +11,10 @@
 #include "include/core/SkRefCnt.h"
 #include "include/gpu/GrGpuResource.h"
 #include "include/private/GrResourceKey.h"
-#include "include/private/SkMessageBus.h"
 #include "include/private/SkTArray.h"
 #include "include/private/SkTHash.h"
 #include "include/private/SkTInternalLList.h"
+#include "src/core/SkMessageBus.h"
 #include "src/core/SkTDPQueue.h"
 #include "src/core/SkTMultiMap.h"
 #include "src/gpu/GrGpuResourceCacheAccess.h"
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 40c9196..5f0e9dc 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -14,12 +14,12 @@
 #include "include/private/GrRecordingContext.h"
 #include "include/private/GrTextureProxy.h"
 #include "include/private/SkImageInfoPriv.h"
-#include "include/private/SkMessageBus.h"
 #include "include/private/SkTemplates.h"
 #include "src/core/SkAutoMalloc.h"
 #include "src/core/SkBlendModePriv.h"
 #include "src/core/SkImagePriv.h"
 #include "src/core/SkMaskFilterBase.h"
+#include "src/core/SkMessageBus.h"
 #include "src/core/SkMipMap.h"
 #include "src/core/SkPaintPriv.h"
 #include "src/core/SkResourceCache.h"
diff --git a/src/gpu/text/GrTextBlobCache.h b/src/gpu/text/GrTextBlobCache.h
index f23ee82..5479112 100644
--- a/src/gpu/text/GrTextBlobCache.h
+++ b/src/gpu/text/GrTextBlobCache.h
@@ -9,9 +9,9 @@
 #define GrTextBlobCache_DEFINED
 
 #include "include/core/SkRefCnt.h"
-#include "include/private/SkMessageBus.h"
 #include "include/private/SkTArray.h"
 #include "include/private/SkTHash.h"
+#include "src/core/SkMessageBus.h"
 #include "src/core/SkTextBlobPriv.h"
 #include "src/gpu/text/GrTextBlob.h"