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"