mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 1361699
- Add buffer when writing hashstore to file r=gcp,mcmanus
We write a lot of 4-bytes prefixes to file which call many system calls. We should use a buffer and only write to file if the buffer is full or finish writing. nsIBufferedOutputStream is a good candidate to do that MozReview-Commit-ID: CzGOd7iXVTv --HG-- extra : rebase_source : 25f1ce804b9a53e0a0a4023a1aa91f1a0ed98547
This commit is contained in:
parent
40422612bd
commit
fd95099ac3
@ -99,10 +99,10 @@ protected:
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class nsBufferedOutputStream final : public nsBufferedStream,
|
||||
public nsISafeOutputStream,
|
||||
public nsIBufferedOutputStream,
|
||||
public nsIStreamBufferAccess
|
||||
class nsBufferedOutputStream : public nsBufferedStream,
|
||||
public nsISafeOutputStream,
|
||||
public nsIBufferedOutputStream,
|
||||
public nsIStreamBufferAccess
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
@ -976,8 +976,7 @@ HashStore::WriteFile()
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIOutputStream> out;
|
||||
rv = NS_NewCheckSummedOutputStream(getter_AddRefs(out), storeFile,
|
||||
PR_WRONLY | PR_TRUNCATE | PR_CREATE_FILE);
|
||||
rv = NS_NewCheckSummedOutputStream(getter_AddRefs(out), storeFile);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
uint32_t written;
|
||||
|
@ -13,14 +13,11 @@
|
||||
// nsCheckSummedOutputStream
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED(nsCheckSummedOutputStream,
|
||||
nsSafeFileOutputStream,
|
||||
nsISafeOutputStream,
|
||||
nsIOutputStream,
|
||||
nsIFileOutputStream)
|
||||
nsBufferedOutputStream,
|
||||
nsISafeOutputStream)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCheckSummedOutputStream::Init(nsIFile* file, int32_t ioFlags, int32_t perm,
|
||||
int32_t behaviorFlags)
|
||||
nsCheckSummedOutputStream::Init(nsIOutputStream* stream, uint32_t bufferSize)
|
||||
{
|
||||
nsresult rv;
|
||||
mHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID, &rv);
|
||||
@ -29,7 +26,7 @@ nsCheckSummedOutputStream::Init(nsIFile* file, int32_t ioFlags, int32_t perm,
|
||||
rv = mHash->Init(nsICryptoHash::MD5);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return nsSafeFileOutputStream::Init(file, ioFlags, perm, behaviorFlags);
|
||||
return nsBufferedOutputStream::Init(stream, bufferSize);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -39,12 +36,12 @@ nsCheckSummedOutputStream::Finish()
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
uint32_t written;
|
||||
rv = nsSafeFileOutputStream::Write(reinterpret_cast<const char*>(mCheckSum.BeginReading()),
|
||||
rv = nsBufferedOutputStream::Write(reinterpret_cast<const char*>(mCheckSum.BeginReading()),
|
||||
mCheckSum.Length(), &written);
|
||||
NS_ASSERTION(written == mCheckSum.Length(), "Error writing stream checksum");
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return nsSafeFileOutputStream::Finish();
|
||||
return nsBufferedOutputStream::Finish();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -53,7 +50,7 @@ nsCheckSummedOutputStream::Write(const char *buf, uint32_t count, uint32_t *resu
|
||||
nsresult rv = mHash->Update(reinterpret_cast<const uint8_t*>(buf), count);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return nsSafeFileOutputStream::Write(buf, count, result);
|
||||
return nsBufferedOutputStream::Write(buf, count, result);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -12,25 +12,27 @@
|
||||
#include "nsICryptoHash.h"
|
||||
#include "nsNetCID.h"
|
||||
#include "nsString.h"
|
||||
#include "../../../netwerk/base/nsFileStreams.h"
|
||||
#include "nsToolkitCompsCID.h"
|
||||
#include "../../../netwerk/base/nsBufferedStreams.h"
|
||||
#include "prio.h"
|
||||
|
||||
class nsCheckSummedOutputStream : public nsSafeFileOutputStream
|
||||
class nsCheckSummedOutputStream : public nsBufferedOutputStream
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
// Size of MD5 hash in bytes
|
||||
static const uint32_t CHECKSUM_SIZE = 16;
|
||||
static const uint32_t MAX_BUFFER_SIZE = 64 * 1024;
|
||||
|
||||
nsCheckSummedOutputStream() {}
|
||||
|
||||
NS_IMETHOD Finish() override;
|
||||
NS_IMETHOD Write(const char *buf, uint32_t count, uint32_t *result) override;
|
||||
NS_IMETHOD Init(nsIFile* file, int32_t ioFlags, int32_t perm, int32_t behaviorFlags) override;
|
||||
NS_IMETHOD Init(nsIOutputStream* stream, uint32_t bufferSize) override;
|
||||
|
||||
protected:
|
||||
virtual ~nsCheckSummedOutputStream() { nsSafeFileOutputStream::Close(); }
|
||||
virtual ~nsCheckSummedOutputStream() { nsBufferedOutputStream::Close(); }
|
||||
|
||||
nsCOMPtr<nsICryptoHash> mHash;
|
||||
nsCString mCheckSum;
|
||||
@ -39,13 +41,15 @@ protected:
|
||||
// returns a file output stream which can be QI'ed to nsIFileOutputStream.
|
||||
inline nsresult
|
||||
NS_NewCheckSummedOutputStream(nsIOutputStream **result,
|
||||
nsIFile *file,
|
||||
int32_t ioFlags = -1,
|
||||
int32_t perm = -1,
|
||||
int32_t behaviorFlags = 0)
|
||||
nsIFile *file)
|
||||
{
|
||||
nsCOMPtr<nsIFileOutputStream> out = new nsCheckSummedOutputStream();
|
||||
nsresult rv = out->Init(file, ioFlags, perm, behaviorFlags);
|
||||
nsCOMPtr<nsIOutputStream> localOutFile;
|
||||
nsresult rv = NS_NewSafeLocalFileOutputStream(getter_AddRefs(localOutFile), file,
|
||||
PR_WRONLY | PR_TRUNCATE | PR_CREATE_FILE);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIBufferedOutputStream> out = new nsCheckSummedOutputStream();
|
||||
rv = out->Init(localOutFile, nsCheckSummedOutputStream::CHECKSUM_SIZE);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
out.forget(result);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user