diff options
author | Jason Molenda <jsm@bugshack.cygnus.com> | 1999-10-05 23:08:21 +0000 |
---|---|---|
committer | Jason Molenda <jsm@bugshack.cygnus.com> | 1999-10-05 23:08:21 +0000 |
commit | e61b94e5346142170a372e22f687753fcae79595 (patch) | |
tree | 3eb8e2978e57ed00d97fbf2849ae6a8720167c5c /gdb/inf-loop.c | |
parent | 748b7f0f54a0e2df89b5b38608beb1af697f04ac (diff) | |
download | gdb-e61b94e5346142170a372e22f687753fcae79595.tar.gz |
Initial revision
Diffstat (limited to 'gdb/inf-loop.c')
-rw-r--r-- | gdb/inf-loop.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/gdb/inf-loop.c b/gdb/inf-loop.c new file mode 100644 index 00000000000..8528512b3c7 --- /dev/null +++ b/gdb/inf-loop.c @@ -0,0 +1,113 @@ +/* Handling of inferior events for the event loop for GDB, the GNU debugger. + Copyright 1999 Free Software Foundation, Inc. + Written by Elena Zannoni <ezannoni@cygnus.com> of Cygnus Solutions. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "defs.h" +#include "inferior.h" /* For fetch_inferior_event. */ +#include "target.h" /* For enum inferior_event_type. */ +#include "event-loop.h" +#include "event-top.h" +#include "inf-loop.h" + +static int fetch_inferior_event_wrapper (gdb_client_data client_data); +static void complete_execution (void); + +/* 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. */ +void +inferior_event_handler (enum inferior_event_type event_type, + gdb_client_data client_data) +{ + switch (event_type) + { + case INF_ERROR: + printf_unfiltered ("error detected from target.\n"); + target_async (NULL, 0); + pop_target (); + discard_all_continuations (); + do_exec_error_cleanups (ALL_CLEANUPS); + break; + + case INF_REG_EVENT: + /* Use 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 get rid of the target. */ + if (!catch_errors (fetch_inferior_event_wrapper, + client_data, "", RETURN_MASK_ALL)) + { + target_async (NULL, 0); + pop_target (); + discard_all_continuations (); + do_exec_error_cleanups (ALL_CLEANUPS); + display_gdb_prompt (0); + } + break; + + case INF_EXEC_COMPLETE: + /* Is there anything left to do for the command issued to + complete? */ + do_all_continuations (); + /* Reset things after target has stopped for the async commands. */ + complete_execution (); + break; + + case INF_QUIT_REQ: + case INF_TIMER: + default: + printf_unfiltered ("Event type not recognized.\n"); + break; + } +} + +static int +fetch_inferior_event_wrapper (gdb_client_data client_data) +{ + fetch_inferior_event (client_data); + return 1; +} + +/* Reset proper settings after an asynchronous command has finished. + If the execution command was in synchronous mode, register stdin + with the event loop, and reset the prompt. */ + +static void +complete_execution (void) +{ + target_executing = 0; + + /* Unregister the inferior from the event loop. This is done so that + when the inferior is not running we don't get distracted by + spurious inferior output. */ + target_async (NULL, 0); + + if (sync_execution) + { + do_exec_error_cleanups (ALL_CLEANUPS); + display_gdb_prompt (0); + } + else + { + if (exec_done_display_p) + printf_unfiltered ("completed.\n"); + } +} |