-
Notifications
You must be signed in to change notification settings - Fork 0
/
parex.inc
80 lines (73 loc) · 1.55 KB
/
parex.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
set +H
declare -i CPU_KERNELS=$(fgrep -c processor /proc/cpuinfo)
declare -i MAX_TASKS=${MAX_TASKS:-$CPU_KERNELS}
FL_CLEVER_TASK=0
declare -A TASKS_QUEUE=()
unset wait4_cpu_free push_task
rotate_tq () {
declare -i taskPID flTaskGone=0
for taskPID in ${!TASKS_QUEUE[@]}; do
[[ -f /proc/$taskPID/cmdline ]] 2>/dev/null || {
flTaskGone=1
unset TASKS_QUEUE[$taskPID]
}
done
return $flTaskGone
}
wait4_cpu_free () {
if (( FL_CLEVER_TASK )); then
wait ${!TASKS_QUEUE[@]}
else
while :; do
rotate_tq || break
sleep 0.01
done
fi
return 0
}
push_task () {
local taskPID pthInclude flUseEval=0 flCleverTask=0
while [[ $@ ]]; do
case $1 in
-e) flUseEval=1 ;;
-c) flCleverTask=1 ;;
-f) shift; pthInclude="$1"
[[ -r $pthInclude ]] || { echo 'Invalid include file' >&2; return 101; }
;;
*) echo 'Unknown parameter specified' >&2; return 1 ;;
esac
shift
done
# echo "PID_QUEUE=${!TASKS_QUEUE[@]}"
if (( ${#TASKS_QUEUE[@]} )); then
rotate_tq
if (( ${#TASKS_QUEUE[@]} >= MAX_TASKS )); then
if (( flCleverTask )); then
wait
else
wait4_cpu_free
fi
fi
fi
if (( flUseEval )); then
eval "$(cat -)" &
elif [[ $pthInclude ]]; then
source "$pthInclude" &
else
source <(cat -) &
fi
taskPID=$!
[[ -f /proc/$taskPID/cmdline ]] && \
TASKS_QUEUE[$taskPID]="$(</proc/$taskPID/cmdline)"
return $?
}
wait4_all_gone () {
declare -i taskPID errc=0
(( ${#TASKS_QUEUE[@]} )) || return 0
for taskPID in ${!TASKS_QUEUE[@]}; do
wait $taskPID
errc+=$?
unset TASKS_QUEUE[$taskPID]
done
return $errc
}