diff options
author | Tom Tromey <tom@tromey.com> | 2019-01-24 09:56:49 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-03-06 16:04:31 -0700 |
commit | fe7b42e5843ef82f97959e0e18122c164449a8ea (patch) | |
tree | 9324d78cdb2e523c04fc6556882c21280606132f /gdb/common | |
parent | c6321f19c5414c2a34db3cf5979834d081c32abd (diff) | |
download | gdb-fe7b42e5843ef82f97959e0e18122c164449a8ea.zip gdb-fe7b42e5843ef82f97959e0e18122c164449a8ea.tar.gz gdb-fe7b42e5843ef82f97959e0e18122c164449a8ea.tar.bz2 |
Remove basic cleanup code
This removes the basic cleanup code: make_cleanups, do_cleanups,
discard_cleanups, and friends. This code is no longer needed, as
nothing in gdb makes an ordinary cleanup. Final cleanups are still
needed.
2019-03-06 Tom Tromey <tom@tromey.com>
* top.c (quit_force): Update.
* main.c (captured_command_loop): Update.
* common/new-op.c (operator new): Update.
* common/common-exceptions.c (struct catcher)
<save_cleanup_chain>: Remove member.
(exceptions_state_mc_init): Update.
(exception_try_scope_entry): Return nullptr.
(exception_try_scope_exit, exception_rethrow)
(throw_exception_sjlj, throw_exception_cxx): Update.
* common/cleanups.h (make_cleanup, make_cleanup_dtor)
(all_cleanups, do_cleanups, discard_cleanups)
(discard_final_cleanups, save_cleanups, save_final_cleanups)
(restore_cleanups, restore_final_cleanups): Don't declare.
(do_final_cleanups): Remove parameter.
* common/cleanups.c (cleanup_chain, make_cleanup)
(make_cleanup_dtor, all_cleanups, do_cleanups)
(discard_my_cleanups, discard_cleanups)
(discard_final_cleanups, save_my_cleanups, save_cleanups)
(save_final_cleanups, restore_my_cleanups, restore_cleanups)
(null_cleanup): Remove.
(do_final_cleanups): Remove parameter.
Diffstat (limited to 'gdb/common')
-rw-r--r-- | gdb/common/cleanups.c | 160 | ||||
-rw-r--r-- | gdb/common/cleanups.h | 32 | ||||
-rw-r--r-- | gdb/common/common-exceptions.c | 20 | ||||
-rw-r--r-- | gdb/common/new-op.c | 2 |
4 files changed, 6 insertions, 208 deletions
diff --git a/gdb/common/cleanups.c b/gdb/common/cleanups.c index 086371a..121720d 100644 --- a/gdb/common/cleanups.c +++ b/gdb/common/cleanups.c @@ -58,10 +58,6 @@ static const struct cleanup sentinel_cleanup = { 0, 0, 0, 0 }; /* Handy macro to use when referring to sentinel_cleanup. */ #define SENTINEL_CLEANUP ((struct cleanup *) &sentinel_cleanup) -/* Chain of cleanup actions established with make_cleanup, - to be executed if an error happens. */ -static struct cleanup *cleanup_chain = SENTINEL_CLEANUP; - /* Chain of cleanup actions established with make_final_cleanup, to be executed when gdb exits. */ static struct cleanup *final_cleanup_chain = SENTINEL_CLEANUP; @@ -107,31 +103,12 @@ make_my_cleanup (struct cleanup **pmy_chain, make_cleanup_ftype *function, return make_my_cleanup2 (pmy_chain, function, arg, NULL); } -/* Add a new cleanup to the cleanup_chain, +/* Add a new cleanup to the final cleanup_chain, and return the previous chain pointer to be passed later to do_cleanups or discard_cleanups. Args are FUNCTION to clean up with, and ARG to pass to it. */ struct cleanup * -make_cleanup (make_cleanup_ftype *function, void *arg) -{ - return make_my_cleanup (&cleanup_chain, function, arg); -} - -/* Same as make_cleanup except also includes DTOR, a destructor to free ARG. - DTOR is invoked when the cleanup is performed or when it is discarded. */ - -struct cleanup * -make_cleanup_dtor (make_cleanup_ftype *function, void *arg, - make_cleanup_dtor_ftype *dtor) -{ - return make_my_cleanup2 (&cleanup_chain, - function, arg, dtor); -} - -/* Same as make_cleanup except the cleanup is added to final_cleanup_chain. */ - -struct cleanup * make_final_cleanup (make_cleanup_ftype *function, void *arg) { return make_my_cleanup (&final_cleanup_chain, function, arg); @@ -158,139 +135,10 @@ do_my_cleanups (struct cleanup **pmy_chain, } } -/* Return a value that can be passed to do_cleanups, do_final_cleanups to - indicate perform all cleanups. */ - -struct cleanup * -all_cleanups (void) -{ - return SENTINEL_CLEANUP; -} - -/* Discard cleanups and do the actions they describe - until we get back to the point OLD_CHAIN in the cleanup_chain. */ - -void -do_cleanups (struct cleanup *old_chain) -{ - do_my_cleanups (&cleanup_chain, old_chain); -} - -/* Discard cleanups and do the actions they describe - until we get back to the point OLD_CHAIN in the final_cleanup_chain. */ - -void -do_final_cleanups (struct cleanup *old_chain) -{ - do_my_cleanups (&final_cleanup_chain, old_chain); -} - -/* Main worker routine to discard cleanups. - PMY_CHAIN is a pointer to either cleanup_chain or final_cleanup_chain. - OLD_CHAIN is the result of a "make" cleanup routine. - Cleanups are discarded until we get back to the old end of the chain. */ - -static void -discard_my_cleanups (struct cleanup **pmy_chain, - struct cleanup *old_chain) -{ - struct cleanup *ptr; - - while ((ptr = *pmy_chain) != old_chain) - { - *pmy_chain = ptr->next; - if (ptr->free_arg) - (*ptr->free_arg) (ptr->arg); - xfree (ptr); - } -} - -/* Discard cleanups, not doing the actions they describe, - until we get back to the point OLD_CHAIN in the cleanup chain. */ - -void -discard_cleanups (struct cleanup *old_chain) -{ - discard_my_cleanups (&cleanup_chain, old_chain); -} - -/* Discard final cleanups, not doing the actions they describe, - until we get back to the point OLD_CHAIN in the final cleanup chain. */ - -void -discard_final_cleanups (struct cleanup *old_chain) -{ - discard_my_cleanups (&final_cleanup_chain, old_chain); -} - -/* Main worker routine to save cleanups. - PMY_CHAIN is a pointer to either cleanup_chain or final_cleanup_chain. - The chain is emptied and the result is a pointer to the old chain. */ - -static struct cleanup * -save_my_cleanups (struct cleanup **pmy_chain) -{ - struct cleanup *old_chain = *pmy_chain; - - *pmy_chain = SENTINEL_CLEANUP; - return old_chain; -} - -/* Set the cleanup_chain to 0, and return the old cleanup_chain. */ - -struct cleanup * -save_cleanups (void) -{ - return save_my_cleanups (&cleanup_chain); -} - -/* Set the final_cleanup_chain to 0, and return the old - final_cleanup_chain. */ - -struct cleanup * -save_final_cleanups (void) -{ - return save_my_cleanups (&final_cleanup_chain); -} - -/* Main worker routine to save cleanups. - PMY_CHAIN is a pointer to either cleanup_chain or final_cleanup_chain. - The chain is restored from CHAIN. */ - -static void -restore_my_cleanups (struct cleanup **pmy_chain, struct cleanup *chain) -{ - if (*pmy_chain != SENTINEL_CLEANUP) - internal_warning (__FILE__, __LINE__, - _("restore_my_cleanups has found a stale cleanup")); - - *pmy_chain = chain; -} - -/* Restore the cleanup chain from a previously saved chain. */ - -void -restore_cleanups (struct cleanup *chain) -{ - restore_my_cleanups (&cleanup_chain, chain); -} - -/* Restore the final cleanup chain from a previously saved chain. */ - -void -restore_final_cleanups (struct cleanup *chain) -{ - restore_my_cleanups (&final_cleanup_chain, chain); -} - -/* Provide a known function that does nothing, to use as a base for - a possibly long chain of cleanups. This is useful where we - use the cleanup chain for handling normal cleanups as well as dealing - with cleanups that need to be done as a result of a call to error(). - In such cases, we may not be certain where the first cleanup is, unless - we have a do-nothing one to always use as the base. */ +/* Discard final cleanups and do the actions they describe. */ void -null_cleanup (void *arg) +do_final_cleanups () { + do_my_cleanups (&final_cleanup_chain, SENTINEL_CLEANUP); } diff --git a/gdb/common/cleanups.h b/gdb/common/cleanups.h index f49bcb4..e676076 100644 --- a/gdb/common/cleanups.h +++ b/gdb/common/cleanups.h @@ -32,38 +32,8 @@ typedef void (make_cleanup_ftype) (void *); /* Function type for the dtor in make_cleanup_dtor. */ typedef void (make_cleanup_dtor_ftype) (void *); -/* WARNING: The result of the "make cleanup" routines is not the intuitive - choice of being a handle on the just-created cleanup. Instead it is an - opaque handle of the cleanup mechanism and represents all cleanups created - from that point onwards. - The result is guaranteed to be non-NULL though. */ - -extern struct cleanup *make_cleanup (make_cleanup_ftype *, void *); - -extern struct cleanup *make_cleanup_dtor (make_cleanup_ftype *, void *, - make_cleanup_dtor_ftype *); - extern struct cleanup *make_final_cleanup (make_cleanup_ftype *, void *); -/* A special value to pass to do_cleanups and do_final_cleanups - to tell them to do all cleanups. */ -extern struct cleanup *all_cleanups (void); - -extern void do_cleanups (struct cleanup *); -extern void do_final_cleanups (struct cleanup *); - -extern void discard_cleanups (struct cleanup *); -extern void discard_final_cleanups (struct cleanup *); - -extern struct cleanup *save_cleanups (void); -extern struct cleanup *save_final_cleanups (void); - -extern void restore_cleanups (struct cleanup *); -extern void restore_final_cleanups (struct cleanup *); - -/* A no-op cleanup. - This is useful when you want to establish a known reference point - to pass to do_cleanups. */ -extern void null_cleanup (void *); +extern void do_final_cleanups (); #endif /* COMMON_CLEANUPS_H */ diff --git a/gdb/common/common-exceptions.c b/gdb/common/common-exceptions.c index 5e86c7b..4e67e89 100644 --- a/gdb/common/common-exceptions.c +++ b/gdb/common/common-exceptions.c @@ -47,7 +47,6 @@ struct catcher jmp_buf buf; /* Status buffer belonging to the exception handler. */ struct gdb_exception exception; - struct cleanup *saved_cleanup_chain; /* Back link. */ struct catcher *prev; }; @@ -83,10 +82,6 @@ exceptions_state_mc_init (void) /* Start with no exception. */ new_catcher->exception = exception_none; - /* Prevent error/quit during FUNC from calling cleanups established - prior to here. */ - new_catcher->saved_cleanup_chain = save_cleanups (); - /* Push this new catcher on the top. */ new_catcher->prev = current_catcher; current_catcher = new_catcher; @@ -102,11 +97,6 @@ catcher_pop (void) current_catcher = old_catcher->prev; - /* Restore the cleanup chain, the error/quit messages, and the uiout - builder, to their original states. */ - - restore_cleanups (old_catcher->saved_cleanup_chain); - xfree (old_catcher); } @@ -228,7 +218,7 @@ void * exception_try_scope_entry (void) { ++try_scope_depth; - return (void *) save_cleanups (); + return nullptr; } /* Called on exit of a TRY scope, either normal exit or exception @@ -237,7 +227,6 @@ exception_try_scope_entry (void) void exception_try_scope_exit (void *saved_state) { - restore_cleanups ((struct cleanup *) saved_state); --try_scope_depth; } @@ -248,9 +237,6 @@ exception_try_scope_exit (void *saved_state) void exception_rethrow (void) { - /* Run this scope's cleanups before re-throwing to the next - outermost scope. */ - do_cleanups (all_cleanups ()); throw; } @@ -269,8 +255,6 @@ gdb_exception_sliced_copy (struct gdb_exception *to, const struct gdb_exception void throw_exception_sjlj (struct gdb_exception exception) { - do_cleanups (all_cleanups ()); - /* Jump to the nearest CATCH_SJLJ block, communicating REASON to that call via setjmp's return value. Note that REASON can't be zero, by definition in common-exceptions.h. */ @@ -286,8 +270,6 @@ throw_exception_sjlj (struct gdb_exception exception) static ATTRIBUTE_NORETURN void throw_exception_cxx (struct gdb_exception exception) { - do_cleanups (all_cleanups ()); - if (exception.reason == RETURN_QUIT) { gdb_exception_RETURN_MASK_QUIT ex; diff --git a/gdb/common/new-op.c b/gdb/common/new-op.c index 8c07ffa..cff6686 100644 --- a/gdb/common/new-op.c +++ b/gdb/common/new-op.c @@ -66,8 +66,6 @@ operator new (std::size_t sz) } CATCH (ex, RETURN_MASK_ALL) { - do_cleanups (all_cleanups ()); - throw gdb_quit_bad_alloc (ex); } END_CATCH |