diff options
author | Pádraig Brady <P@draigBrady.com> | 2008-11-20 22:49:02 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2008-11-21 11:50:59 +0000 |
commit | fbd87029cfc494a72bb73ade27ef46382c5bc832 (patch) | |
tree | 60566457d68ce76d1d98a8eb07fc99660d1ed9ea | |
parent | 3ece0355d52e41a1b079c0c46477a32250278c11 (diff) | |
download | coreutils-fbd87029cfc494a72bb73ade27ef46382c5bc832.tar.xz |
dd: avoid unnecessary memory copies
* src/dd.c (scanargs): When not otherwise required (e.g. for
conversion), use two-buffer mode only when the input and output
buffer sizes differ. Before, some of the most basic invocations of
dd, e.g., dd < in > out, would unnecessarily use separate buffers
and perform memory copies between them.
-rw-r--r-- | src/dd.c | 9 |
1 files changed, 2 insertions, 7 deletions
@@ -998,13 +998,11 @@ scanargs (int argc, char *const *argv) { invalid |= ! (0 < n && n <= MAX_BLOCKSIZE (INPUT_BLOCK_SLOP)); input_blocksize = n; - conversions_mask |= C_TWOBUFS; } else if (operand_is (name, "obs")) { invalid |= ! (0 < n && n <= MAX_BLOCKSIZE (OUTPUT_BLOCK_SLOP)); output_blocksize = n; - conversions_mask |= C_TWOBUFS; } else if (operand_is (name, "bs")) { @@ -1036,15 +1034,12 @@ scanargs (int argc, char *const *argv) if (blocksize) input_blocksize = output_blocksize = blocksize; - /* If bs= was given, both `input_blocksize' and `output_blocksize' will - have been set to positive values. If either has not been set, - bs= was not given, so make sure two buffers are used. */ - if (input_blocksize == 0 || output_blocksize == 0) - conversions_mask |= C_TWOBUFS; if (input_blocksize == 0) input_blocksize = DEFAULT_BLOCKSIZE; if (output_blocksize == 0) output_blocksize = DEFAULT_BLOCKSIZE; + if (input_blocksize != output_blocksize) + conversions_mask |= C_TWOBUFS; if (conversion_blocksize == 0) conversions_mask &= ~(C_BLOCK | C_UNBLOCK); |