diff options
author | sra@chromium.org <sra@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-23 21:18:48 +0000 |
---|---|---|
committer | sra@chromium.org <sra@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-23 21:18:48 +0000 |
commit | 6db3cd4ebccf65c9bbe1bb6d6239ec103caaf518 (patch) | |
tree | c2ab9d415c80ae62ff06fdbb8be3472271daacb0 /courgette/ensemble_create.cc | |
parent | ce910b9d066453ea491473c4ef9e73b163a58d6d (diff) | |
download | chromium_src-6db3cd4ebccf65c9bbe1bb6d6239ec103caaf518.zip chromium_src-6db3cd4ebccf65c9bbe1bb6d6239ec103caaf518.tar.gz chromium_src-6db3cd4ebccf65c9bbe1bb6d6239ec103caaf518.tar.bz2 |
Improved memory usage while applying patch.
Reduced total size of allocations from 520MB to 318MB.
The general technique is to allocate the correct size rather than grow into
the correct size and overshoot.
1. Find file sizes and allocate buffers of that size for the input files.
2. Pre-allocate a buffer for the collected inputs for the final diff.
3. Calculate the size for (2) during compression and include it in the patch
header.
The courgette.exe command line tool now calls the same ApplyEnsemblePatch
entry point that is called by the installer. This ensures measurements of
courgette.exe are a better reflection of the installer.
BUG=72459
Review URL: http://codereview.chromium.org/6546008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75787 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'courgette/ensemble_create.cc')
-rw-r--r-- | courgette/ensemble_create.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/courgette/ensemble_create.cc b/courgette/ensemble_create.cc index 98b7ba0..b70621a 100644 --- a/courgette/ensemble_create.cc +++ b/courgette/ensemble_create.cc @@ -351,6 +351,9 @@ Status GenerateEnsemblePatch(SourceStream* base, if (delta2_status != C_OK) return delta2_status; + // Last use, free storage. + linearized_predicted_transformed_elements.Retire(); + // // Generate sub-patch for whole enchilada. // @@ -381,8 +384,12 @@ Status GenerateEnsemblePatch(SourceStream* base, if (!corrected_transformed_elements_source_set.Empty()) return C_STREAM_NOT_CONSUMED; + // No more references to this stream's buffer. + linearized_corrected_transformed_elements.Retire(); + FreeGenerators(&generators); + size_t final_patch_input_size = predicted_ensemble.Length(); SourceStream predicted_ensemble_source; predicted_ensemble_source.Init(predicted_ensemble); Status delta3_status = GenerateSimpleDelta(&predicted_ensemble_source, @@ -401,6 +408,7 @@ Status GenerateEnsemblePatch(SourceStream* base, CalculateCrc(old_region.start(), old_region.length())); final_patch->WriteVarint32( CalculateCrc(new_region.start(), new_region.length())); + final_patch->WriteSizeVarint32(final_patch_input_size); if (!patch_streams.CopyTo(final_patch)) return C_STREAM_ERROR; |