Blame subr.ex/ex_pkg_dispatch.subr

e9fa07
#
8d7a8a
# Copyright (c) 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 LucĂ­a Andrea Illanes Albornoz <lucia@luciaillanes.de>
e9fa07
# set +o errexit -o noglob -o nounset is assumed.
e9fa07
#
e9fa07
e9fa07
#
0903bb
# exp_pkg_dispatch_complete() - completes all disabled and finished packages
e9fa07
# @_dispatch_fn:	top-level dispatch function name
e9fa07
# @_group_names:	build group name(s)
e9fa07
# @_pkg_disabled:	list of disabled packages
e9fa07
# @_pkg_finished:	list of finished packages
e9fa07
#
99f4d8
# Returns:		zero (0) on success, non-zero (>0) on failure.
e9fa07
#
e9fa07
exp_pkg_dispatch_complete() {
e9fa07
	local	_epdc_dispatch_fn="${1}" _epdc_group_name="${2}" _epdc_pkg_disabled="${3}"	\
e9fa07
		_epdc_pkg_finished="${4}"							\
e9fa07
		_epdc_pkg_name="";
e9fa07
e9fa07
	for _epdc_pkg_name in ${_epdc_pkg_disabled}; do
e9fa07
		"${_epdc_dispatch_fn}" disabled_pkg "${_epdc_group_name}" "${_epdc_pkg_name}";
e9fa07
	done;
e9fa07
	for _epdc_pkg_name in ${_epdc_pkg_finished}; do
e9fa07
		"${_epdc_dispatch_fn}" skipped_pkg "${_epdc_group_name}" "${_epdc_pkg_name}";
e9fa07
	done;
e9fa07
e9fa07
	return 0;
e9fa07
};
e9fa07
e9fa07
#
e9fa07
# exp_pkg_dispatch_expand_packages() - expand build group name to list of packages ordered and filtered according to dependency and restart constraints
e9fa07
# @_rdisabled:		reference to out variable of disabled packages
e9fa07
# @_rfinished:		reference to out variable of finished packages
e9fa07
# @_rnames:		reference to out variable of package names
e9fa07
# @_checkfl:		enable (1) or inhibit (0) dependency expansion
e9fa07
# @_forcefl:		enable (1) or inhibit (0) forcibly rebuilding finished packages
e9fa07
# @_group_name:		build group name
e9fa07
# @_restart:		optional whitespace-separated list of package names to rebuild
e9fa07
# @_reversefl:		unfold reverse dependencies (1) or dependencies (0)
e9fa07
# @_workdir:		pathname to build-specific temporary directory
e9fa07
#
99f4d8
# Returns:		zero (0) on success, non-zero (>0) on failure.
e9fa07
#
e9fa07
exp_pkg_dispatch_expand_packages() {
e9fa07
	local	_epdep_rdisabled="${1#\$}" _epdep_rfinished="${2#\$}" _epdep_rnames="${3#\$}"	\
e9fa07
		_epdep_checkfl="${4}" _epdep_forcefl="${5}" _epdep_group_name="${6}"		\
e9fa07
		_epdep_restart="${7}" _epdep_reversefl="${8}" _epdep_workdir="${9}"		\
e9fa07
		_epdep_pkg_names="";
e9fa07
e9fa07
	eval ${_epdep_rdisabled}=;
e9fa07
	eval ${_epdep_rfinished}=;
e9fa07
	eval ${_epdep_rnames}=;
e9fa07
e9fa07
	if rtl_get_var_unsafe \$_epdep_pkg_names -u "${_epdep_group_name}_PACKAGES"\
e9fa07
	&& [ "${_epdep_pkg_names:+1}" = 1 ]; then
e9fa07
		if [ "${_epdep_reversefl:-0}" -eq 0 ]; then
e9fa07
			ex_pkg_unfold_depends							\
e9fa07
				"${_epdep_rdisabled}" "${_epdep_rfinished}"			\
e9fa07
				"${_epdep_rnames}" "${_epdep_checkfl}" "${_epdep_forcefl}"	\
e9fa07
				"${_epdep_group_name}" "${_epdep_pkg_names}"			\
e9fa07
				"${_epdep_restart}" 1 "${_epdep_workdir}";
e9fa07
		else
e9fa07
			ex_pkg_unfold_rdepends					\
e9fa07
				"${_epdep_rdisabled}" "${_epdep_rfinished}"	\
e9fa07
				"${_epdep_rnames}" "${_epdep_group_name}"	\
e9fa07
				"${_epdep_pkg_names}" "${_epdep_restart}" 1	\
e9fa07
				"${_epdep_workdir}";
e9fa07
		fi;
e9fa07
	fi;
e9fa07
e9fa07
	eval ${_epdep_rdisabled}='$(rtl_uniq2 "${_epdep_rdisabled}")';
e9fa07
	eval ${_epdep_rfinished}='$(rtl_uniq2 "${_epdep_rfinished}")';
e9fa07
	eval ${_epdep_rnames}='$(rtl_uniq2 "${_epdep_rnames}")';
e9fa07
e9fa07
	return 0;
e9fa07
};
e9fa07
e9fa07
#
e9fa07
# exp_pkg_dispatch_group() - dispatch a single build group
e9fa07
# @_rdispatch_count:		reference to inout variable of dispatcher count
e9fa07
# @_rdispatch_count_cur:	reference to inout variable of current dispatcher count
e9fa07
# @_dispatch_count_max:		maximum dispatcher count
e9fa07
# @_dispatch_group_cur:		current group
e9fa07
# @_dispatch_group_max:		maximum group
e9fa07
# @_rdispatch_njobs:		reference to inout variable of dispatcher count
e9fa07
# @_rdispatch_wait:		reference to inout variable of package names in a wait state
e9fa07
# @_rpkg_disabled:		reference to in variable of list of disabled packages
e9fa07
# @_rpkg_finished:		reference to inout variable of list of finished packages
e9fa07
# @_rpkg_names:			reference to inout variable of list of package names
e9fa07
# @_build_steps_default:	list of default build steps
e9fa07
# @_build_vars_default:		list of default build variables
e9fa07
# @_checkfl:			enable (1) or inhibit (0) dependency expansion
dad549
# @_continue_on_failfl:		continue on failed package build (1) or break (0)
e9fa07
# @_dispatch_fn:		top-level dispatch function name
e9fa07
# @_group_name:			build group name
e9fa07
# @_njobs_max:			maximum count of simultaneous jobs
e9fa07
# @_pipe_path:			pathname to build FIFO
e9fa07
# @_restart_at:			optional comma-separated list of build steps at which to rebuild or ALL or LAST
e9fa07
# @_workdir:			pathname to build-specific temporary directory
e9fa07
#
99f4d8
# Returns:			zero (0) on success, non-zero (>0) on failure.
e9fa07
#
e9fa07
exp_pkg_dispatch_group() {
e9fa07
	local	_epdg_rdispatch_count="${1#\$}" _epdg_rdispatch_count_cur="${2#\$}" _epdg_dispatch_count_max="${3#\$}"	\
e9fa07
		_epdg_dispatch_group_cur="${4#\$}" _epdg_dispatch_group_max="${5#\$}" _epdg_rdispatch_njobs="${6#\$}"	\
e9fa07
		_epdg_rdispatch_wait="${7#\$}" _epdg_rpkg_disabled="${8#\$}" _epdg_rpkg_finished="${9#\$}"		\
e9fa07
		_epdg_rpkg_names="${10#\$}" _epdg_build_steps_default="${11}" _epdg_build_vars_default="${12}"		\
dad549
		_epdg_checkfl="${13}" _epdg_continue_on_failfl="${14}" _epdg_dispatch_fn="${15}"			\
dad549
		_epdg_group_name="${16}" _epdg_njobs_max="${17}" _epdg_pipe_path="${18}" _epdg_restart_at="${19}"	\
dad549
		_epdg_workdir="${20}"											\
e9fa07
		_epdg_perc_group=0 _epdg_perc_pkg=0 _epdg_pipe_msg="" _epdg_pkg_name="" _epdg_rc=0;
e9fa07
e9fa07
	rtl_fileop mkfifo "${_epdg_pipe_path}";
e9fa07
	while true; do
e9fa07
		while eval [ \"\${${_epdg_rdispatch_njobs}:-0}\" -gt 0 ]\
e9fa07
		   && read _epdg_pipe_msg;
e9fa07
		do
e9fa07
e9fa07
		case "${_epdg_pipe_msg%% *}" in
e9fa07
e9fa07
		done)	_epdg_pkg_name="${_epdg_pipe_msg#done * }";
e9fa07
			eval : '$(('${_epdg_rdispatch_count_cur}'+=1))';
e9fa07
			eval : '$(('${_epdg_rdispatch_njobs}'-=1))';
e9fa07
e9fa07
			rtl_lconcat "${_epdg_rpkg_finished}" "${_epdg_pkg_name}";
e9fa07
			rtl_percentage2 \$_epdg_dispatch_group_cur \$_epdg_dispatch_group_max \$_epdg_perc_group;
e9fa07
			rtl_percentage2 "${_epdg_rdispatch_count_cur}" \$_epdg_dispatch_count_max \$_epdg_perc_pkg;
e9fa07
e9fa07
			"${_epdg_dispatch_fn}"				\
e9fa07
				finish_pkg ${_epdg_pipe_msg#done }	\
e9fa07
				"${_epdg_dispatch_count_max}"		\
e9fa07
				"${_epdg_perc_group}" "${_epdg_perc_pkg}";
e9fa07
e9fa07
			rtl_lfilter "${_epdg_rpkg_names}" "${_epdg_pkg_name}";
e9fa07
			rtl_lfilter "${_epdg_rdispatch_wait}" "${_epdg_pkg_name}";
e9fa07
dad549
			if eval [ \"\${${_epdg_rpkg_names}:+1}\" = 1 ]; then
e9fa07
				if eval [ \"\${${_epdg_rdispatch_njobs}:-0}\" -ne \"\${_epdg_njobs_max}\" ]; then
e9fa07
					exp_pkg_dispatch_packages					\
e9fa07
						"${_epdg_rdispatch_count}"				\
e9fa07
						"${_epdg_rdispatch_count_cur}"				\
e9fa07
						"${_epdg_dispatch_count_max}"				\
e9fa07
						"${_epdg_dispatch_group_cur}"				\
e9fa07
						"${_epdg_dispatch_group_max}"				\
e9fa07
						"${_epdg_rdispatch_njobs}"				\
e9fa07
						"${_epdg_rdispatch_wait}"				\
e9fa07
						"${_epdg_rpkg_disabled}"				\
e9fa07
						"${_epdg_rpkg_finished}" "${_epdg_rpkg_names}"		\
e9fa07
						"${_epdg_build_steps_default}"				\
e9fa07
						"${_epdg_build_vars_default}" "${_epdg_checkfl}"	\
e9fa07
						"${_epdg_dispatch_fn}" "${_epdg_group_name}"		\
e9fa07
						"${_epdg_njobs_max}" "${_epdg_pipe_path}"		\
e9fa07
						"${_epdg_restart_at}" "${_epdg_workdir}";
e9fa07
				fi;
e9fa07
			elif eval [ \"\${${_epdg_rdispatch_njobs}:-0}\" -eq 0 ]; then
e9fa07
				break;
e9fa07
			fi;
e9fa07
			;;
e9fa07
dad549
		fail)	_epdg_pkg_name="${_epdg_pipe_msg#fail * }";
dad549
			eval : '$(('${_epdg_rdispatch_njobs}'-=1))';
e9fa07
			_epdg_rc=1;
dad549
			rtl_lfilter "${_epdg_rpkg_names}" "${_epdg_pkg_name}";
e9fa07
			"${_epdg_dispatch_fn}"				\
e9fa07
				fail_pkg ${_epdg_pipe_msg#fail }	\
e9fa07
				"${_epdg_dispatch_count_max}";
0d65f3
0d65f3
			if [ "${_epdg_rc}" -ne 0 ]\
0d65f3
			&& [ "${_epdg_continue_on_failfl}" -ne 1 ]; then
0d65f3
				break;
0d65f3
			fi;
e9fa07
			;;
e9fa07
e9fa07
		msg_pkg)
e9fa07
			"${_epdg_dispatch_fn}" msg_pkg ${_epdg_pipe_msg#msg_pkg };
e9fa07
			;;
e9fa07
e9fa07
		step)	"${_epdg_dispatch_fn}" step_pkg ${_epdg_pipe_msg#step };
e9fa07
			;;
e9fa07
e9fa07
		esac; done <>"${_epdg_pipe_path}";
e9fa07
dad549
		if [ "${_epdg_rc}" -ne 0 ]\
dad549
		&& [ "${_epdg_continue_on_failfl}" -ne 1 ]; then
dad549
			break;
dad549
		elif eval [ \"\${${_epdg_rpkg_names}:+1}\" = 1 ]; then
e9fa07
			if eval [ \"\${${_epdg_rdispatch_njobs}:-0}\" -ne \"\${_epdg_njobs_max}\" ]; then
e9fa07
				exp_pkg_dispatch_packages					\
e9fa07
					"${_epdg_rdispatch_count}"				\
e9fa07
					"${_epdg_rdispatch_count_cur}"				\
e9fa07
					"${_epdg_dispatch_count_max}"				\
e9fa07
					"${_epdg_dispatch_group_cur}"				\
e9fa07
					"${_epdg_dispatch_group_max}"				\
e9fa07
					"${_epdg_rdispatch_njobs}"				\
e9fa07
					"${_epdg_rdispatch_wait}"				\
e9fa07
					"${_epdg_rpkg_disabled}"				\
e9fa07
					"${_epdg_rpkg_finished}" "${_epdg_rpkg_names}"		\
e9fa07
					"${_epdg_build_steps_default}"				\
e9fa07
					"${_epdg_build_vars_default}" "${_epdg_checkfl}"	\
e9fa07
					"${_epdg_dispatch_fn}" "${_epdg_group_name}"		\
e9fa07
					"${_epdg_njobs_max}" "${_epdg_pipe_path}"		\
e9fa07
					"${_epdg_restart_at}" "${_epdg_workdir}";
e9fa07
			fi;
e9fa07
		elif eval [ \"\${${_epdg_rdispatch_njobs}:-0}\" -eq 0 ]; then
e9fa07
			break;
e9fa07
		fi;
e9fa07
	done;
e9fa07
e9fa07
	rtl_fileop rm "${_epdg_pipe_path}";
e9fa07
e9fa07
	return "${_epdg_rc}";
e9fa07
};
e9fa07
e9fa07
#
e9fa07
# exp_pkg_dispatch_packages() - dispatch set of packages
e9fa07
# @_rdispatch_count:		reference to inout variable of dispatcher count
e9fa07
# @_dispatch_count_cur:		current dispatcher count
e9fa07
# @_dispatch_count_max:		maximum dispatcher count
e9fa07
# @_dispatch_group_cur:		current group
e9fa07
# @_dispatch_group_max:		maximum group
e9fa07
# @_rdispatch_njobs:		reference to inout variable of dispatcher count
e9fa07
# @_rdispatch_wait:		reference to inout variable of package names in a wait state
e9fa07
# @_rpkg_disabled:		reference to in variable of list of disabled packages
e9fa07
# @_rpkg_finished:		reference to inout variable of list of finished packages
e9fa07
# @_rpkg_names:			reference to inout variable of list of package names
e9fa07
# @_build_steps_default:	list of default build steps
e9fa07
# @_build_vars_default:		list of default build variables
e9fa07
# @_checkfl:			enable (1) or inhibit (0) dependency expansion
e9fa07
# @_dispatch_fn:		top-level dispatch function name
e9fa07
# @_group_name:			build group name
e9fa07
# @_njobs_max:			maximum count of simultaneous jobs
e9fa07
# @_pipe_path:			pathname to parent-child process FIFO
e9fa07
# @_restart_at:			optional comma-separated list of build steps at which to rebuild or ALL or LAST
e9fa07
# @_workdir:			pathname to build-specific temporary directory
e9fa07
#
99f4d8
# Returns:			zero (0) on success, non-zero (>0) on failure.
e9fa07
#
e9fa07
exp_pkg_dispatch_packages() {
e9fa07
	local	_epdp2_rdispatch_count="${1#\$}" _epdp2_dispatch_count_cur="${2}" _epdp2_dispatch_count_max="${3}"	\
e9fa07
		_epdp2_dispatch_group_cur="${4}" _epdp2_dispatch_group_max="${5}" _epdp2_rdispatch_njobs="${6#\$}"	\
e9fa07
		_epdp2_rdispatch_wait="${7#\$}" _epdp2_rpkg_disabled="${8#\$}" _epdp2_rpkg_finished="${9#\$}"		\
e9fa07
		_epdp2_rpkg_names="${10#\$}" _epdp2_build_steps_default="${11}" _epdp2_build_vars_default="${12}"	\
e9fa07
		_epdp2_checkfl="${13}" _epdp2_dispatch_fn="${14}" _epdp2_group_name="${15}" _epdp2_njobs_max="${16}"	\
e9fa07
		_epdp2_pipe_path="${17}" _epdp2_restart_at="${18}" _epdp2_workdir="${19}"				\
e9fa07
		_epdp2_foundfl=0 _epdp2_njob=0 _epdp2_pkg_depends="" _epdp2_pkg_name="";
e9fa07
e9fa07
	while eval [ \"\${${_epdp2_rdispatch_njobs}}\" -lt \"\${_epdp2_njobs_max}\" ]; do
e9fa07
		_epdp2_foundfl=0;
e9fa07
		eval _epdp2_pkg_names="\${${_epdp2_rpkg_names}}";
e9fa07
		for _epdp2_pkg_name in ${_epdp2_pkg_names}; do
e9fa07
			if ! rtl_lmatch "${_epdp2_rdispatch_wait}" "${_epdp2_pkg_name}"\
e9fa07
			&& ex_pkg_check_depends						\
e9fa07
					"${_epdp2_checkfl}" "${_epdp2_rpkg_disabled}"	\
e9fa07
					"${_epdp2_rpkg_finished}" "${_epdp2_pkg_name}"	\
e9fa07
					"${_epdp2_rpkg_names}" "${_epdp2_workdir}";
e9fa07
			then
e9fa07
				ex_pkg_exec								\
e9fa07
					"${_epdp2_rdispatch_count}"					\
e9fa07
					"${_epdp2_dispatch_count_cur}" "${_epdp2_dispatch_count_max}"	\
e9fa07
					"${_epdp2_dispatch_group_cur}" "${_epdp2_dispatch_group_max}"	\
e9fa07
					"${_epdp2_rdispatch_njobs}" "${_epdp2_rdispatch_wait}"		\
e9fa07
					"${_epdp2_build_steps_default}"					\
e9fa07
					"${_epdp2_build_vars_default}" "${_epdp2_dispatch_fn}"		\
e9fa07
					"${_epdp2_group_name}" "${_epdp2_pipe_path}"			\
e9fa07
					"${_epdp2_pkg_name}" "${_epdp2_restart_at}"			\
e9fa07
					"${_epdp2_workdir}";
e9fa07
				_epdp2_foundfl=1; break;
e9fa07
			fi;
e9fa07
		done;
e9fa07
e9fa07
		if [ "${_epdp2_foundfl:-0}" -eq 0 ]; then
e9fa07
			break;
e9fa07
		fi;
e9fa07
	done;
e9fa07
e9fa07
	return "${_epdp2_foundfl}";
e9fa07
};
e9fa07
e9fa07
#
e9fa07
# ex_pkg_dispatch() - dispatch a set of build group
e9fa07
# @_rdispatch_wait:		reference to out variable of package names in a wait state
e9fa07
# @_build_steps_default:	list of default build steps
e9fa07
# @_build_vars_default:		list of default build variables
dad549
# @_continue_on_failfl:		continue on failed package build (1) or break (0)
e9fa07
# @_dispatch_fn:		top-level dispatch function name
e9fa07
# @_group_names:		build group name(s)
e9fa07
# @_groups_inhibit_deps:	inhibit group-group dependency expansion
e9fa07
# @_njobs_max:			maximum count of simultaneous jobs
e9fa07
# @_pipe_path:			pathname to build FIFO
e9fa07
# @_restart:			optional whitespace-separated list of package names to rebuild
e9fa07
# @_restart_at:			optional comma-separated list of build steps at which to rebuild or ALL or LAST
e9fa07
# @_restart_recursive:		optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
e9fa07
# @_workdir:			pathname to build-specific temporary directory
e9fa07
#
99f4d8
# Returns:			zero (0) on success, non-zero (>0) on failure.
e9fa07
#
e9fa07
ex_pkg_dispatch() {
e9fa07
	local	_epd_rdispatch_wait="${1#\$}" _epd_build_steps_default="${2}" _epd_build_vars_default="${3}"		\
dad549
		_epd_continue_on_failfl="${4}" _epd_dispatch_fn="${5}" _epd_group_names="${6}"				\
dad549
		_epd_groups_inhibit_deps="${7}" _epd_njobs_max="${8}" _epd_pipe_path="${9}" _epd_restart="${10}"	\
dad549
		_epd_restart_at="${11}" _epd_restart_recursive="${12}" _epd_workdir="${13}"				\
e9fa07
		_epd_checkfl=1 _epd_forcefl=0 _epd_perc_group=0								\
e9fa07
		_epd_pkg_disabled="" _epd_pkg_finished="" _epd_pkg_names="" _epd_pkg_name=""				\
e9fa07
		_epd_pkg_dispatch_count=0 _epd_pkg_dispatch_count_cur=0 _epd_pkg_dispatch_count_max=0			\
e9fa07
		_epd_pkg_dispatch_group_cur=0 _epd_pkg_dispatch_group_max=0						\
e9fa07
		_epd_pkg_dispatch_njobs=0										\
e9fa07
		_epd_rc=0 _epd_reversefl=0;
e9fa07
e9fa07
	case "${_epd_groups_inhibit_deps:-0}" in
e9fa07
	0)	rtl_lunfold_depends '${_rld_name}_GROUP_DEPENDS' \$_epd_group_names ${_epd_group_names};
e9fa07
		_epd_group_names="$(rtl_uniq2 \$_epd_group_names)";
e9fa07
	esac;
e9fa07
e9fa07
	if [ "${_epd_restart:+1}" = 1 ]; then
e9fa07
		case "${_epd_restart_recursive:-0}" in
e9fa07
		0)	_epd_checkfl=0; _epd_forcefl=0; _epd_reversefl=0; ;;
e9fa07
		1)	_epd_checkfl=1; _epd_forcefl=0; _epd_reversefl=0; ;;
e9fa07
		2)	_epd_checkfl=1; _epd_forcefl=1; _epd_reversefl=0; ;;
e9fa07
		3)	_epd_checkfl=1; _epd_forcefl=1; _epd_reversefl=1; ;;
e9fa07
		esac;
e9fa07
	fi;
e9fa07
e9fa07
	rtl_llength \$_epd_pkg_dispatch_group_max \$_epd_group_names;
e9fa07
e9fa07
	for _epd_group_name in ${_epd_group_names}; do
e9fa07
		_epd_pkg_disabled="";
e9fa07
		_epd_pkg_finished="";
e9fa07
		_epd_pkg_names="";
e9fa07
		eval ${_epd_rdispatch_wait}=;
e9fa07
		_epd_pkg_dispatch_count=0;
e9fa07
		_epd_pkg_dispatch_count_cur=0;
e9fa07
		_epd_pkg_dispatch_count_max=0;
e9fa07
		_epd_pkg_dispatch_njobs=0;
e9fa07
e9fa07
		rtl_percentage "${_epd_pkg_dispatch_group_cur}" "${_epd_pkg_dispatch_group_max}" \$_epd_perc_group;
e9fa07
e9fa07
		if "${_epd_dispatch_fn}"				\
e9fa07
				start_group "${_epd_group_name}"	\
e9fa07
				"" "${_epd_pkg_dispatch_group_cur}"	\
e9fa07
				"${_epd_pkg_dispatch_group_max}"	\
e9fa07
				"${_epd_perc_group}";
e9fa07
		then
e9fa07
			if rtl_fileop mkdir "${_epd_workdir}"\
e9fa07
			&& rtl_log_msg "verbose" "${MSG_build_resolving_deps}" "${_epd_group_name}"\
e9fa07
			&& exp_pkg_dispatch_expand_packages			\
e9fa07
					\$_epd_pkg_disabled \$_epd_pkg_finished	\
e9fa07
					\$_epd_pkg_names "${_epd_checkfl}"	\
e9fa07
					"${_epd_forcefl}" "${_epd_group_name}"	\
e9fa07
					"${_epd_restart}" "${_epd_reversefl}"	\
e9fa07
					"${_epd_workdir}"			\
e9fa07
			&& exp_pkg_dispatch_complete					\
e9fa07
					"${_epd_dispatch_fn}" "${_epd_group_name}"	\
e9fa07
					"${_epd_pkg_disabled}" "${_epd_pkg_finished}"	\
e9fa07
			&& rtl_log_msg "verbose" "${MSG_build_resolved_deps}" "${_epd_group_name}"\
e9fa07
			&& rtl_llength \$_epd_pkg_dispatch_count_max \$_epd_pkg_names\
e9fa07
			&& [ "${_epd_pkg_dispatch_count_max}" -gt 0 ];
e9fa07
			then
e9fa07
				exp_pkg_dispatch_group								\
e9fa07
					\$_epd_pkg_dispatch_count \$_epd_pkg_dispatch_count_cur			\
e9fa07
					"${_epd_pkg_dispatch_count_max}"					\
e9fa07
					"${_epd_pkg_dispatch_group_cur}" "${_epd_pkg_dispatch_group_max}"	\
e9fa07
					\$_epd_pkg_dispatch_njobs "${_epd_rdispatch_wait}"			\
e9fa07
					\$_epd_pkg_disabled \$_epd_pkg_finished \$_epd_pkg_names		\
e9fa07
					"${_epd_build_steps_default}" "${_epd_build_vars_default}"		\
dad549
					"${_epd_checkfl}" "${_epd_continue_on_failfl}" "${_epd_dispatch_fn}"	\
dad549
					"${_epd_group_name}" "${_epd_njobs_max}" "${_epd_pipe_path}"		\
dad549
					"${_epd_restart_at}" "${_epd_workdir}";
e9fa07
				_epd_rc="${?}";
e9fa07
			fi;
e9fa07
e9fa07
			: $((_epd_pkg_dispatch_group_cur+=1));
e9fa07
			rtl_percentage "${_epd_pkg_dispatch_group_cur}" "${_epd_pkg_dispatch_group_max}" \$_epd_perc_group;
e9fa07
e9fa07
			"${_epd_dispatch_fn}"				\
e9fa07
				finish_group "${_epd_group_name}"	\
e9fa07
				"" "${_epd_pkg_dispatch_group_cur}"	\
e9fa07
				"${_epd_pkg_dispatch_group_max}"	\
e9fa07
				"${_epd_perc_group}";
e9fa07
			if [ "${_epd_rc}" -ne 0 ]; then
e9fa07
				break;
e9fa07
			fi;
e9fa07
		fi;
e9fa07
	done;
e9fa07
e9fa07
	return "${_epd_rc}";
e9fa07
};
e9fa07
670f66
#
670f66
# ex_pkg_dipatch_send() - send message from dispatcher child process to dispatcher parent process across FIFO
670f66
# @_op:		message operation string
670f66
#
99f4d8
# Returns:	zero (0) invariably.
670f66
#
670f66
ex_pkg_dispatch_send() {
670f66
	local _epds_op="${1}";
670f66
	shift 1;
670f66
670f66
	trap '' PIPE;
670f66
	while ! printf "%s%s\n" "${_epds_op}" "${*:+ "${*}"}" 1>&3 2>/dev/null; do
670f66
		:;
670f66
	done;
670f66
	trap - PIPE;
670f66
670f66
	return 0;
670f66
};
670f66
e9fa07
# vim:filetype=sh textwidth=0