netwerk/ipc/ChannelEventQueue.cpp
author Gaia Pushbot <release+gaiajson@mozilla.com>
Tue, 01 Oct 2013 03:55:23 -0700
changeset 149487 95044a2054536643e3ddcc2f89fe6ea374bea406
parent 147931 f50b9bd02eaec7730d57db5beacb55deca914bf6
child 175816 272ead5346d3b82bf455620a22eb3d8c99928f9c
permissions -rw-r--r--
Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/e718a6b92432 Author: Amir Nissim <amirnissim@gmail.com> Desc: Merge pull request #12532 from EverythingMe/911022-save-search Bug 911022 - [e.me][feature] Enable search saving ======== https://hg.mozilla.org/integration/gaia-central/rev/e359357987b7 Author: Amir Nissim <amirn@everything.me> Desc: Bug 911022 - [e.me][feature] Enable search saving [r=ranbena]

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 * vim: set sw=2 ts=8 et 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/. */

#include "nsISupports.h"
#include "mozilla/net/ChannelEventQueue.h"
#include "nsThreadUtils.h"

namespace mozilla {
namespace net {

void
ChannelEventQueue::FlushQueue()
{
  // Events flushed could include destruction of channel (and our own
  // destructor) unless we make sure its refcount doesn't drop to 0 while this
  // method is running.
  nsCOMPtr<nsISupports> kungFuDeathGrip(mOwner);

  // Prevent flushed events from flushing the queue recursively
  mFlushing = true;

  uint32_t i;
  for (i = 0; i < mEventQueue.Length(); i++) {
    mEventQueue[i]->Run();
    if (mSuspended)
      break;
  }

  // We will always want to remove at least one finished callback.
  if (i < mEventQueue.Length())
    i++;

  // It is possible for new callbacks to be enqueued as we are
  // flushing the queue, so the queue must not be cleared until
  // all callbacks have run.
  mEventQueue.RemoveElementsAt(0, i);

  mFlushing = false;
}

void
ChannelEventQueue::Resume()
{
  // Resuming w/o suspend: error in debug mode, ignore in build
  MOZ_ASSERT(mSuspendCount > 0);
  if (mSuspendCount <= 0) {
    return;
  }

  if (!--mSuspendCount) {
    nsRefPtr<nsRunnableMethod<ChannelEventQueue> > event =
      NS_NewRunnableMethod(this, &ChannelEventQueue::CompleteResume);
    NS_DispatchToCurrentThread(event);
  }
}

}
}