mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-28 15:23:51 +00:00
4ebf5b4364
In the current code there are 3 main issues: 1. nsFileStream is not really thread-safe. There is nothing to protect the internal members and we see crashes. 2. nsPipeInputStream doesn't implement ::Seek() method and that caused issues in devtools when a nsHttpChannel sends POST data using a pipe. In order to fix this, bug 1494176 added a check in nsHttpChannel: if the stream doesn't implement ::Seek(), let's clone it. This was an hack around nsPipeInputStream, and it's bad. 3. When nsHttpChannel sends POST data using a file stream, nsFileStream does I/O on main-thread because of the issue 2. Plus, ::Seek() is called on the main-thread causing issue 1. Note that nsPipeInputStream implements only ::Tell(), of the nsISeekableStream methods. It doesn't implement ::Seek() and it doesn't implement ::SetEOF(). With this patch I want to fix point 2 and point 3 (and consequentially issue 1 - but we need a separate fix for it - follow up). The patch does: 1. it splits nsISeekableStream in 2 interfaces: nsITellableStream and nsISeekableStream. 2. nsPipeInputStream implements only nsITellableStream. Doing this, we don't need the ::Seek() check for point 2 in nsHttpChannel: a simple QI check is enough. 3. Because we don't call ::Seek() in nsHttpChannel, nsFileStream doesn't do I/O on the main-thread, and we don't crash doing so.
35 lines
1.0 KiB
Plaintext
35 lines
1.0 KiB
Plaintext
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/* 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/. */
|
|
|
|
|
|
/*
|
|
* nsITellableStream
|
|
*
|
|
* This class is separate from nsISeekableStream in order to let streams to
|
|
* implement ::Tell() without implementing the whole nsISeekableStream
|
|
* interface. Callers can QI the stream to know what is implemented. This is
|
|
* mainly done for nsPipeInputStream.
|
|
*
|
|
*
|
|
* Implementing this interface, streams are able to expose the current offset
|
|
* via ::tell().
|
|
*/
|
|
|
|
#include "nsISupports.idl"
|
|
|
|
[scriptable, uuid(ee942946-4538-45d2-bf05-ffdbf5932621)]
|
|
interface nsITellableStream : nsISupports
|
|
{
|
|
/**
|
|
* tell
|
|
*
|
|
* This method reports the current offset, in bytes, from the start of the
|
|
* stream.
|
|
*
|
|
* @throws NS_BASE_STREAM_CLOSED if called on a closed stream.
|
|
*/
|
|
long long tell();
|
|
};
|