Garbage collect thread continuations
authorPedro Alves <palves@redhat.com>
Wed, 9 Sep 2015 17:23:25 +0000 (18:23 +0100)
committerPedro Alves <palves@redhat.com>
Wed, 9 Sep 2015 17:25:33 +0000 (18:25 +0100)
Nothing uses thread continuations anymore.

(inferior continuations are still used by the attach command.)

gdb/ChangeLog:
2015-09-09  Pedro Alves  <palves@redhat.com>

* continuations.c (add_continuation, restore_thread_cleanup)
(do_all_continuations_ptid, do_all_continuations_thread_callback)
(do_all_continuations_thread, do_all_continuations)
(discard_all_continuations_thread_callback)
(discard_all_continuations_thread, discard_all_continuations)
(add_intermediate_continuation)
(do_all_intermediate_continuations_thread_callback)
(do_all_intermediate_continuations_thread)
(do_all_intermediate_continuations)
(discard_all_intermediate_continuations_thread_callback)
(discard_all_intermediate_continuations_thread)
(discard_all_intermediate_continuations): Delete.
* continuations.h (add_continuation, do_all_continuations)
(do_all_continuations_thread, discard_all_continuations)
(discard_all_continuations_thread, add_intermediate_continuation)
(do_all_intermediate_continuations)
(do_all_intermediate_continuations_thread)
(discard_all_intermediate_continuations)
(discard_all_intermediate_continuations_thread): Delete
declarations.
* event-top.c (stdin_event_handler): Delete references to
continuations.
* gdbthread.h (struct thread_info): Delete continuations and
intermediate_continuations fields.
* inf-loop.c (inferior_event_handler): Remove references to
continuations.
* infrun.c (infrun_thread_stop_requested_callback): Remove
references to continuations.
* target.h (enum inferior_event_type) <INF_EXEC_CONTINUE>: Delete.
* thread.c: Don't include "continuations.h".
(clear_thread_inferior_resources): Remove references to
continuations.

gdb/ChangeLog
gdb/continuations.c
gdb/continuations.h
gdb/event-top.c
gdb/gdbthread.h
gdb/inf-loop.c
gdb/infrun.c
gdb/target.h
gdb/thread.c

index f9ac269342f54326821a06d6a7b89ff65211f6ce..380ff651fb8a013b7d60ee5f20c6811ce6276cfb 100644 (file)
@@ -1,3 +1,38 @@
+2015-09-09  Pedro Alves  <palves@redhat.com>
+
+       * continuations.c (add_continuation, restore_thread_cleanup)
+       (do_all_continuations_ptid, do_all_continuations_thread_callback)
+       (do_all_continuations_thread, do_all_continuations)
+       (discard_all_continuations_thread_callback)
+       (discard_all_continuations_thread, discard_all_continuations)
+       (add_intermediate_continuation)
+       (do_all_intermediate_continuations_thread_callback)
+       (do_all_intermediate_continuations_thread)
+       (do_all_intermediate_continuations)
+       (discard_all_intermediate_continuations_thread_callback)
+       (discard_all_intermediate_continuations_thread)
+       (discard_all_intermediate_continuations): Delete.
+       * continuations.h (add_continuation, do_all_continuations)
+       (do_all_continuations_thread, discard_all_continuations)
+       (discard_all_continuations_thread, add_intermediate_continuation)
+       (do_all_intermediate_continuations)
+       (do_all_intermediate_continuations_thread)
+       (discard_all_intermediate_continuations)
+       (discard_all_intermediate_continuations_thread): Delete
+       declarations.
+       * event-top.c (stdin_event_handler): Delete references to
+       continuations.
+       * gdbthread.h (struct thread_info): Delete continuations and
+       intermediate_continuations fields.
+       * inf-loop.c (inferior_event_handler): Remove references to
+       continuations.
+       * infrun.c (infrun_thread_stop_requested_callback): Remove
+       references to continuations.
+       * target.h (enum inferior_event_type) <INF_EXEC_CONTINUE>: Delete.
+       * thread.c: Don't include "continuations.h".
+       (clear_thread_inferior_resources): Remove references to
+       continuations.
+
 2015-09-09  Pedro Alves  <palves@redhat.com>
 
        * infcall.c (struct dummy_frame_context_saver): Delete.
index e753dc1769a51eb3f8e4298e9c3b6e8536970e4d..c6e14bc91282011187682d92acf43da8b848450e 100644 (file)
@@ -132,193 +132,3 @@ discard_all_inferior_continuations (struct inferior *inf)
 {
   discard_my_continuations (&inf->continuations);
 }
