Bug 545869 - Remove small buffer #defines and use preferences. r=honza

This commit is contained in:
Doug Turner 2010-04-20 09:32:28 -07:00
Родитель 82325e59f5
Коммит d56442f0d2
24 изменённых файлов: 123 добавлений и 118 удалений

Просмотреть файл

@ -210,7 +210,6 @@ MOZ_RDF = @MOZ_RDF@
NECKO_PROTOCOLS = @NECKO_PROTOCOLS@
NECKO_DISK_CACHE = @NECKO_DISK_CACHE@
NECKO_SMALL_BUFFERS = @NECKO_SMALL_BUFFERS@
NECKO_COOKIES = @NECKO_COOKIES@
NECKO_WIFI = @NECKO_WIFI@
MOZ_AUTH_EXTENSION = @MOZ_AUTH_EXTENSION@

Просмотреть файл

@ -4816,7 +4816,6 @@ NECKO_WIFI=1
NECKO_COOKIES=1
NECKO_DISK_CACHE=1
NECKO_PROTOCOLS_DEFAULT="about data file ftp gopher http res viewsource"
NECKO_SMALL_BUFFERS=
BUILD_CTYPES=1
XPC_IDISPATCH_SUPPORT=
@ -8146,19 +8145,6 @@ if test "$NECKO_WIFI"; then
fi
AC_SUBST(NECKO_WIFI)
dnl
dnl option to minimize size of necko's i/o buffers
dnl
MOZ_ARG_ENABLE_BOOL(necko-small-buffers,
[ --enable-necko-small-buffers
Minimize size of necko's i/o buffers],
NECKO_SMALL_BUFFERS=1,
NECKO_SMALL_BUFFERS=)
AC_SUBST(NECKO_SMALL_BUFFERS)
if test "$NECKO_SMALL_BUFFERS"; then
AC_DEFINE(NECKO_SMALL_BUFFERS)
fi
dnl
dnl option to disable cookies
dnl

Просмотреть файл

@ -2888,3 +2888,6 @@ pref("browser.history.allowPushState", true);
pref("browser.history.allowReplaceState", true);
pref("browser.history.allowPopState", true);
pref("browser.history.maxStateObjectSize", 655360);
pref("network.buffer.cache.count", 24);
pref("network.buffer.cache.size", 4096);

Просмотреть файл

@ -35,6 +35,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsIOService.h"
#include "nsAsyncStreamCopier.h"
#include "nsIEventTarget.h"
#include "nsStreamUtils.h"
@ -56,7 +57,7 @@ static PRLogModuleInfo *gStreamCopierLog = nsnull;
nsAsyncStreamCopier::nsAsyncStreamCopier()
: mLock(nsnull)
, mMode(NS_ASYNCCOPY_VIA_READSEGMENTS)
, mChunkSize(NET_DEFAULT_SEGMENT_SIZE)
, mChunkSize(nsIOService::gDefaultSegmentSize)
, mStatus(NS_OK)
, mIsPending(PR_FALSE)
{
@ -234,7 +235,7 @@ nsAsyncStreamCopier::Init(nsIInputStream *source,
return NS_ERROR_OUT_OF_MEMORY;
if (chunkSize == 0)
chunkSize = NET_DEFAULT_SEGMENT_SIZE;
chunkSize = nsIOService::gDefaultSegmentSize;
mChunkSize = chunkSize;
mSource = source;

Просмотреть файл

@ -84,6 +84,9 @@
#define AUTODIAL_PREF "network.autodial-helper.enabled"
#define MANAGE_OFFLINE_STATUS_PREF "network.manage-offline-status"
#define NECKO_BUFFER_CACHE_COUNT_PREF "network.buffer.cache.count"
#define NECKO_BUFFER_CACHE_SIZE_PREF "network.buffer.cache.size"
#define MAX_RECURSION_COUNT 50
nsIOService* gIOService = nsnull;
@ -162,6 +165,8 @@ static const char kProfileChangeNetRestoreTopic[] = "profile-change-net-restore"
// Necko buffer cache
nsIMemory* nsIOService::gBufferCache = nsnull;
PRUint32 nsIOService::gDefaultSegmentSize = 4096;
PRUint32 nsIOService::gDefaultSegmentCount = 24;
////////////////////////////////////////////////////////////////////////////////
@ -175,23 +180,6 @@ nsIOService::nsIOService()
, mChannelEventSinks(NS_CHANNEL_EVENT_SINK_CATEGORY)
, mContentSniffers(NS_CONTENT_SNIFFER_CATEGORY)
{
// Get the allocator ready
if (!gBufferCache)
{
nsresult rv = NS_OK;
nsCOMPtr<nsIRecyclingAllocator> recyclingAllocator =
do_CreateInstance(NS_RECYCLINGALLOCATOR_CONTRACTID, &rv);
if (NS_FAILED(rv))
return;
rv = recyclingAllocator->Init(NS_NECKO_BUFFER_CACHE_COUNT,
NS_NECKO_15_MINS, "necko");
if (NS_FAILED(rv))
return;
nsCOMPtr<nsIMemory> eyeMemory = do_QueryInterface(recyclingAllocator);
gBufferCache = eyeMemory.get();
NS_IF_ADDREF(gBufferCache);
}
}
nsresult
@ -251,6 +239,22 @@ nsIOService::Init()
else
NS_WARNING("failed to get observer service");
// Get the allocator ready
if (!gBufferCache) {
nsresult rv = NS_OK;
nsCOMPtr<nsIRecyclingAllocator> recyclingAllocator =
do_CreateInstance(NS_RECYCLINGALLOCATOR_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
rv = recyclingAllocator->Init(gDefaultSegmentCount,
(15 * 60), // 15 minutes
"necko");
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "Was unable to allocate. No gBufferCache.");
CallQueryInterface(recyclingAllocator, &gBufferCache);
}
gIOService = this;
// go into managed mode if we can
@ -791,6 +795,29 @@ nsIOService::PrefsChanged(nsIPrefBranch *prefs, const char *pref)
&manage)))
SetManageOfflineStatus(manage);
}
if (!pref || strcmp(pref, NECKO_BUFFER_CACHE_COUNT_PREF) == 0) {
PRInt32 count;
if (NS_SUCCEEDED(prefs->GetIntPref(NECKO_BUFFER_CACHE_COUNT_PREF,
&count)))
/* check for bogus values and default if we find such a value */
if (count > 0)
gDefaultSegmentCount = count;
}
if (!pref || strcmp(pref, NECKO_BUFFER_CACHE_SIZE_PREF) == 0) {
PRInt32 size;
if (NS_SUCCEEDED(prefs->GetIntPref(NECKO_BUFFER_CACHE_SIZE_PREF,
&size)))
/* check for bogus values and default if we find such a value
* the upper limit here is arbitrary. having a 1mb segment size
* is pretty crazy. if you remove this, consider adding some
* integer rollover test.
*/
if (size > 0 && size < 1024*1024)
gDefaultSegmentSize = size;
NS_WARN_IF_FALSE( (!(size & (size - 1))) , "network buffer cache size is not a power of 2!");
}
}
void

