From a8edc611cd84bd5446707624470c51617d314bab Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 13 Apr 2022 07:16:26 -0600 Subject: [PATCH] bash done 53 lines --- src/bash.sh | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/bash.sh diff --git a/src/bash.sh b/src/bash.sh new file mode 100644 index 0000000..83679de --- /dev/null +++ b/src/bash.sh @@ -0,0 +1,63 @@ +#! /bin/bash + +main() { + set -e + set -o pipefail + + cleanup() { + if jobs -p | grep -q .; then + kill -9 $(jobs -p) &> /dev/null + fi + } + trap cleanup EXIT + + export _D="$(mktemp -d)" + export _P=3 + export _N=100 + + for i in $(seq 0 $((_P-1))); do + mkfifo "$_D/pipe.$i" + done + + scatter + gather + + rm -rf "$_D" +} + +scatter() { + for i in $(seq 0 $((_P-1))); do + _scatter $i & + done +} + +_scatter() { + local i="$1" + local chunk=$((_N/_P)) + local start=$((chunk*i)) + if ((i==_P-1)); then + chunk=$((chunk+_N%_P)) + fi + local result=0 + for j in $(seq $start $((start+chunk))); do + ((result+=j)) || true + done + echo "> _scatter $i processing $start..$((start+chunk)) found $result" >&2 + echo $result > "$_D/pipe.$i" +} + +gather() { + echo "> gather..." >&2 + local ttl=0 + for f in "$_D"/pipe.*; do + echo "> cat $f" >&2 + ttl=$((ttl+$(timeout 1 cat "$f" || echo 0))) + done + echo "> wait" >&2 + wait + echo "> /gather $ttl" >&2 +} + +if [ "$0" == "$BASH_SOURCE" ]; then + main "$@" +fi