123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- /* 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 "nsAutoPtr.h"
- #include "nsClassHashtable.h"
- #include "nsCOMPtr.h"
- #include "nsHashKeys.h"
- #include "nsString.h"
- #include "nsTArrayForwardDeclare.h"
- #include "nsTHashtable.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> mOwningThread;
- nsClassHashtable<nsCStringHashKey, DirectoryInfo> mDirectoryInfos;
- nsTArray<nsAutoPtr<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
- {
- nsTHashtable<nsPtrHashKey<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) override;
- virtual bool
- RecvPBackgroundFileHandleConstructor(PBackgroundFileHandleParent* aActor,
- const FileMode& aMode) override;
- virtual bool
- DeallocPBackgroundFileHandleParent(PBackgroundFileHandleParent* aActor)
- override;
- virtual bool
- RecvDeleteMe() override;
- virtual bool
- RecvGetFileId(int64_t* aFileId) override;
- };
- } // namespace dom
- } // namespace mozilla
- #endif // mozilla_dom_filehandle_ActorsParent_h
|