From b92c3df242f9a99cb628336e2096a4716cdabc1e Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Thu, 7 Jul 2022 20:00:46 +0200 Subject: [PATCH] test: allow multiple handlers for the EXIT signal Bash allows only one handler per signal, so let's overcome this limitation by having one dedicated EXIT signal which runs all registered handlers from all over the place. --- test/test-functions | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/test/test-functions b/test/test-functions index acb09c20be0..5ca3ccfa846 100644 --- a/test/test-functions +++ b/test/test-functions @@ -60,6 +60,33 @@ get_bool() { fi } +# Since in Bash we can have only one handler per signal, let's overcome this +# limitation by having one global handler for the EXIT signal which executes +# all registered handlers +_AT_EXIT_HANDLERS=() +_at_exit() { + set +e + + # Run the EXIT handlers in reverse order + for ((i = ${#_AT_EXIT_HANDLERS[@]} - 1; i >= 0; i--)); do + ddebug "Running EXIT handler '${_AT_EXIT_HANDLERS[$i]}'" + "${_AT_EXIT_HANDLERS[$i]}" + done +} + +trap _at_exit EXIT + +add_at_exit_handler() { + local handler="${1?}" + + if [[ "$(type -t "$handler")" != "function" ]]; then + dfatal "'$handler' is not a function" + exit 1 + fi + + _AT_EXIT_HANDLERS+=("$handler") +} + # Decide if we can (and want to) run qemu with KVM acceleration. # Check if nested KVM is explicitly enabled (TEST_NESTED_KVM). If not, # check if it's not explicitly disabled (TEST_NO_KVM) and we're not already @@ -1238,7 +1265,7 @@ cleanup_loopdev() { fi } -trap cleanup_loopdev EXIT INT QUIT PIPE +add_at_exit_handler cleanup_loopdev create_empty_image() { if [ -z "${IMAGE_NAME:=}" ]; then