summaryrefslogtreecommitdiffstats
path: root/gfx/layers/ipc/ImageContainerChild.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/layers/ipc/ImageContainerChild.h')
-rw-r--r--gfx/layers/ipc/ImageContainerChild.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/gfx/layers/ipc/ImageContainerChild.h b/gfx/layers/ipc/ImageContainerChild.h
new file mode 100644
index 000000000..839540411
--- /dev/null
+++ b/gfx/layers/ipc/ImageContainerChild.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_gfx_layers_ImageContainerChild_h
+#define mozilla_gfx_layers_ImageContainerChild_h
+
+#include "mozilla/Mutex.h"
+#include "mozilla/layers/PImageContainerChild.h"
+
+namespace mozilla {
+namespace layers {
+
+class ImageContainer;
+class ImageCompositeNotification;
+
+/**
+ * The child side of PImageContainer. It's best to avoid ImageContainer filling
+ * this role since IPDL objects should be associated with a single thread and
+ * ImageContainer definitely isn't. This object belongs to (and is always
+ * destroyed on) the ImageBridge thread, except when we need to destroy it
+ * during shutdown.
+ * An ImageContainer owns one of these; we have a weak reference to our
+ * ImageContainer.
+ */
+class ImageContainerChild final : public PImageContainerChild
+{
+public:
+ explicit ImageContainerChild(ImageContainer* aImageContainer);
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageContainerChild)
+
+ void RegisterWithIPDL();
+ void UnregisterFromIPDL();
+ void SendAsyncDelete();
+
+ void NotifyComposite(const ImageCompositeNotification& aNotification);
+ void ForgetImageContainer();
+
+private:
+ ~ImageContainerChild()
+ {}
+
+private:
+ Mutex mLock;
+ ImageContainer* mImageContainer;
+
+ // If mIPCOpen is false, it means the IPDL code tried to deallocate the actor
+ // before the ImageContainer released it. When this happens we don't actually
+ // delete the actor right away because the ImageContainer has a reference to
+ // it. In this case the actor will be deleted when the ImageContainer lets go
+ // of it.
+ // mIPCOpen must not be accessed off the ImageBridgeChild thread.
+ bool mIPCOpen;
+};
+
+} // namespace layers
+} // namespace mozilla
+
+#endif // mozilla_gfx_layers_ImageContainerChild_h