summaryrefslogtreecommitdiffstats
path: root/contrib/tar/src
diff options
context:
space:
mode:
authorsobomax <sobomax@FreeBSD.org>2002-09-09 06:00:16 +0000
committersobomax <sobomax@FreeBSD.org>2002-09-09 06:00:16 +0000
commitb482de8733d843345f5cdc15a562499d003aae20 (patch)
treed699f471f67b30bb513f6f4f3b4aa765da835866 /contrib/tar/src
parentc80d532f6e49f79741bc565274a904f6e39ae87e (diff)
downloadFreeBSD-src-b482de8733d843345f5cdc15a562499d003aae20.zip
FreeBSD-src-b482de8733d843345f5cdc15a562499d003aae20.tar.gz
In the --fast-read mode send SIGTERM to decompressor once we have extracted
all files we have been asked for. This vastly improves performance of pkg_add(1), because usually it only extract +CONTENTS file in --fast-read mode, checks it and only then extracts full content of tarball in normal mode. Without this patch, it have had to decompress the tarball twice, effectively doubling consumed CPU time. MFC after: 1 week
Diffstat (limited to 'contrib/tar/src')
-rw-r--r--contrib/tar/src/buffer.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/contrib/tar/src/buffer.c b/contrib/tar/src/buffer.c
index d20f5aa..2749aad 100644
--- a/contrib/tar/src/buffer.c
+++ b/contrib/tar/src/buffer.c
@@ -1332,6 +1332,9 @@ close_archive (void)
might become clever enough to just stop working, once there is no more
work to do, we might have to revise this area in such time. */
+ if (fast_read_option && namelist_freed)
+ kill(child_pid, SIGTERM);
+
if (access_mode == ACCESS_READ
&& ! _isrmt (archive)
&& (S_ISFIFO (archive_stat.st_mode) || S_ISSOCK (archive_stat.st_mode)))
@@ -1358,12 +1361,13 @@ close_archive (void)
break;
}
- if (WIFSIGNALED (wait_status))
- ERROR ((0, 0, _("Child died with signal %d"),
- WTERMSIG (wait_status)));
- else if (WEXITSTATUS (wait_status) != 0)
- ERROR ((0, 0, _("Child returned status %d"),
- WEXITSTATUS (wait_status)));
+ if (!fast_read_option || !namelist_freed)
+ if (WIFSIGNALED (wait_status))
+ ERROR ((0, 0, _("Child died with signal %d"),
+ WTERMSIG (wait_status)));
+ else if (WEXITSTATUS (wait_status) != 0)
+ ERROR ((0, 0, _("Child returned status %d"),
+ WEXITSTATUS (wait_status)));
}
#endif /* !MSDOS */
OpenPOWER on IntegriCloud