Commit 8eb1577a authored by Kagami Sascha Rosylight's avatar Kagami Sascha Rosylight
Browse files

Bug 1813011 - Part 3: Remove BodyStream::mState r=smaug

1. eInitializing is only used to call MarkAsRead, but it can just be called unconditionally since it's just a boolean setter.
2. eClosed is aliased to `!mStreamHolder`, since it becomes null when being closed.

Differential Revision: https://phabricator.services.mozilla.com/D169484
parent 395a9e1f
Loading
Loading
Loading
Loading
+14 −22
Original line number Original line Diff line number Diff line
@@ -191,16 +191,12 @@ already_AddRefed<Promise> BodyStream::PullCallback(


  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());


  MOZ_DIAGNOSTIC_ASSERT(mState == eInitializing || mState == eInitialized);
  MOZ_DIAGNOSTIC_ASSERT(!IsClosed());
  MOZ_ASSERT(!mPullPromise);
  MOZ_ASSERT(!mPullPromise);
  mPullPromise = Promise::CreateInfallible(aController.GetParentObject());
  mPullPromise = Promise::CreateInfallible(aController.GetParentObject());


  if (mState == eInitializing) {
  // Reading the stream, let's mark it as such
    // The stream has been used for the first time.
  mStreamHolder->MarkAsRead();
  mStreamHolder->MarkAsRead();
  }

  mState = eInitialized;


  if (!mInputStream) {
  if (!mInputStream) {
    // This is the first use of the stream. Let's convert the
    // This is the first use of the stream. Let's convert the
@@ -244,7 +240,7 @@ void BodyStream::WriteIntoReadRequestBuffer(JSContext* aCx,
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());


  MOZ_DIAGNOSTIC_ASSERT(mInputStream);
  MOZ_DIAGNOSTIC_ASSERT(mInputStream);
  MOZ_DIAGNOSTIC_ASSERT(mState == eInitialized);
  MOZ_DIAGNOSTIC_ASSERT(!IsClosed());
  MOZ_DIAGNOSTIC_ASSERT(mPullPromise->State() ==
  MOZ_DIAGNOSTIC_ASSERT(mPullPromise->State() ==
                        Promise::PromiseState::Pending);
                        Promise::PromiseState::Pending);


@@ -285,8 +281,8 @@ void BodyStream::WriteIntoReadRequestBuffer(JSContext* aCx,
void BodyStream::CloseInputAndReleaseObjects() {
void BodyStream::CloseInputAndReleaseObjects() {
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());


  if (mState == eInitializing) {
  if (mStreamHolder) {
    // The stream has been used for the first time.
    // Being closed means someone touched the stream, let's mark it as read.
    mStreamHolder->MarkAsRead();
    mStreamHolder->MarkAsRead();
  }
  }


@@ -307,8 +303,7 @@ void BodyStream::CloseInputAndReleaseObjects() {
BodyStream::BodyStream(nsIGlobalObject* aGlobal,
BodyStream::BodyStream(nsIGlobalObject* aGlobal,
                       BodyStreamHolder* aStreamHolder,
                       BodyStreamHolder* aStreamHolder,
                       nsIInputStream* aInputStream)
                       nsIInputStream* aInputStream)
    : mState(eInitializing),
    : mGlobal(aGlobal),
      mGlobal(aGlobal),
      mStreamHolder(aStreamHolder),
      mStreamHolder(aStreamHolder),
      mOwningEventTarget(aGlobal->EventTargetFor(TaskCategory::Other)),
      mOwningEventTarget(aGlobal->EventTargetFor(TaskCategory::Other)),
      mOriginalInputStream(aInputStream) {
      mOriginalInputStream(aInputStream) {
@@ -325,7 +320,7 @@ void BodyStream::ErrorPropagation(JSContext* aCx, ReadableStream* aStream,
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());


  // Nothing to do.
  // Nothing to do.
  if (mState == eClosed) {
  if (IsClosed()) {
    return;
    return;
  }
  }


@@ -352,8 +347,8 @@ void BodyStream::ErrorPropagation(JSContext* aCx, ReadableStream* aStream,
    NS_WARNING_ASSERTION(!rv.Failed(), "Failed to error BodyStream");
    NS_WARNING_ASSERTION(!rv.Failed(), "Failed to error BodyStream");
  }
  }


  if (mState == eInitializing) {
  if (mStreamHolder) {
    // The stream has been used for the first time.
    // Being errored means someone touched the stream, let's mark it as read.
    mStreamHolder->MarkAsRead();
    mStreamHolder->MarkAsRead();
  }
  }


@@ -416,7 +411,7 @@ BodyStream::OnInputStreamReady(nsIAsyncInputStream* aStream) {
  mAsyncWaitWorkerRef = nullptr;
  mAsyncWaitWorkerRef = nullptr;


  // Already closed. We have nothing else to do here.
  // Already closed. We have nothing else to do here.
  if (mState == eClosed) {
  if (IsClosed()) {
    return NS_OK;
    return NS_OK;
  }
  }


@@ -429,7 +424,6 @@ BodyStream::OnInputStreamReady(nsIAsyncInputStream* aStream) {
  AutoEntryScript aes(mGlobal, "fetch body data available");
  AutoEntryScript aes(mGlobal, "fetch body data available");


  MOZ_DIAGNOSTIC_ASSERT(mInputStream);
  MOZ_DIAGNOSTIC_ASSERT(mInputStream);
  MOZ_DIAGNOSTIC_ASSERT(mState == eInitialized);
  MOZ_DIAGNOSTIC_ASSERT(mPullPromise->State() ==
  MOZ_DIAGNOSTIC_ASSERT(mPullPromise->State() ==
                        Promise::PromiseState::Pending);
                        Promise::PromiseState::Pending);


@@ -493,7 +487,7 @@ nsresult BodyStream::RetrieveInputStream(BodyStreamHolder* aStream,
void BodyStream::Close() {
void BodyStream::Close() {
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());


  if (mState == eClosed) {
  if (IsClosed()) {
    return;
    return;
  }
  }


@@ -514,7 +508,7 @@ void BodyStream::Close() {
void BodyStream::CloseAndReleaseObjects(JSContext* aCx,
void BodyStream::CloseAndReleaseObjects(JSContext* aCx,
                                        ReadableStream* aStream) {
                                        ReadableStream* aStream) {
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mState != eClosed);
  MOZ_DIAGNOSTIC_ASSERT(!IsClosed());


  ReleaseObjects();
  ReleaseObjects();


@@ -528,13 +522,11 @@ void BodyStream::CloseAndReleaseObjects(JSContext* aCx,
void BodyStream::ReleaseObjects() {
void BodyStream::ReleaseObjects() {
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());
  MOZ_DIAGNOSTIC_ASSERT(mOwningEventTarget->IsOnCurrentThread());


  if (mState == eClosed) {
  if (IsClosed()) {
    // Already gone. Nothing to do.
    // Already gone. Nothing to do.
    return;
    return;
  }
  }


  mState = eClosed;

  if (NS_IsMainThread()) {
  if (NS_IsMainThread()) {
    nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
    nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
    if (obs) {
    if (obs) {
+6 −13
Original line number Original line Diff line number Diff line
@@ -134,24 +134,17 @@ class BodyStream final : public nsIInputStreamCallback,


  void ReleaseObjects();
  void ReleaseObjects();


  // Common methods
  // The closed state should ultimately be managed by the source algorithms

  // class. See also bug 1815997.
  enum State {
  bool IsClosed() { return !mStreamHolder; }
    // This is the beginning state before any reading operation.
    eInitializing,

    // Stream is initialized and being consumed.
    eInitialized,


    // Operation completed.
  // Common methods
    eClosed,
  };

  State mState;


  // mGlobal is set on creation, and isn't modified off the owning thread.
  // mGlobal is set on creation, and isn't modified off the owning thread.
  // It isn't set to nullptr until ReleaseObjects() runs.
  // It isn't set to nullptr until ReleaseObjects() runs.
  nsCOMPtr<nsIGlobalObject> mGlobal;
  nsCOMPtr<nsIGlobalObject> mGlobal;
  // Same for mStreamHolder. mStreamHolder being nullptr means the stream is
  // closed.
  RefPtr<BodyStreamHolder> mStreamHolder;
  RefPtr<BodyStreamHolder> mStreamHolder;
  nsCOMPtr<nsIEventTarget> mOwningEventTarget;
  nsCOMPtr<nsIEventTarget> mOwningEventTarget;
  // Same as mGlobal but set to nullptr on OnInputStreamReady (on the owning
  // Same as mGlobal but set to nullptr on OnInputStreamReady (on the owning