Add SIGINT handling. ctrl-C is more graceful now

Original commit message from CVS:
Add SIGINT handling.  ctrl-C is more graceful now
This commit is contained in:
David Schleef 2003-07-01 03:45:19 +00:00
parent c3191fba3e
commit 2ebb88a354

View file

@ -9,11 +9,24 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <gst/gst.h> #include <gst/gst.h>
/* FIXME: This is just a temporary hack. We should have a better
* check for siginfo handling. */
#ifdef SA_SIGINFO
#define USE_SIGINFO
#endif
extern volatile gboolean glib_on_error_halt;
static void fault_restore (void);
static void fault_spin (void);
static void sigint_restore (void);
static guint64 iterations = 0; static guint64 iterations = 0;
static guint64 sum = 0; static guint64 sum = 0;
static guint64 min = G_MAXINT64; static guint64 min = G_MAXINT64;
static guint64 max = 0; static guint64 max = 0;
static GstClock *s_clock; static GstClock *s_clock;
static GstElement *pipeline;
gboolean caught_intr = FALSE;
gboolean gboolean
idle_func (gpointer data) idle_func (gpointer data)
@ -38,7 +51,7 @@ idle_func (gpointer data)
min = MIN (min, diff); min = MIN (min, diff);
max = MAX (max, diff); max = MAX (max, diff);
if (!busy) { if (!busy || caught_intr) {
gst_main_quit (); gst_main_quit ();
g_print ("execution ended after %" G_GUINT64_FORMAT " iterations (sum %" G_GUINT64_FORMAT " ns, average %" G_GUINT64_FORMAT " ns, min %" G_GUINT64_FORMAT " ns, max %" G_GUINT64_FORMAT " ns)\n", g_print ("execution ended after %" G_GUINT64_FORMAT " iterations (sum %" G_GUINT64_FORMAT " ns, average %" G_GUINT64_FORMAT " ns, min %" G_GUINT64_FORMAT " ns, max %" G_GUINT64_FORMAT " ns)\n",
iterations, sum, sum/iterations, min, max); iterations, sum, sum/iterations, min, max);
@ -113,16 +126,6 @@ xmllaunch_parse_cmdline (const gchar **argv)
} }
#endif #endif
extern volatile gboolean glib_on_error_halt;
static void fault_restore(void);
static void fault_spin (void);
/* FIXME: This is just a temporary hack. We should have a better
* check for siginfo handling. */
#ifdef SA_SIGINFO
#define USE_SIGINFO
#endif
#ifndef USE_SIGINFO #ifndef USE_SIGINFO
static void static void
fault_handler_sighandler (int signum) fault_handler_sighandler (int signum)
@ -175,22 +178,11 @@ fault_spin (void)
wait (NULL); wait (NULL);
#if 1
/* FIXME how do we know if we were run by libtool? */ /* FIXME how do we know if we were run by libtool? */
g_print ("Spinning. Please run 'gdb gst-launch %d' to continue debugging, " g_print ("Spinning. Please run 'gdb gst-launch %d' to continue debugging, "
"Ctrl-C to quit, or Ctrl-\\ to dump core.\n", "Ctrl-C to quit, or Ctrl-\\ to dump core.\n",
(gint) getpid ()); (gint) getpid ());
while (spinning) g_usleep (1000000); while (spinning) g_usleep (1000000);
#else
/* This spawns a gdb and attaches it to gst-launch. */
{
char str[40];
sprintf (str, "gdb -quiet gst-launch %d", (gint) getpid ());
system (str);
}
_exit(0);
#endif
} }
static void static void
@ -222,6 +214,39 @@ fault_setup (void)
sigaction (SIGQUIT, &action, NULL); sigaction (SIGQUIT, &action, NULL);
} }
/* we only use sighandler here because the registers are not important */
static void
sigint_handler_sighandler (int signum)
{
g_print ("Caught interrupt\n");
sigint_restore();
caught_intr = TRUE;
}
static void
sigint_setup (void)
{
struct sigaction action;
memset (&action, 0, sizeof (action));
action.sa_handler = sigint_handler_sighandler;
sigaction (SIGINT, &action, NULL);
}
static void
sigint_restore (void)
{
struct sigaction action;
memset (&action, 0, sizeof (action));
action.sa_handler = SIG_DFL;
sigaction(SIGINT, &action, NULL);
}
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@ -241,14 +266,13 @@ main(int argc, char *argv[])
{"output", 'o', POPT_ARG_STRING|POPT_ARGFLAG_STRIP, &savefile, 0, {"output", 'o', POPT_ARG_STRING|POPT_ARGFLAG_STRIP, &savefile, 0,
"save xml representation of pipeline to FILE and exit", "FILE"}, "save xml representation of pipeline to FILE and exit", "FILE"},
#endif #endif
{"no_fault", 'f', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &no_fault, 0, {"no-fault", 'f', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &no_fault, 0,
"Do not install a fault handler", NULL}, "Do not install a fault handler", NULL},
{"trace", 't', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &trace, 0, {"trace", 't', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &trace, 0,
"print alloc trace if enabled at compile time", NULL}, "print alloc trace if enabled at compile time", NULL},
POPT_TABLEEND POPT_TABLEEND
}; };
GstElement *pipeline;
gchar **argvn; gchar **argvn;
GError *error = NULL; GError *error = NULL;
gint res = 0; gint res = 0;
@ -280,6 +304,8 @@ main(int argc, char *argv[])
if (!no_fault) if (!no_fault)
fault_setup(); fault_setup();
sigint_setup();
if (trace) { if (trace) {
if (!gst_alloc_trace_available()) { if (!gst_alloc_trace_available()) {
g_warning ("trace not available (recompile with trace enabled)"); g_warning ("trace not available (recompile with trace enabled)");