Просмотреть файл

@ -60,13 +60,6 @@
#define NS_N(x) (sizeof(x)/sizeof(*x))
#ifdef NECKO_SMALL_BUFFERS
#define NS_NECKO_BUFFER_CACHE_COUNT (10) // Max holdings: 10 * 2k = 20k
#else
#define NS_NECKO_BUFFER_CACHE_COUNT (24) // Max holdings: 24 * 4k = 96k
#endif
#define NS_NECKO_15_MINS (15 * 60)
static const char gScheme[][sizeof("resource")] =
{"chrome", "file", "http", "jar", "resource"};
@ -159,6 +152,8 @@ public:
// Necko buffer cache. Used for all default buffer sizes that necko
// allocates.
static nsIMemory *gBufferCache;
static PRUint32 gDefaultSegmentSize;
static PRUint32 gDefaultSegmentCount;
};
/**

Просмотреть файл

@ -36,6 +36,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsIOService.h"
#include "nsInputStreamPump.h"
#include "nsIServiceManager.h"
#include "nsIStreamTransportService.h"
@ -44,7 +45,6 @@
#include "nsITransport.h"
#include "nsNetUtil.h"
#include "nsThreadUtils.h"
#include "nsNetSegmentUtils.h"
#include "nsCOMPtr.h"
#include "prlog.h"
@ -138,8 +138,10 @@ nsInputStreamPump::PeekStream(PeekSegmentFun callback, void* closure)
return rv;
PeekData data(callback, closure);
return mAsyncStream->ReadSegments(CallPeekFunc, &data,
NET_DEFAULT_SEGMENT_SIZE, &dummy);
return mAsyncStream->ReadSegments(CallPeekFunc,
&data,
nsIOService::gDefaultSegmentSize,
&dummy);
}
nsresult

Просмотреть файл

@ -38,27 +38,18 @@
#ifndef nsNetSegmentUtils_h__
#define nsNetSegmentUtils_h__
#include "necko-config.h"
#include "nsIOService.h"
#ifdef NECKO_SMALL_BUFFERS
#define NET_DEFAULT_SEGMENT_SIZE 2048
#define NET_DEFAULT_SEGMENT_COUNT 4
#else
#define NET_DEFAULT_SEGMENT_SIZE 4096
#define NET_DEFAULT_SEGMENT_COUNT 16
#endif
/**
* returns preferred allocator for given segment size. NULL implies
* system allocator. this result can be used when allocating a pipe.
*/
static inline nsIMemory *
net_GetSegmentAlloc(PRUint32 segsize)
{
return (segsize == NET_DEFAULT_SEGMENT_SIZE)
? nsIOService::gBufferCache
: nsnull;
return (segsize == nsIOService::gDefaultSegmentSize)
? nsIOService::gBufferCache : nsnull;
}
/**
@ -68,9 +59,10 @@ static inline void
net_ResolveSegmentParams(PRUint32 &segsize, PRUint32 &segcount)
{
if (!segsize)
segsize = NET_DEFAULT_SEGMENT_SIZE;
segsize = nsIOService::gDefaultSegmentSize;
if (!segcount)
segcount = NET_DEFAULT_SEGMENT_COUNT;
segcount = nsIOService::gDefaultSegmentCount;
}
#endif // !nsNetSegmentUtils_h__

Просмотреть файл

@ -34,16 +34,16 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsIOService.h"
#include "nsSyncStreamListener.h"
#include "nsIPipe.h"
#include "nsNetSegmentUtils.h"
nsresult
nsSyncStreamListener::Init()
{
return NS_NewPipe(getter_AddRefs(mPipeIn),
getter_AddRefs(mPipeOut),
NET_DEFAULT_SEGMENT_SIZE,
nsIOService::gDefaultSegmentSize,
PR_UINT32_MAX, // no size limit
PR_FALSE,
PR_FALSE);

Просмотреть файл

@ -39,8 +39,6 @@
#undef NECKO_DISK_CACHE
#undef NECKO_SMALL_BUFFERS
#undef NECKO_COOKIES
#undef NECKO_WIFI

Просмотреть файл

@ -37,6 +37,7 @@
// data implementation
#include "nsIOService.h"
#include "nsDataChannel.h"
#include "nsDataHandler.h"
#include "nsNetUtil.h"
@ -44,7 +45,6 @@
#include "nsIInputStream.h"
#include "nsIOutputStream.h"
#include "nsReadableUtils.h"
#include "nsNetSegmentUtils.h"
#include "nsEscape.h"
#include "plbase64.h"
#include "plstr.h"
@ -82,7 +82,8 @@ nsDataChannel::OpenContentStream(PRBool async, nsIInputStream **result,
// create an unbounded pipe.
rv = NS_NewPipe(getter_AddRefs(bufInStream),
getter_AddRefs(bufOutStream),
NET_DEFAULT_SEGMENT_SIZE, PR_UINT32_MAX,
nsIOService::gDefaultSegmentSize,
PR_UINT32_MAX,
async, PR_TRUE);
if (NS_FAILED(rv))
return rv;

Просмотреть файл

@ -37,6 +37,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsIOService.h"
#include "nsFileChannel.h"
#include "nsBaseContentStream.h"
#include "nsDirectoryIndexStream.h"
@ -46,7 +47,6 @@
#include "nsURLHelper.h"
#include "nsMimeTypes.h"
#include "nsNetUtil.h"
#include "nsNetSegmentUtils.h"
#include "nsProxyRelease.h"
#include "nsAutoPtr.h"
#include "nsStandardURL.h"
@ -107,7 +107,7 @@ nsFileCopyEvent::DoCopy()
{
// We'll copy in chunks this large by default. This size affects how
// frequently we'll check for interrupts.
const PRInt32 chunk = NET_DEFAULT_SEGMENT_SIZE * NET_DEFAULT_SEGMENT_COUNT;
const PRInt32 chunk = nsIOService::gDefaultSegmentSize * nsIOService::gDefaultSegmentCount;
nsresult rv = NS_OK;

Просмотреть файл

@ -63,12 +63,6 @@
#include "nsIResumableChannel.h"
#include "nsHashPropertyBag.h"
#define FTP_COMMAND_CHANNEL_SEG_SIZE 64
#define FTP_COMMAND_CHANNEL_SEG_COUNT 8
#define FTP_DATA_CHANNEL_SEG_SIZE (4*1024)
#define FTP_DATA_CHANNEL_SEG_COUNT 8
class nsFtpChannel : public nsBaseChannel,
public nsIFTPChannel,
public nsIUploadChannel,

Просмотреть файл

@ -45,6 +45,7 @@
#include "prlog.h"
#include "prtime.h"
#include "nsIOService.h"
#include "nsFTPChannel.h"
#include "nsFtpConnectionThread.h"
#include "nsFtpControlConnection.h"
@ -1528,8 +1529,8 @@ nsFtpState::R_pasv() {
// open a buffered, asynchronous socket input stream
nsCOMPtr<nsIInputStream> input;
rv = mDataTransport->OpenInputStream(0,
FTP_DATA_CHANNEL_SEG_SIZE,
FTP_DATA_CHANNEL_SEG_COUNT,
nsIOService::gDefaultSegmentSize,
nsIOService::gDefaultSegmentCount,
getter_AddRefs(input));
NS_ENSURE_SUCCESS(rv, FTP_ERROR);
mDataStream = do_QueryInterface(input);
@ -1655,9 +1656,10 @@ nsFtpState::OpenCacheDataStream()
// Open a non-blocking, buffered input stream...
nsCOMPtr<nsIInputStream> transportInput;
transport->OpenInputStream(0, FTP_DATA_CHANNEL_SEG_SIZE,
FTP_DATA_CHANNEL_SEG_COUNT,
getter_AddRefs(transportInput));
transport->OpenInputStream(0,
nsIOService::gDefaultSegmentSize,
nsIOService::gDefaultSegmentCount,
getter_AddRefs(transportInput));
NS_ENSURE_STATE(transportInput);
mDataStream = do_QueryInterface(transportInput);

Просмотреть файл

@ -35,7 +35,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsIOService.h"
#include "nsFTPChannel.h"
#include "nsFtpControlConnection.h"
#include "nsFtpProtocolHandler.h"
@ -153,8 +153,8 @@ nsFtpControlConnection::Connect(nsIProxyInfo* proxyInfo,
// open buffered, non-blocking/asynchronous input stream to socket.
nsCOMPtr<nsIInputStream> inStream;
rv = mSocket->OpenInputStream(0,
FTP_COMMAND_CHANNEL_SEG_SIZE,
FTP_COMMAND_CHANNEL_SEG_COUNT,
nsIOService::gDefaultSegmentSize,
nsIOService::gDefaultSegmentCount,
getter_AddRefs(inStream));
if (NS_SUCCEEDED(rv))
mSocketInput = do_QueryInterface(inStream);

Просмотреть файл

@ -80,11 +80,6 @@ extern PRLogModuleInfo *gHttpLog;
#define LOG4_ENABLED() PR_LOG_TEST(gHttpLog, 4)
#define LOG_ENABLED() LOG4_ENABLED()
// http default buffer geometry
#define NS_HTTP_SEGMENT_SIZE 4096
#define NS_HTTP_SEGMENT_COUNT 16 // 64k maximum
#define NS_HTTP_MAX_ODA_SIZE (NS_HTTP_SEGMENT_SIZE * 4) // 16k
// http version codes
#define NS_HTTP_VERSION_UNKNOWN 0
#define NS_HTTP_VERSION_0_9 9

Просмотреть файл

@ -83,7 +83,6 @@
#include "nsAuthInformationHolder.h"
#include "nsICacheService.h"
#include "nsDNSPrefetch.h"
#include "nsNetSegmentUtils.h"
// True if the local cache should be bypassed when processing a request.
#define BYPASS_LOCAL_CACHE(loadFlags) \

Просмотреть файл

@ -42,6 +42,7 @@
#include "nsHttpRequestHead.h"
#include "nsHttpResponseHead.h"
#include "nsHttpHandler.h"
#include "nsIOService.h"
#include "nsISocketTransportService.h"
#include "nsISocketTransport.h"
#include "nsIServiceManager.h"
@ -567,11 +568,12 @@ nsHttpConnection::OnSocketWritable()
if (mSSLProxyConnectStream) {
LOG((" writing CONNECT request stream\n"));
rv = mSSLProxyConnectStream->ReadSegments(ReadFromStream, this,
NS_HTTP_SEGMENT_SIZE, &n);
nsIOService::gDefaultSegmentSize,
&n);
}
else {
LOG((" writing transaction request stream\n"));
rv = mTransaction->ReadSegments(this, NS_HTTP_SEGMENT_SIZE, &n);
rv = mTransaction->ReadSegments(this, nsIOService::gDefaultSegmentSize, &n);
}
LOG((" ReadSegments returned [rv=%x read=%u sock-cond=%x]\n",
@ -661,7 +663,7 @@ nsHttpConnection::OnSocketReadable()
PRBool again = PR_TRUE;
do {
rv = mTransaction->WriteSegments(this, NS_HTTP_SEGMENT_SIZE, &n);
rv = mTransaction->WriteSegments(this, nsIOService::gDefaultSegmentSize, &n);
if (NS_FAILED(rv)) {
// if the transaction didn't want to take any more data, then
// wait for the transaction to call ResumeRecv.

Просмотреть файл

@ -277,7 +277,7 @@ nsHttpPipeline::PushBack(const char *data, PRUint32 length)
}
else if (length > mPushBackMax) {
// grow push back buffer as necessary.
NS_ASSERTION(length <= NS_HTTP_SEGMENT_SIZE, "too big");
NS_ASSERTION(length <= nsIOService::gDefaultSegmentSize, "too big");
mPushBackMax = length;
mPushBackBuf = (char *) realloc(mPushBackBuf, mPushBackMax);
if (!mPushBackBuf)
@ -558,8 +558,8 @@ nsHttpPipeline::FillSendBuf()
// allocate a single-segment pipe
rv = NS_NewPipe(getter_AddRefs(mSendBufIn),
getter_AddRefs(mSendBufOut),
NS_HTTP_SEGMENT_SIZE,
NS_HTTP_SEGMENT_SIZE,
nsIOService::gDefaultSegmentSize, /* segment size */
nsIOService::gDefaultSegmentSize, /* max size */
PR_TRUE, PR_TRUE,
nsIOService::gBufferCache);
if (NS_FAILED(rv)) return rv;

