/* Handling of inferior events for the event loop for GDB, the GNU debugger.
   Copyright (C) 1999-2021 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 3 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, see <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "inferior.h"
#include "infrun.h"
#include "gdbsupport/event-loop.h"
#include "event-top.h"
#include "inf-loop.h"
#include "remote.h"
#include "language.h"
#include "gdbthread.h"
#include "interps.h"
#include "top.h"
#include "observable.h"

/* General function to handle events in the inferior.  */

void
inferior_event_handler (enum inferior_event_type event_type)
{
  switch (event_type)
    {
    case INF_REG_EVENT:
      fetch_inferior_event ();
      break;

    case INF_EXEC_COMPLETE:
      if (!non_stop)
	{
	  /* 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.  */
	  if (target_has_execution () && target_can_async_p ())
	    target_async (0);
	}

      /* Do all continuations associated with the whole inferior (not
	 a particular thread).  */
      if (inferior_ptid != null_ptid)
	current_inferior ()->do_all_continuations ();

      /* When running a command list (from a user command, say), these
	 are only run when the command list is all done.  */
      if (current_ui->async)
	{
	  check_frame_language_change ();

	  /* Don't propagate breakpoint commands errors.  Either we're
	     stopping or some command resumes the inferior.  The user will
	     be informed.  */
	  try
	    {
	      bpstat_do_actions ();
	    }
	  catch (const gdb_exception &e)
	    {
	      /* If the user was running a foreground execution
		 command, then propagate the error so that the prompt
		 can be reenabled.  Otherwise, the user already has
		 the prompt and is typing some unrelated command, so
		 just inform the user and swallow the exception.  */
	      if (current_ui->prompt_state == PROMPT_BLOCKED)
		throw;
	      else
		exception_print (gdb_stderr, e);
	    }
	}
      break;

    default:
      printf_unfiltered (_("Event type not recognized.\n"));
      break;
    }
}
