From ffcc6e24f5dfa98dfcdcae39f5f85c1f5b8d52e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5ns=20Rullg=C3=A5rd?= Date: Wed, 20 Jan 2010 06:42:39 +0000 Subject: [PATCH] Add -timelimit option This option limits the CPU time used by ffmpeg to the number of seconds specified. After this time, the OS sends a SIGXCPU signal, which we handle and attempt to exit cleanly. If the process is stuck, the OS will deliver a SIGKILL one second later, forcibly terminating the process. This functionality is useful in automated setups where a runaway ffmpeg process would otherwise go undetected. Originally committed as revision 21347 to svn://svn.ffmpeg.org/ffmpeg/trunk --- cmdutils.c | 16 ++++++++++++++++ cmdutils.h | 5 +++++ ffmpeg.c | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/cmdutils.c b/cmdutils.c index 600dcaf51f..3034e2d44a 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -41,6 +41,9 @@ #if CONFIG_NETWORK #include "libavformat/network.h" #endif +#if HAVE_SYS_RESOURCE_H +#include +#endif #undef exit @@ -257,6 +260,19 @@ int opt_loglevel(const char *opt, const char *arg) return 0; } +int opt_timelimit(const char *opt, const char *arg) +{ +#if HAVE_SYS_RESOURCE_H + int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX); + struct rlimit rl = { lim, lim + 1 }; + if (setrlimit(RLIMIT_CPU, &rl)) + perror("setrlimit"); +#else + fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt); +#endif + return 0; +} + void set_context_opts(void *ctx, void *opts_ctx, int flags) { int i; diff --git a/cmdutils.h b/cmdutils.h index d2d722b085..9190a81fd9 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -55,6 +55,11 @@ int opt_default(const char *opt, const char *arg); */ int opt_loglevel(const char *opt, const char *arg); +/** + * Limit the execution time. + */ +int opt_timelimit(const char *opt, const char *arg); + /** * Parses a string and returns its corresponding value as a double. * Exits from the application if the string cannot be correctly diff --git a/ffmpeg.c b/ffmpeg.c index 02786070e4..4b956ba71d 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -353,6 +353,10 @@ static void term_init(void) signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */ signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */ +#ifdef SIGXCPU + signal(SIGXCPU, sigterm_handler); +#endif + /* register a function to be called at normal program termination */ @@ -3863,6 +3867,7 @@ static const OptionDef options[] = { { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" }, { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark}, "add timings for benchmarking" }, + { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" }, { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump}, "dump each input packet" }, { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},