mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-09 21:00:42 +02:00
For cases where the class has direct calls (that is, we cast `this` to the subclass before making the call) no longer declare Recv/Answer methods on the base class at all. This should ensure that slots for them are not generated in vtables, and also allow the derived class to choose the method signature (e.g. whether it wants to take something by reference or by value). Differential Revision: https://phabricator.services.mozilla.com/D18132 --HG-- extra : moz-landing-system : lando
104 lines
2.8 KiB
C++
104 lines
2.8 KiB
C++
/* -*- 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_ipc_IPCBlobInputStreamChild_h
|
|
#define mozilla_dom_ipc_IPCBlobInputStreamChild_h
|
|
|
|
#include "mozilla/ipc/PIPCBlobInputStreamChild.h"
|
|
#include "mozilla/Mutex.h"
|
|
#include "mozilla/UniquePtr.h"
|
|
#include "nsIThread.h"
|
|
#include "nsTArray.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
class IPCBlobInputStream;
|
|
class ThreadSafeWorkerRef;
|
|
|
|
class IPCBlobInputStreamChild final
|
|
: public mozilla::ipc::PIPCBlobInputStreamChild {
|
|
public:
|
|
enum ActorState {
|
|
// The actor is connected via IPDL to the parent.
|
|
eActive,
|
|
|
|
// The actor is disconnected.
|
|
eInactive,
|
|
|
|
// The actor is waiting to be disconnected. Once it has been disconnected,
|
|
// it will be reactivated on the DOM-File thread.
|
|
eActiveMigrating,
|
|
|
|
// The actor has been disconnected and it's waiting to be connected on the
|
|
// DOM-File thread.
|
|
eInactiveMigrating,
|
|
};
|
|
|
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(IPCBlobInputStreamChild)
|
|
|
|
IPCBlobInputStreamChild(const nsID& aID, uint64_t aSize);
|
|
|
|
void ActorDestroy(IProtocol::ActorDestroyReason aReason) override;
|
|
|
|
ActorState State();
|
|
|
|
already_AddRefed<IPCBlobInputStream> CreateStream();
|
|
|
|
void ForgetStream(IPCBlobInputStream* aStream);
|
|
|
|
const nsID& ID() const { return mID; }
|
|
|
|
uint64_t Size() const { return mSize; }
|
|
|
|
void StreamNeeded(IPCBlobInputStream* aStream, nsIEventTarget* aEventTarget);
|
|
|
|
mozilla::ipc::IPCResult RecvStreamReady(const OptionalIPCStream& aStream);
|
|
|
|
void LengthNeeded(IPCBlobInputStream* aStream, nsIEventTarget* aEventTarget);
|
|
|
|
mozilla::ipc::IPCResult RecvLengthReady(const int64_t& aLength);
|
|
|
|
void Shutdown();
|
|
|
|
void Migrated();
|
|
|
|
private:
|
|
~IPCBlobInputStreamChild();
|
|
|
|
// Raw pointers because these streams keep this actor alive. When the last
|
|
// stream is unregister, the actor will be deleted. This list is protected by
|
|
// mutex.
|
|
nsTArray<IPCBlobInputStream*> mStreams;
|
|
|
|
// This mutex protects mStreams because that can be touched in any thread.
|
|
Mutex mMutex;
|
|
|
|
const nsID mID;
|
|
const uint64_t mSize;
|
|
|
|
ActorState mState;
|
|
|
|
// This struct and the array are used for creating streams when needed.
|
|
struct PendingOperation {
|
|
RefPtr<IPCBlobInputStream> mStream;
|
|
nsCOMPtr<nsIEventTarget> mEventTarget;
|
|
enum {
|
|
eStreamNeeded,
|
|
eLengthNeeded,
|
|
} mOp;
|
|
};
|
|
nsTArray<PendingOperation> mPendingOperations;
|
|
|
|
nsCOMPtr<nsISerialEventTarget> mOwningEventTarget;
|
|
|
|
RefPtr<ThreadSafeWorkerRef> mWorkerRef;
|
|
};
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_dom_ipc_IPCBlobInputStreamChild_h
|