Re: [PATCH v2 05/10] archive-tar: allow to accumulate writes before writing 512-byte blocks
From: Nguyen Thai Ngoc Duy <hidden>
Date: 2016-06-15 22:53:43
On Wed, May 2, 2012 at 9:28 PM, René Scharfe [off-list ref] wrote:
Am 02.05.2012 15:25, schrieb Nguyễn Thái Ngọc Duy:quoted
This allows to split single write_blocked(buf, 123) call into multiple calls write_blocked(buf, 100, 1); write_blocked(buf, 23, 1); write_blocked(buf, 0, 0); No call sites do this yet though. Signed-off-by: Nguyễn Thái Ngọc Duy<redacted> --- archive-tar.c | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-)Hmm, I'm not a fan of adding binary parameters to distinguish between two modes of a function. It's usually better to split it up at that point. E.g. the patch below does that and still provides the old interface, i.e. the existing callers don't need to be changed.
Good point. Then this can be merged to the next patch too.
quoted hunk ↗ jump to hunk
archive-tar.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)diff --git a/archive-tar.c b/archive-tar.c index 20af005..a2babe1 100644 --- a/archive-tar.c +++ b/archive-tar.c@@ -30,10 +30,9 @@ static void write_if_needed(void)* queues up writes, so that all our write(2) calls write exactly one * full block; pads writes to RECORDSIZE */ -static void write_blocked(const void *data, unsigned long size) +static void do_write_blocked(const void *data, unsigned long size) { const char *buf = data; - unsigned long tail; if (offset) { unsigned long chunk = BLOCKSIZE - offset;@@ -54,6 +53,12 @@ static void write_blocked(const void *data, unsigned long size)memcpy(block + offset, buf, size); offset += size; } +} + +static void finish_record(void) +{ + unsigned long tail; + tail = offset % RECORDSIZE; if (tail) { memset(block + offset, 0, RECORDSIZE - tail);@@ -62,6 +67,12 @@ static void write_blocked(const void *data, unsigned long size)write_if_needed(); } +static void write_blocked(const void *data, unsigned long size) +{ + do_write_blocked(data, size); + finish_record(); +} + /* * The end of tar archives is marked by 2*512 nul bytes and after that * follows the rest of the block (if any).
-- Duy