gecko-dev/netwerk/base/nsIThreadRetargetableRequest.idl
Kris Maglione 635fc0e1ae Bug 1405286: Part 1 - Allow retrieving the delivery target from retargetable requests. r=dragana
After data delivery for a request has been retargeted, there's no reliable way
to get the appropriate event target to re-dispatch data events after
asynchronous processing.


While it's technically possible to retrieve the current thread from
OnDataAvailable callbacks and re-use that for later dispatch, that approach
has some issues:

1) It's not currently possible to reliably map the current thread to the
thread pool that owns it. That means that if data delivery is being targetted
to a thread pool, attempts to redispatch events to the previous delivery
thread might lead to long delays when one thread in a pool is blocked.

2) If a filter wishes to dispatch data events to the wrapped listeners before
it's recieved any data (as extensions StreamFilters sometimes do), there's no
way to determine the proper event target without waiting for initial data to
be received.


Simply returning the correct event target from the request solves both of
these problems.

MozReview-Commit-ID: CJxq7O4399R

--HG--
extra : rebase_source : db2f659ecad16daafdbcc108d7b1a51ea1af31f9
2017-10-14 18:30:38 -07:00

44 lines
1.6 KiB
Plaintext

/* -*- 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/. */
#include "nsISupports.idl"
interface nsIEventTarget;
/**
* nsIThreadRetargetableRequest
*
* Should be implemented by requests that support retargeting delivery of
* data off the main thread.
*/
[uuid(27b84c48-5a73-4ba4-a8a4-8b5e649a145e)]
interface nsIThreadRetargetableRequest : nsISupports
{
/**
* Called to retarget delivery of OnDataAvailable to another thread. Should
* only be called before AsyncOpen for nsIWebsocketChannels, or during
* OnStartRequest for nsIChannels.
* Note: For nsIChannels, OnStartRequest and OnStopRequest will still be
* delivered on the main thread.
*
* @param aNewTarget New event target, e.g. thread or threadpool.
*
* Note: no return value is given. If the retargeting cannot be handled,
* normal delivery to the main thread will continue. As such, listeners
* should be ready to deal with OnDataAvailable on either the main thread or
* the new target thread.
*/
void retargetDeliveryTo(in nsIEventTarget aNewTarget);
/**
* Returns the event target where OnDataAvailable events will be dispatched.
*
* This is only valid after OnStartRequest has been called. Any time before
* that point, the value may be changed by `retargetDeliveryTo` calls.
*/
readonly attribute nsIEventTarget deliveryTarget;
};