Garbage collect thread continuations

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.
This commit is contained in:
Pedro Alves 2015-09-09 18:23:25 +01:00
parent 0700e23e5f
commit a85a307923
9 changed files with 38 additions and 303 deletions

View 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.

View 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);
}

View 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 *,

View 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);
}

View 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. */

View File

@ -32,39 +32,16 @@
#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);
}

View 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);

View 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
};
/* Target objects which can be transfered using target_read,

View 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