X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fbash.git;a=blobdiff_plain;f=unwind_prot.c;h=85a10b578c58fb1d9fefd9a00379fd2943d44b4a;hp=9e150a662aaa815b3651dcf6ee95785731d0589c;hb=HEAD;hpb=3185942a5234e26ab13fa02f9c51d340cec514f8 diff --git a/unwind_prot.c b/unwind_prot.c index 9e150a6..85a10b5 100644 --- a/unwind_prot.c +++ b/unwind_prot.c @@ -46,8 +46,9 @@ #include "command.h" #include "general.h" #include "unwind_prot.h" -#include "quit.h" #include "sig.h" +#include "quit.h" +#include "error.h" /* for internal_warning */ /* Structure describing a saved variable and the value to restore it to. */ typedef struct { @@ -240,18 +241,24 @@ unwind_frame_discard_internal (tag, ignore) char *tag, *ignore; { UNWIND_ELT *elt; + int found; + found = 0; while (elt = unwind_protect_list) { unwind_protect_list = unwind_protect_list->head.next; if (elt->head.cleanup == 0 && (STREQ (elt->arg.v, tag))) { uwpfree (elt); + found = 1; break; } else uwpfree (elt); } + + if (found == 0) + internal_warning ("unwind_frame_discard: %s: frame not found", tag); } /* Restore the value of a variable, based on the contents of SV. @@ -269,17 +276,20 @@ unwind_frame_run_internal (tag, ignore) char *tag, *ignore; { UNWIND_ELT *elt; + int found; + found = 0; while (elt = unwind_protect_list) { unwind_protect_list = elt->head.next; /* If tag, then compare. */ - if (!elt->head.cleanup) + if (elt->head.cleanup == 0) { if (tag && STREQ (elt->arg.v, tag)) { uwpfree (elt); + found = 1; break; } } @@ -293,6 +303,8 @@ unwind_frame_run_internal (tag, ignore) uwpfree (elt); } + if (tag && found == 0) + internal_warning ("unwind_frame_run: %s: frame not found", tag); } static void @@ -324,3 +336,22 @@ unwind_protect_mem (var, size) { without_interrupts (unwind_protect_mem_internal, var, (char *) &size); } + +#if defined (DEBUG) +#include + +void +print_unwind_protect_tags () +{ + UNWIND_ELT *elt; + + elt = unwind_protect_list; + while (elt) + { + unwind_protect_list = unwind_protect_list->head.next; + if (elt->head.cleanup == 0) + fprintf(stderr, "tag: %s\n", elt->arg.v); + elt = unwind_protect_list; + } +} +#endif