-
-/* Add a continuation to the continuation list of THREAD.  The new
-   continuation will be added at the front.  */
-
-void
-add_continuation (struct thread_info *thread,
-                 continuation_ftype *hook, void *args,
-                 continuation_free_arg_ftype *free_arg)
-{
-  make_continuation (&thread->continuations, hook, args, free_arg);
-}
-
-static void
-restore_thread_cleanup (void *arg)
-{
-  ptid_t *ptid_p = arg;
-
-  switch_to_thread (*ptid_p);
-}
-
-/* Walk down the continuation list of PTID, and execute all the
-   continuations.  There is a problem though.  In some cases new
-   continuations may be added while we are in the middle of this loop.
-   If this happens they will be added in the front, and done before we
-   have a chance of exhausting those that were already there.  We need
-   to then save the beginning of the list in a pointer and do the
-   continuations from there on, instead of using the global beginning
-   of list as our iteration pointer.  */
-
-static void
-do_all_continuations_ptid (ptid_t ptid,
-                          struct continuation **continuations_p,
-                          int err)
-{
-  struct cleanup *old_chain;
-  ptid_t current_thread;
-
-  if (*continuations_p == NULL)
-    return;
-
-  current_thread = inferior_ptid;
-
-  /* Restore selected thread on exit.  Don't try to restore the frame
-     as well, because:
-
-     - When running continuations, the selected frame is always #0.
-
-     - The continuations may trigger symbol file loads, which may
-     change the frame layout (frame ids change), which would trigger
-     a warning if we used make_cleanup_restore_current_thread.  */
-
-  old_chain = make_cleanup (restore_thread_cleanup, &current_thread);
-
-  /* Let the continuation see this thread as selected.  */
-  switch_to_thread (ptid);
-
-  do_my_continuations (continuations_p, err);
-
-  do_cleanups (old_chain);
-}
-
-/* Callback for iterate over threads.  */
-
-static int
-do_all_continuations_thread_callback (struct thread_info *thread, void *data)
-{
-  int err = * (int *) data;
-  do_all_continuations_ptid (thread->ptid, &thread->continuations, err);
-  return 0;
-}
-
-/* Do all continuations of thread THREAD.  */
-
-void
-do_all_continuations_thread (struct thread_info *thread, int err)
-{
-  do_all_continuations_thread_callback (thread, &err);
-}
-
-/* Do all continuations of all threads.  */
-
-void
-do_all_continuations (int err)
-{
-  iterate_over_threads (do_all_continuations_thread_callback, &err);
-}
-
-/* Callback for iterate over threads.  */
-
-static int
-discard_all_continuations_thread_callback (struct thread_info *thread,
-                                          void *data)
-{
-  discard_my_continuations (&thread->continuations);
-  return 0;
-}
-
-/* Get rid of all the continuations of THREAD.  */
-
-void
-discard_all_continuations_thread (struct thread_info *thread)
-{
-  discard_all_continuations_thread_callback (thread, NULL);
-}
-
-/* Get rid of all the continuations of all threads.  */
-
-void
-discard_all_continuations (void)
-{
-  iterate_over_threads (discard_all_continuations_thread_callback, NULL);
-}
-
-
-/* Add a continuation to the intermediate continuation list of THREAD.
-   The new continuation will be added at the front.  */
-
-void
-add_intermediate_continuation (struct thread_info *thread,
-                              continuation_ftype *hook,
-                              void *args,
-                              continuation_free_arg_ftype *free_arg)
-{
-  make_continuation (&thread->intermediate_continuations, hook,
-                    args, free_arg);
-}
-
-/* Walk down the cmd_continuation list, and execute all the
-   continuations.  There is a problem though.  In some cases new
-   continuations may be added while we are in the middle of this
-   loop.  If this happens they will be added in the front, and done
-   before we have a chance of exhausting those that were already
-   there.  We need to then save the beginning of the list in a pointer
-   and do the continuations from there on, instead of using the
-   global beginning of list as our iteration pointer.  */
-
-static int
-do_all_intermediate_continuations_thread_callback (struct thread_info *thread,
-                                                  void *data)
-{
-  int err = * (int *) data;
-
-  do_all_continuations_ptid (thread->ptid,
-                            &thread->intermediate_continuations, err);
-  return 0;
-}
-
-/* Do all intermediate continuations of thread THREAD.  */
-
-void
-do_all_intermediate_continuations_thread (struct thread_info *thread, int err)
-{
-  do_all_intermediate_continuations_thread_callback (thread, &err);
-}
-
-/* Do all intermediate continuations of all threads.  */
-
-void
-do_all_intermediate_continuations (int err)
-{
-  iterate_over_threads (do_all_intermediate_continuations_thread_callback,
-                       &err);
-}
-
-/* Callback for iterate over threads.  */
-
-static int
-discard_all_intermediate_continuations_thread_callback (struct thread_info *thread,
-                                                       void *data)
-{
-  discard_my_continuations (&thread->intermediate_continuations);
-  return 0;
-}
-
-/* Get rid of all the intermediate continuations of THREAD.  */
-
-void
-discard_all_intermediate_continuations_thread (struct thread_info *thread)
-{
-  discard_all_intermediate_continuations_thread_callback (thread, NULL);
-}
-
-/* Get rid of all the intermediate continuations of all threads.  */
-
-void
-discard_all_intermediate_continuations (void)
-{
-  iterate_over_threads (discard_all_intermediate_continuations_thread_callback,
-                       NULL);
-}
index c043a4e2deee630a4564ccdf9c2ba9dcca2958ae..b8c6e3eaa6ba714153167d3fc1f43e6518e9a0f4 100644 (file)
@@ -20,7 +20,6 @@
 #ifndef CONTINUATIONS_H
 #define CONTINUATIONS_H
 
