Whamcloud - gitweb
LU-1199 build: Clean out the build directory
[fs/lustre-release.git] / contrib / lbuild / exit_traps.sh
diff --git a/contrib/lbuild/exit_traps.sh b/contrib/lbuild/exit_traps.sh
new file mode 100644 (file)
index 0000000..9be8212
--- /dev/null
@@ -0,0 +1,105 @@
+#!/bin/bash
+
+# a framework for stacking EXIT traps
+# this could, should be further enhanced to allow stacks of traps for various
+# exits.  but right now it's hard-coded for EXIT traps
+
+exit_actions=()
+
+push_exit_trap() {
+    local action="$1"
+    local trap_handle="$2"
+
+    local var="exit_trap_handle_$trap_handle"
+
+    if [ -n "${!var}" ]; then
+        echo "fail!  trap handle $trap_handle is already in use"
+        return 1
+    fi
+
+    local num_items=${#exit_actions[@]}
+    exit_actions[$num_items]="$action"
+    eval $var="$num_items"
+
+    return 0
+
+}
+
+delete_exit_trap() {
+    local trap_handles="$@"
+
+    local handle
+    for handle in $trap_handles; do
+        local var="exit_trap_handle_$handle"
+        local trap_num=${!var}
+        exit_actions[$trap_num]=""
+        eval unset $var
+    done
+}
+
+print_exit_traps() {
+
+    local i num_items=${#exit_actions[@]}
+    for i in $(seq 0 $((num_items-1))); do
+        if [ -z "${exit_actions[$i]}" ]; then
+            continue
+        fi
+        echo "${exit_actions[$i]}"
+    done
+
+}
+
+run_exit_traps() {
+
+    local i num_items=${#exit_actions[@]}
+    for i in $(seq $((num_items-1)) -1 0); do
+        if [ -z "${exit_actions[$i]}" ]; then
+            continue
+        fi
+        eval ${exit_actions[$i]}
+    done
+
+}
+
+trap run_exit_traps EXIT
+
+if [ "$1" = "unit_test" ]; then
+    if ! push_exit_trap "echo \"this is the first trap\"" "a"; then
+        echo "failed to install trap 1"
+        exit 1
+    fi
+    if ! push_exit_trap "echo \"this is the second trap\"" "b"; then
+        echo "failed to install trap 2"
+        exit 2
+    fi
+    delete_exit_trap "b"
+    if ! push_exit_trap "echo \"this is the third trap\"" "b"; then
+        echo "failed to install trap 3"
+        exit 3
+    fi
+    
+    # to see the traps
+    print_exit_traps
+    echo "------------"
+
+    delete_exit_trap "a" "b"
+    print_exit_traps
+    echo "------------"
+   
+    if ! push_exit_trap "echo \"this is the first trap\"" "a"; then
+        echo "failed to install trap 1"
+        exit 1
+    fi
+    if ! push_exit_trap "echo \"this is the second trap\"" "b"; then
+        echo "failed to install trap 2"
+        exit 2
+    fi
+    if ! push_exit_trap "echo \"this is the third trap\"" "c"; then
+        echo "failed to install trap 3"
+        exit 3
+    fi
+    delete_exit_trap "a" "c"
+
+    print_exit_traps
+    echo "------------"
+fi