[pacman-dev] [PATCH] [RFC] makepkg: extract sources in parallel

Dan McGee dan at archlinux.org
Fri Apr 22 18:04:29 EDT 2011


This one could definitely benefit from limiting the number of parallel
threads, especially when dealing with the GCC PKGBUILD. Definitely a lot
of contention and times varied from twice as fast to a few seconds
slower, depending on if the cache decided it needed to flush out some
data. Limiting the number of threads to the number of CPUs would
probably go a long way to resolving some of this contention for IO
bandwidth.

Signed-off-by: Dan McGee <dan at archlinux.org>
---
 scripts/makepkg.sh.in |   23 ++++++++++++++++++-----
 1 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 92b7597..b9588a1 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -692,6 +692,8 @@ check_checksums() {
 extract_sources() {
 	msg "$(gettext "Extracting Sources...")"
 	local netfile
+	local -a jobs
+	local job
 	for netfile in "${source[@]}"; do
 		local file=$(get_filename "$netfile")
 		if in_array "$file" ${noextract[@]}; then
@@ -732,15 +734,26 @@ extract_sources() {
 				fi ;;
 		esac
 
-		local ret=0
 		msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
 		if [[ $cmd = bsdtar ]]; then
-			$cmd -xf "$file" || ret=$?
+			(
+				$cmd -xf "$file"
+			) &
+			job=$!
 		else
-			rm -f "${file%.*}"
-			$cmd -dcf "$file" > "${file%.*}" || ret=$?
+			(
+				rm -f "${file%.*}"
+				$cmd -dcf "$file" > "${file%.*}"
+			) &
+			job=$!
 		fi
-		if (( ret )); then
+		# push job id onto jobs stack
+		jobs[${#jobs[@]}]=$job
+	done
+
+	for job in ${jobs[@]}; do
+		wait $job
+		if (( $? )); then
 			error "$(gettext "Failed to extract %s")" "$file"
 			plain "$(gettext "Aborting...")"
 			exit 1
-- 
1.7.4.4



More information about the pacman-dev mailing list