diff options
author | Måns Rullgård <mans@mansr.com> | 2010-01-20 06:42:39 +0000 |
---|---|---|
committer | Måns Rullgård <mans@mansr.com> | 2010-01-20 06:42:39 +0000 |
commit | ffcc6e24f5dfa98dfcdcae39f5f85c1f5b8d52e1 (patch) | |
tree | 12253316dd457c8490bcdddc5879603e65fe3802 | |
parent | 5e7dfb7de11dab3cbf8663d4fcb682935bd3a80b (diff) | |
download | ffmpeg-ffcc6e24f5dfa98dfcdcae39f5f85c1f5b8d52e1.tar.gz |
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
-rw-r--r-- | cmdutils.c | 16 | ||||
-rw-r--r-- | cmdutils.h | 5 | ||||
-rw-r--r-- | ffmpeg.c | 5 |
3 files changed, 26 insertions, 0 deletions
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 <sys/resource.h> +#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 @@ -56,6 +56,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 * parsed or the corresponding value is invalid. @@ -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}, |