2 # SPDX-License-Identifier: GPL-2.0
4 # map[(scope_id,track,cleanup_id) -> cleanup_command]
5 # track={d=default | p=priority}
6 declare -A __DEFER__JOBS
8 # map[(scope_id,track) -> # cleanup_commands]
9 declare -A __DEFER__NJOBS
11 # scope_id of the topmost scope.
18 echo $__DEFER__SCOPE_ID,$track
24 local defer_ix=$1; shift
26 echo $__DEFER__SCOPE_ID,$track,$defer_ix
33 echo ${__DEFER__NJOBS[$(__defer__ndefer_key $track)]}
39 local defer_ix=$1; shift
40 local defer_key=$(__defer__defer_key $track $defer_ix)
42 ${__DEFER__JOBS[$defer_key]}
43 unset __DEFER__JOBS[$defer_key]
49 local ndefers=$(__defer__ndefers $track)
50 local ndefers_key=$(__defer__ndefer_key $track)
51 local defer_key=$(__defer__defer_key $track $ndefers)
54 __DEFER__JOBS[$defer_key]="$defer"
55 __DEFER__NJOBS[$ndefers_key]=$((ndefers + 1))
60 __DEFER__NJOBS[$(__defer__ndefer_key d)]=0
61 __DEFER__NJOBS[$(__defer__ndefer_key p)]=0
66 ((__DEFER__SCOPE_ID++))
74 for ((defer_ix=$(__defer__ndefers p); defer_ix-->0; )); do
75 __defer__run p $defer_ix
78 for ((defer_ix=$(__defer__ndefers d); defer_ix-->0; )); do
79 __defer__run d $defer_ix
83 ((__DEFER__SCOPE_ID--))
88 __defer__schedule d "$@"
93 __defer__schedule p "$@"
96 defer_scopes_cleanup()
98 while ((__DEFER__SCOPE_ID >= 0)); do