aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorMaxim Sobolev <sobomax@FreeBSD.org>2002-09-09 06:00:16 +0000
committerMaxim Sobolev <sobomax@FreeBSD.org>2002-09-09 06:00:16 +0000
commit301ca7cf8437b27cd34a044fa4c95f253be93412 (patch)
treed699f471f67b30bb513f6f4f3b4aa765da835866 /contrib
parent86eedb4ef4100dce6516d476912b4cf4004929a2 (diff)
downloadsrc-301ca7cf8437b27cd34a044fa4c95f253be93412.tar.gz
src-301ca7cf8437b27cd34a044fa4c95f253be93412.zip
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
Notes
Notes: svn path=/head/; revision=103115
Diffstat (limited to 'contrib')
-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 d20f5aa2d169..2749aadecde6 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 */