mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-11 16:32:59 +00:00
635fc0e1ae
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
44 lines
1.6 KiB
Plaintext
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;
|
|
};
|