summaryrefslogtreecommitdiffstats
path: root/dom/filehandle/ActorsParent.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/filehandle/ActorsParent.h')
-rw-r--r--dom/filehandle/ActorsParent.h174
1 files changed, 174 insertions, 0 deletions
diff --git a/dom/filehandle/ActorsParent.h b/dom/filehandle/ActorsParent.h
new file mode 100644
index 0000000000..319c50a0cf
--- /dev/null
+++ b/dom/filehandle/ActorsParent.h
@@ -0,0 +1,174 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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_dom_filehandle_ActorsParent_h
+#define mozilla_dom_filehandle_ActorsParent_h
+
+#include "mozilla/dom/FileHandleStorage.h"
+#include "mozilla/dom/PBackgroundMutableFileParent.h"
+#include "mozilla/ipc/BackgroundParent.h"
+#include "mozilla/UniquePtr.h"
+#include "nsClassHashtable.h"
+#include "nsCOMPtr.h"
+#include "nsHashKeys.h"
+#include "nsString.h"
+#include "nsTArrayForwardDeclare.h"
+#include "nsTHashSet.h"
+
+template <class>
+struct already_AddRefed;
+class nsIFile;
+class nsIRunnable;
+class nsIThreadPool;
+
+namespace mozilla {
+
+namespace ipc {
+
+class PBackgroundParent;
+
+} // namespace ipc
+
+namespace dom {
+
+class BlobImpl;
+class FileHandle;
+class FileHandleOp;
+
+class FileHandleThreadPool final {
+ class FileHandleQueue;
+ struct DelayedEnqueueInfo;
+ class DirectoryInfo;
+ struct StoragesCompleteCallback;
+
+ nsCOMPtr<nsIThreadPool> mThreadPool;
+ nsCOMPtr<nsIEventTarget> mOwningEventTarget;
+
+ nsClassHashtable<nsCStringHashKey, DirectoryInfo> mDirectoryInfos;
+
+ nsTArray<UniquePtr<StoragesCompleteCallback>> mCompleteCallbacks;
+
+ bool mShutdownRequested;
+ bool mShutdownComplete;
+
+ public:
+ static already_AddRefed<FileHandleThreadPool> Create();
+
+#ifdef DEBUG
+ void AssertIsOnOwningThread() const;
+
+ nsIEventTarget* GetThreadPoolEventTarget() const;
+#else
+ void AssertIsOnOwningThread() const {}
+#endif
+
+ void Enqueue(FileHandle* aFileHandle, FileHandleOp* aFileHandleOp,
+ bool aFinish);
+
+ NS_INLINE_DECL_REFCOUNTING(FileHandleThreadPool)
+
+ void WaitForDirectoriesToComplete(nsTArray<nsCString>&& aDirectoryIds,
+ nsIRunnable* aCallback);
+
+ void Shutdown();
+
+ private:
+ FileHandleThreadPool();
+
+ // Reference counted.
+ ~FileHandleThreadPool();
+
+ nsresult Init();
+
+ void Cleanup();
+
+ void FinishFileHandle(FileHandle* aFileHandle);
+
+ bool MaybeFireCallback(StoragesCompleteCallback* aCallback);
+};
+
+class BackgroundMutableFileParentBase : public PBackgroundMutableFileParent {
+ friend PBackgroundMutableFileParent;
+
+ nsTHashSet<FileHandle*> mFileHandles;
+ nsCString mDirectoryId;
+ nsString mFileName;
+ FileHandleStorage mStorage;
+ bool mInvalidated;
+ bool mActorWasAlive;
+ bool mActorDestroyed;
+
+ protected:
+ nsCOMPtr<nsIFile> mFile;
+
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BackgroundMutableFileParentBase)
+
+ void Invalidate();
+
+ FileHandleStorage Storage() const { return mStorage; }
+
+ const nsCString& DirectoryId() const { return mDirectoryId; }
+
+ const nsString& FileName() const { return mFileName; }
+
+ bool RegisterFileHandle(FileHandle* aFileHandle);
+
+ void UnregisterFileHandle(FileHandle* aFileHandle);
+
+ void SetActorAlive();
+
+ bool IsActorDestroyed() const {
+ mozilla::ipc::AssertIsOnBackgroundThread();
+
+ return mActorWasAlive && mActorDestroyed;
+ }
+
+ bool IsInvalidated() const {
+ mozilla::ipc::AssertIsOnBackgroundThread();
+
+ return mInvalidated;
+ }
+
+ virtual void NoteActiveState() {}
+
+ virtual void NoteInactiveState() {}
+
+ virtual mozilla::ipc::PBackgroundParent* GetBackgroundParent() const = 0;
+
+ virtual already_AddRefed<nsISupports> CreateStream(bool aReadOnly);
+
+ virtual already_AddRefed<BlobImpl> CreateBlobImpl() { return nullptr; }
+
+ protected:
+ BackgroundMutableFileParentBase(FileHandleStorage aStorage,
+ const nsACString& aDirectoryId,
+ const nsAString& aFileName, nsIFile* aFile);
+
+ // Reference counted.
+ ~BackgroundMutableFileParentBase();
+
+ // IPDL methods are only called by IPDL.
+ virtual void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ virtual PBackgroundFileHandleParent* AllocPBackgroundFileHandleParent(
+ const FileMode& aMode);
+
+ virtual mozilla::ipc::IPCResult RecvPBackgroundFileHandleConstructor(
+ PBackgroundFileHandleParent* aActor, const FileMode& aMode) override;
+
+ virtual bool DeallocPBackgroundFileHandleParent(
+ PBackgroundFileHandleParent* aActor);
+
+ mozilla::ipc::IPCResult RecvDeleteMe();
+
+ virtual mozilla::ipc::IPCResult RecvGetFileId(int64_t* aFileId);
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_filehandle_ActorsParent_h