X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcontinuations.c;h=2edfd98a9c84e05215b13a88fcabc75d7d244eb8;hb=c4c493de2bbfc7414d0ec51f40f17cd7b1ff74f2;hp=c6e14bc91282011187682d92acf43da8b848450e;hpb=a85a3079233ddf4c5537ec90c03d3394b93ef355;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/continuations.c b/gdb/continuations.c index c6e14bc912..2edfd98a9c 100644 --- a/gdb/continuations.c +++ b/gdb/continuations.c @@ -1,6 +1,6 @@ /* Continuations for GDB, the GNU debugger. - Copyright (C) 1986-2015 Free Software Foundation, Inc. + Copyright (C) 1986-2021 Free Software Foundation, Inc. This file is part of GDB. @@ -22,107 +22,29 @@ #include "inferior.h" #include "continuations.h" -struct continuation -{ - struct continuation *next; - continuation_ftype *function; - continuation_free_arg_ftype *free_arg; - void *arg; -}; - -/* Add a new continuation to the continuation chain. Args are - FUNCTION to run the continuation up with, and ARG to pass to - it. */ - -static void -make_continuation (struct continuation **pmy_chain, - continuation_ftype *function, - void *arg, void (*free_arg) (void *)) -{ - struct continuation *newobj = XNEW (struct continuation); - - newobj->next = *pmy_chain; - newobj->function = function; - newobj->free_arg = free_arg; - newobj->arg = arg; - *pmy_chain = newobj; -} - -static void -do_my_continuations_1 (struct continuation **pmy_chain, int err) -{ - struct continuation *ptr; - - while ((ptr = *pmy_chain) != NULL) - { - *pmy_chain = ptr->next; /* Do this first in case of recursion. */ - (*ptr->function) (ptr->arg, err); - if (ptr->free_arg) - (*ptr->free_arg) (ptr->arg); - xfree (ptr); - } -} - -static void -do_my_continuations (struct continuation **list, int err) -{ - struct continuation *continuations; - - if (*list == NULL) - return; - - /* Copy the list header into another pointer, and set the global - list header to null, so that the global list can change as a side - effect of invoking the continuations and the processing of the - preexisting continuations will not be affected. */ - - continuations = *list; - *list = NULL; - - /* Work now on the list we have set aside. */ - do_my_continuations_1 (&continuations, err); -} - -static void -discard_my_continuations_1 (struct continuation **pmy_chain) -{ - struct continuation *ptr; - - while ((ptr = *pmy_chain) != NULL) - { - *pmy_chain = ptr->next; - if (ptr->free_arg) - (*ptr->free_arg) (ptr->arg); - xfree (ptr); - } -} - -static void -discard_my_continuations (struct continuation **list) -{ - discard_my_continuations_1 (list); - *list = NULL; -} - /* Add a continuation to the continuation list of INFERIOR. The new continuation will be added at the front. */ void -add_inferior_continuation (continuation_ftype *hook, void *args, - continuation_free_arg_ftype *free_arg) +add_inferior_continuation (std::function &&cont) { struct inferior *inf = current_inferior (); - make_continuation (&inf->continuations, hook, args, free_arg); + inf->continuations.emplace_front (std::move (cont)); } /* Do all continuations of the current inferior. */ void -do_all_inferior_continuations (int err) +do_all_inferior_continuations () { struct inferior *inf = current_inferior (); - do_my_continuations (&inf->continuations, err); + while (!inf->continuations.empty ()) + { + auto iter = inf->continuations.begin (); + (*iter) (); + inf->continuations.erase (iter); + } } /* Get rid of all the inferior-wide continuations of INF. */ @@ -130,5 +52,5 @@ do_all_inferior_continuations (int err) void discard_all_inferior_continuations (struct inferior *inf) { - discard_my_continuations (&inf->continuations); + inf->continuations.clear (); }