-struct thread_info;
 struct inferior;
 
 /* To continue the execution commands when running gdb asynchronously.
@@ -45,24 +44,6 @@ typedef void (continuation_ftype) (void *arg, int err);
    continuation is called, or discarded.  */
 typedef void (continuation_free_arg_ftype) (void *);
 
-/* Thread specific continuations.  */
-
-extern void add_continuation (struct thread_info *,
-                             continuation_ftype *, void *,
-                             continuation_free_arg_ftype *);
-extern void do_all_continuations (int err);
-extern void do_all_continuations_thread (struct thread_info *, int err);
-extern void discard_all_continuations (void);
-extern void discard_all_continuations_thread (struct thread_info *);
-
-extern void add_intermediate_continuation (struct thread_info *,
-                                          continuation_ftype *, void *,
-                                          continuation_free_arg_ftype *);
-extern void do_all_intermediate_continuations (int err);
-extern void do_all_intermediate_continuations_thread (struct thread_info *, int err);
-extern void discard_all_intermediate_continuations (void);
-extern void discard_all_intermediate_continuations_thread (struct thread_info *);
-
 /* Inferior specific (any thread) continuations.  */
 
 extern void add_inferior_continuation (continuation_ftype *,
index 1762e3bd8e1948942fa2f959a309dc3acc3b3bcb..84650ca471787a334c71710da8ae915ee81b19bf 100644 (file)
@@ -419,8 +419,6 @@ stdin_event_handler (int error, gdb_client_data client_data)
     {
       printf_unfiltered (_("error detected on stdin\n"));
       delete_file_handler (input_fd);
-      discard_all_continuations ();
-      discard_all_intermediate_continuations ();
       /* If stdin died, we may as well kill gdb.  */
       quit_command ((char *) 0, stdin == instream);
     }
index 0c99782174965d17ba5f5839b12251b514d753a5..0f9734d0a06b93c969f636376084c79921758b16 100644 (file)
@@ -265,18 +265,6 @@ struct thread_info
      when GDB gets back SIGTRAP from step_resume_breakpoint.  */
   int step_after_step_resume_breakpoint;
 
-  /* Per-thread command support.  */
-
-  /* Pointer to what is left to do for an execution command after the
-     target stops.  Used only in asynchronous mode, by targets that
-     support async execution.  Several execution commands use it.  */
-  struct continuation *continuations;
-
-  /* Similar to the above, but used when a single execution command
-     requires several resume/stop iterations.  Used by the step
-     command.  */
-  struct continuation *intermediate_continuations;
-
   /* Pointer to the state machine manager object that handles what is
      left to do for the thread's execution command after the target
      stops.  Several execution commands use it.  */
index 7b1f7243056af64ff72190adff8c32cd0b3ff42b..8aecfe6af50f873f116e72c42d0b3344920d68fd 100644 (file)
 #include "top.h"
 #include "observer.h"
 
-/* General function to handle events in the inferior.  So far it just
-   takes care of detecting errors reported by select() or poll(),
-   otherwise it assumes that all is OK, and goes on reading data from
-   the fd.  This however may not always be what we want to do.  */
+/* General function to handle events in the inferior.  */
+
 void
 inferior_event_handler (enum inferior_event_type event_type, 
                        gdb_client_data client_data)
 {
-  struct cleanup *cleanup_if_error = make_bpstat_clear_actions_cleanup ();
-
   switch (event_type)
     {
     case INF_REG_EVENT:
-      /* Catch errors for now, until the inner layers of
-        fetch_inferior_event (i.e. readchar) can return meaningful
-        error status.  If an error occurs while getting an event from
-        the target, just cancel the current command.  */
-      {
-
-       TRY
-         {
-           fetch_inferior_event (client_data);
-         }
-       CATCH (ex, RETURN_MASK_ALL)
-         {
-           bpstat_clear_actions ();
-           do_all_intermediate_continuations (1);
-           do_all_continuations (1);
-
-           throw_exception (ex);
-         }
-       END_CATCH
-      }
+      fetch_inferior_event (client_data);
       break;
 
     case INF_EXEC_COMPLETE:
@@ -82,36 +59,10 @@ inferior_event_handler (enum inferior_event_type event_type,
       if (!ptid_equal (inferior_ptid, null_ptid))
        do_all_inferior_continuations (0);
 
-      /* If we were doing a multi-step (eg: step n, next n), but it
-        got interrupted by a breakpoint, still do the pending
-        continuations.  The continuation itself is responsible for
-        distinguishing the cases.  The continuations are allowed to
-        touch the inferior memory, e.g. to remove breakpoints, so run
-        them before running breakpoint commands, which may resume the
-        target.  */
-      if (non_stop
-         && target_has_execution
-         && !ptid_equal (inferior_ptid, null_ptid))
-       do_all_intermediate_continuations_thread (inferior_thread (), 0);
-      else
-       do_all_intermediate_continuations (0);
-
-      /* Always finish the previous command before running any
-        breakpoint commands.  Any stop cancels the previous command.
-        E.g. a "finish" or "step-n" command interrupted by an
-        unrelated breakpoint is canceled.  */
-      if (non_stop
-         && target_has_execution
-         && !ptid_equal (inferior_ptid, null_ptid))
-       do_all_continuations_thread (inferior_thread (), 0);
-      else
-       do_all_continuations (0);
-
       /* When running a command list (from a user command, say), these
         are only run when the command list is all done.  */
       if (interpreter_async)
        {
-
          check_frame_language_change ();
 
          /* Don't propagate breakpoint commands errors.  Either we're
@@ -129,21 +80,9 @@ inferior_event_handler (enum inferior_event_type event_type,
        }
       break;
 
-    case INF_EXEC_CONTINUE:
-      /* Is there anything left to do for the command issued to
-         complete?  */
-
-      if (non_stop)
-       do_all_intermediate_continuations_thread (inferior_thread (), 0);
-      else
-       do_all_intermediate_continuations (0);
-      break;
-
     case INF_TIMER:
     default:
       printf_unfiltered (_("Event type not recognized.\n"));
       break;
     }
-
-  discard_cleanups (cleanup_if_error);
 }
index 6324fbda2544b2e967732ddbdf4ba764c29202a5..e89e02aeb0814f1045baf066987348e43bbf262a 100644 (file)
@@ -3232,17 +3232,10 @@ infrun_thread_stop_requested_callback (struct thread_info *info, void *arg)
 
       if (!ecs->wait_some_more)
        {
-         struct thread_info *tp;
-
          /* Cancel any running execution command.  */
          thread_cancel_execution_command (info);
 
          normal_stop ();
-
-         /* Finish off the continuations.  */
-         tp = inferior_thread ();
-         do_all_intermediate_continuations_thread (tp, 1);
-         do_all_continuations_thread (tp, 1);
        }
 
       do_cleanups (old_chain);
index 0b85adfd13f3efe8bf82ca387121cdbdf205918c..597a619c0f3aeecfce12eba7b8302d3c9639c9ce 100644 (file)
@@ -126,11 +126,6 @@ enum inferior_event_type
     INF_TIMER,
     /* We are called to do stuff after the inferior stops.  */
     INF_EXEC_COMPLETE,
-    /* We are called to do some stuff after the inferior stops, but we
-       are expected to reenter the proceed() and
-       handle_inferior_event() functions.  This is used only in case of
-       'step n' like commands.  */
-    INF_EXEC_CONTINUE
   };
 \f
 /* Target objects which can be transfered using target_read,
index 5498fc16930d65c0bdaf6a998f087357afefd4b2..0f8eded70ffb0441fb6906ae9eae9eefc6e1fde8 100644 (file)
@@ -42,7 +42,6 @@
 #include "cli/cli-decode.h"
 #include "gdb_regex.h"
 #include "cli/cli-utils.h"
-#include "continuations.h"
 #include "thread-fsm.h"
 
 /* Definition of struct thread_info exported to gdbthread.h.  */
@@ -190,9 +189,6 @@ clear_thread_inferior_resources (struct thread_info *tp)
   btrace_teardown (tp);
 
   thread_cancel_execution_command (tp);
-
-  do_all_intermediate_continuations_thread (tp, 1);
-  do_all_continuations_thread (tp, 1);
 }
 
 static void