Просмотреть файл

@ -107,7 +107,7 @@ private:
nsCOMPtr<nsIInputStream> mSendBufIn;
nsCOMPtr<nsIOutputStream> mSendBufOut;
// the push back buffer. not exceeding NS_HTTP_SEGMENT_SIZE bytes.
// the push back buffer. not exceeding nsIOService::gDefaultSegmentSize bytes.
char *mPushBackBuf;
PRUint32 mPushBackLen;
PRUint32 mPushBackMax;

Просмотреть файл

@ -38,13 +38,13 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsIOService.h"
#include "nsHttpHandler.h"
#include "nsHttpTransaction.h"
#include "nsHttpConnection.h"
#include "nsHttpRequestHead.h"
#include "nsHttpResponseHead.h"
#include "nsHttpChunkedDecoder.h"
#include "nsNetSegmentUtils.h"
#include "nsTransportUtils.h"
#include "nsNetUtil.h"
#include "nsProxyRelease.h"
@ -291,7 +291,7 @@ nsHttpTransaction::Init(PRUint8 caps,
// that we write data in the largest chunks possible. this is actually
// necessary to workaround some common server bugs (see bug 137155).
rv = NS_NewBufferedInputStream(getter_AddRefs(mRequestStream), multi,
NET_DEFAULT_SEGMENT_SIZE);
nsIOService::gDefaultSegmentSize);
if (NS_FAILED(rv)) return rv;
}
else
@ -304,8 +304,8 @@ nsHttpTransaction::Init(PRUint8 caps,
rv = NS_NewPipe2(getter_AddRefs(mPipeIn),
getter_AddRefs(mPipeOut),
PR_TRUE, PR_TRUE,
NS_HTTP_SEGMENT_SIZE,
NS_HTTP_SEGMENT_COUNT,
nsIOService::gDefaultSegmentSize,
nsIOService::gDefaultSegmentCount,
nsIOService::gBufferCache);
if (NS_FAILED(rv)) return rv;

Просмотреть файл

@ -36,6 +36,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsIOService.h"
#include "nsBinHexDecoder.h"
#include "nsIServiceManager.h"
#include "nsIStreamConverterService.h"
@ -52,11 +53,6 @@
#include "nsMimeTypes.h"
#define DATA_BUFFER_SIZE (4096*2)
#define NS_STREAM_CONVERTER_SEGMENT_SIZE (4*1024)
#define NS_STREAM_CONVERTER_BUFFER_SIZE (32*1024)
// sadly I couldn't find char defintions for CR LF elsehwere in the code (they are defined as strings in nsCRT.h)
#define CR '\015'
#define LF '\012'
@ -167,7 +163,7 @@ nsBinHexDecoder::OnDataAvailable(nsIRequest* request,
PRUint32 numBytesRead = 0;
while (aCount > 0) // while we still have bytes to copy...
{
aStream->Read(mDataBuffer, PR_MIN(aCount, DATA_BUFFER_SIZE - 1), &numBytesRead);
aStream->Read(mDataBuffer, PR_MIN(aCount, nsIOService::gDefaultSegmentSize - 1), &numBytesRead);
if (aCount >= numBytesRead)
aCount -= numBytesRead; // subtract off the number of bytes we just read
else
@ -276,7 +272,7 @@ nsresult nsBinHexDecoder::ProcessNextState(nsIRequest * aRequest, nsISupports *
mInCRC = 1;
}
else if (mPosOutputBuff >= DATA_BUFFER_SIZE)
else if (mPosOutputBuff >= (PRInt32) nsIOService::gDefaultSegmentSize)
{
if (mState == BINHEX_STATE_DFORK)
{
@ -483,14 +479,14 @@ nsBinHexDecoder::OnStartRequest(nsIRequest* request, nsISupports *aCtxt)
NS_ENSURE_TRUE(mNextListener, NS_ERROR_FAILURE);
mDataBuffer = (char *) nsMemory::Alloc((sizeof(char) * DATA_BUFFER_SIZE));
mOutgoingBuffer = (char *) nsMemory::Alloc((sizeof(char) * DATA_BUFFER_SIZE));
mDataBuffer = (char *) nsMemory::Alloc((sizeof(char) * nsIOService::gDefaultSegmentSize));
mOutgoingBuffer = (char *) nsMemory::Alloc((sizeof(char) * nsIOService::gDefaultSegmentSize));
if (!mDataBuffer || !mOutgoingBuffer) return NS_ERROR_FAILURE; // out of memory;
// now we want to create a pipe which we'll use to write our converted data...
rv = NS_NewPipe(getter_AddRefs(mInputStream), getter_AddRefs(mOutputStream),
NS_STREAM_CONVERTER_SEGMENT_SIZE,
NS_STREAM_CONVERTER_BUFFER_SIZE,
nsIOService::gDefaultSegmentSize,
nsIOService::gDefaultSegmentSize,
PR_TRUE, PR_TRUE);
// don't propagate the on start request to mNextListener until we have determined the content type.

Просмотреть файл

@ -1110,6 +1110,7 @@ nsExternalAppHandler::nsExternalAppHandler(nsIMIMEInfo * aMIMEInfo,
, mContentLength(-1)
, mProgress(0)
, mRequest(nsnull)
, mDataBuffer(nsnull)
{
// make sure the extention includes the '.'
@ -1138,12 +1139,30 @@ nsExternalAppHandler::nsExternalAppHandler(nsIMIMEInfo * aMIMEInfo,
EnsureSuggestedFileName();
gExtProtSvc->AddRef();
nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID));
if (!prefs)
return;
mBufferSize = 8192;
PRInt32 size;
nsresult rv = prefs->GetIntPref("network.buffer.cache.size", &size);
if (NS_SUCCEEDED(rv)) {
mBufferSize = size;
}
mDataBuffer = (char*) malloc(mBufferSize);
if (!mDataBuffer)
return;
}
nsExternalAppHandler::~nsExternalAppHandler()
{
// Not using NS_RELEASE, since we don't want to set gExtProtSvc to NULL
gExtProtSvc->Release();
if (mDataBuffer)
free(mDataBuffer);
}
NS_IMETHODIMP nsExternalAppHandler::SetWebProgressListener(nsIWebProgressListener2 * aWebProgressListener)
@ -1758,7 +1777,7 @@ NS_IMETHODIMP nsExternalAppHandler::OnDataAvailable(nsIRequest *request, nsISupp
{
nsresult rv = NS_OK;
// first, check to see if we've been canceled....
if (mCanceled) // then go cancel our underlying channel too
if (mCanceled || !mDataBuffer) // then go cancel our underlying channel too
return request->Cancel(NS_BINDING_ABORTED);
// read the data out of the stream and write it to the temp file.
@ -1771,7 +1790,7 @@ NS_IMETHODIMP nsExternalAppHandler::OnDataAvailable(nsIRequest *request, nsISupp
while (NS_SUCCEEDED(rv) && count > 0) // while we still have bytes to copy...
{
readError = PR_TRUE;
rv = inStr->Read(mDataBuffer, PR_MIN(count, DATA_BUFFER_SIZE - 1), &numBytesRead);
rv = inStr->Read(mDataBuffer, PR_MIN(count, mBufferSize - 1), &numBytesRead);
if (NS_SUCCEEDED(rv))
{
if (count >= numBytesRead)

Просмотреть файл

@ -237,13 +237,6 @@ protected:
PRBool mInPrivateBrowsing;
};
/**
* We need to read the data out of the incoming stream into a buffer which we
* can then use to write the data into the output stream representing the
* temp file.
*/
#define DATA_BUFFER_SIZE (4096*2)
/**
* An external app handler is just a small little class that presents itself as
* a nsIStreamListener. It saves the incoming data into a temp file. The handler
@ -359,7 +352,8 @@ protected:
*/
nsCOMPtr<nsIFile> mFinalFileDestination;
char mDataBuffer[DATA_BUFFER_SIZE];
PRUint32 mBufferSize;
char *mDataBuffer;
/**
* Creates the temporary file for the download and an output stream for it.