From patchwork Sat Nov 28 19:46:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 24131 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C14BA44B0DA for ; Sat, 28 Nov 2020 21:55:59 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 97191688140; Sat, 28 Nov 2020 21:55:59 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f65.google.com (mail-qv1-f65.google.com [209.85.219.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C9384687FF1 for ; Sat, 28 Nov 2020 21:55:52 +0200 (EET) Received: by mail-qv1-f65.google.com with SMTP id g19so3833339qvy.2 for ; Sat, 28 Nov 2020 11:55:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=YXpT/ritMa1Mo9oa1UH+edw5MU78Xgzi3Z9ldn4gUz8=; b=O2NVKfJXBzNVUIqibKeG2SEIuyzDiUs8HhfSRAzQZ0/9ubFr+Em1XrZCkkXfR+1q17 QkyN1/7FfmeR2m4tP1J9T8koAQnwYCd+Xpxm+PAItaH7r7g0XzhzwnATg14Mj8oOGa8L wceFJkQW9PUhzqIVZjnCBjtAwMF4KvDS3+pgwPyRDbt7pJikQ7xpxCumLcAb7zDfyD7g hEFoulhGzhTbBFV5KGwOrD/EEWzufU1jqWKTNhBJgxcBwuN0QyjaZLuAyQho8kJDQ0lm Dj9EwZQX7uXMNOCrDLoZLar+JUojUHTSCZqF4gIGww0IneyhuqHC+WYFEZdwa2FCorjq jD4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=YXpT/ritMa1Mo9oa1UH+edw5MU78Xgzi3Z9ldn4gUz8=; b=iVIiCtofUEUXvzQphQHCYXTtEjJNR1i3Ovm7pfXnF4S6fbrTql/MmDZFWDemQI4FgS t1P7vifmp0dg9r6ieMcbh1uhwbHrYAGWT+7iTPrpyzIubh9mpz6pt+PBjCYdW+IrQr+K LAzTr+0Sdos9EY5ZGDPS+D2Sl/mzxQWBXSB8T92w0foP2f12akYBSqIq/lYON2ycxBBU MAdvZlfrT7Wox5WDZo9BWhz0/VLbZE36dxtfqmV7yvV7kt+yPzpvBhbdl3GNiEHhA3BC 0/A172/lgwtQU1lzY+ZmdcudLkRNCdmWmzU79RY3dm/5do5FRESKyq2BF7aQN6kwabSc St9g== X-Gm-Message-State: AOAM530XrFPwMUPGwIthGe3fJF2uougP5jH6jyhRfXQ9rbyrx7AzDBM6 K92qUuBpoYtgiArh/qJmIrKtMipAbWA= X-Google-Smtp-Source: ABdhPJyegJXZe5h78+Fv9KINxA2346o1BCgtkCdnP7kaBPptqDkgOCWs9AwFyNLG1XGWz2uxycD/ww== X-Received: by 2002:a05:6214:1a10:: with SMTP id fh16mr14769511qvb.0.1606592912107; Sat, 28 Nov 2020 11:48:32 -0800 (PST) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id l28sm9288553qkl.7.2020.11.28.11.48.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Nov 2020 11:48:31 -0800 (PST) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Sat, 28 Nov 2020 14:46:53 -0500 Message-Id: <20201128194654.33756-1-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] ffmpeg: use sigaction() instead of signal() on linux X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman As per signal() help (man 2 signal) the semantics of using signal may vary across platforms. It is suggested to use sigaction() instead. On my system, the capture signal is reset to the default handler after the first call thus failing to properly handle multiple SIGINTs. Signed-off-by: Andriy Gelman --- fftools/ffmpeg.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 80f436eab3..01f4ef15d8 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -393,8 +393,30 @@ static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) } #endif +#ifdef __linux__ +#define SIGNAL(sig, func) \ + do { \ + action.sa_handler = func; \ + sigaction(sig, &action, NULL); \ + } while (0) +#else +#define SIGNAL(sig, func) \ + signal(sig, func) +#endif + void term_init(void) { +#if defined __linux__ + struct sigaction action; + action.sa_handler = sigterm_handler; + + /* block other interrupts while processing this one */ + sigfillset(&action.sa_mask); + + /* restart interruptible functions (i.e. don't fail with EINTR) */ + action.sa_flags = SA_RESTART; +#endif + #if HAVE_TERMIOS_H if (!run_as_daemon && stdin_interaction) { struct termios tty; @@ -413,14 +435,15 @@ void term_init(void) tcsetattr (0, TCSANOW, &tty); } - signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */ + SIGNAL(SIGQUIT, sigterm_handler); /* Quit (POSIX). */ } #endif - signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */ - signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */ + SIGNAL(SIGINT, sigterm_handler); + SIGNAL(SIGTERM, sigterm_handler); + #ifdef SIGXCPU - signal(SIGXCPU, sigterm_handler); + SIGNAL(SIGXCPU, sigterm_handler); #endif #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); /* Broken pipe (POSIX). */ From patchwork Sat Nov 28 19:46:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 24133 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B38D344B15E for ; Sat, 28 Nov 2020 21:56:40 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9B567688146; Sat, 28 Nov 2020 21:56:40 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f196.google.com (mail-qt1-f196.google.com [209.85.160.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5F4CA68811C for ; Sat, 28 Nov 2020 21:56:34 +0200 (EET) Received: by mail-qt1-f196.google.com with SMTP id l2so5536418qtq.4 for ; Sat, 28 Nov 2020 11:56:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=iWqI97OOKdb0njIB299Bdg1a0fE/VxuqqyF/nl8X1xA=; b=TM1DasLrk4tvl9Hvbxlm5fJnTQU+vLKqGDjIU6K+Gv53OHZdC4ZCw/CuUo/yWBYNnd SPkvQG9Bmi4up6ojWRH5XFjazmD7Vm0TPaMSVI6pXtOG6NRzU+qNNVdlMxmF8VNsxOM4 Sl+9n3/Yh34R1pHoqamKYVqEs5jZvRSMjuw3tbMlDB1kSYcXxuSKaqhhZFVYv0fnS3Lv A3HitcLdw82LKpja7bO5Dvd0QHtLdnWnoNwAtpSLIYZn8XXTTGxm/N4yv/Sib3wBHUu7 Aud4ZZIOEnDdPm52pZBzRNzC+L0bD3EaOja4eSZJCUJGKH38X+GmEdvr6RzTTt9q5TE0 T4mA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=iWqI97OOKdb0njIB299Bdg1a0fE/VxuqqyF/nl8X1xA=; b=oboJ45EywllTlmcxrcCuTQtzcdyj/H0BIxGKao4MVSf7CppWK+cW82HnhS9ZDYOZyc HliPjLHm3sLY7pbauN4nOLTKmtc9vfboPtXExnRLIsQIum5+DYAhsITnRWEuiEY3gadZ ORrSqWh1eJ+r9w3lQ5u1XDFxuXwaHXQHHN3fkofyIYKnvwhfiszU5VTZpdjI8R8pprzF hCP+ogExuPy7LA9JrXxfhQ635Wtw5WPpWHWu8OGOnRqHQXUT7elKOokLtPK/aR4Cjx1i qZPUBhmsCkGPVWNUlOrLd7zApYI8ZvUNE1M8Mpsb37YNC7lvg30Em7FROADmSTJ7ugIp KKeA== X-Gm-Message-State: AOAM532ceF0D+cZAZWN9ccCS/YJLQE3iGPGLXa3dXdUiyCF3+jG6NJ0P FGto54IYHuzVasiiGYCz8hx+KvQwkGY= X-Google-Smtp-Source: ABdhPJwXHOflW9bjJkV38gAT2MGkMFXe8lYkd2te0y2dEQYQcUK2nCKXx/lHecOxGfugMduejcL+fw== X-Received: by 2002:aed:2946:: with SMTP id s64mr14123729qtd.73.1606592916965; Sat, 28 Nov 2020 11:48:36 -0800 (PST) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id l28sm9288553qkl.7.2020.11.28.11.48.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Nov 2020 11:48:36 -0800 (PST) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Sat, 28 Nov 2020 14:46:54 -0500 Message-Id: <20201128194654.33756-2-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201128194654.33756-1-andriy.gelman@gmail.com> References: <20201128194654.33756-1-andriy.gelman@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] RFC ffmpeg: exit demuxers earlier after signal received X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman We currently use the same interrupt_callback function for both muxers and demuxers to break out of potential infinite loops. The function decode_interrupt_cb() checks for how many SIGINT/SIGTERM interrupts have been received, and (usually) two interrupts are needed to break out of an infinite loop. If this condition is seen on the muxer, however, we will fail to flush the avio buffers (see retry_transfer_wrapper()). An example of this issue is seen in Ticket #9009 (which would be fixed by this patch). A more robust alternative maybe to break out of demuxers with one interrupt. The error should propagate through, close the muxers and allow them to flush properly. (If the infinite loop is present on the muxer then a second interrupt would cause it break out and have the same behavior as before.) This patch adds this behavior. I've labelled it RFC because it potentially touches many demuxers. --- fftools/ffmpeg.c | 6 ++++++ fftools/ffmpeg.h | 1 + fftools/ffmpeg_opt.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 01f4ef15d8..bb27eec879 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -510,7 +510,13 @@ static int decode_interrupt_cb(void *ctx) return received_nb_signals > atomic_load(&transcode_init_done); } +static int decode_interrupt_one_sig_cb(void *ctx) +{ + return received_nb_signals > 0; +} + const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL }; +const AVIOInterruptCB int_one_sig_cb = { decode_interrupt_one_sig_cb, NULL }; static void ffmpeg_cleanup(int ret) { diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 3b54dab7fc..c49af30009 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -627,6 +627,7 @@ extern int vstats_version; extern int auto_conversion_filters; extern const AVIOInterruptCB int_cb; +extern const AVIOInterruptCB int_one_sig_cb; extern const OptionDef options[]; extern const HWAccel hwaccels[]; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 7ee034c9c9..2908f23010 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -1156,7 +1156,7 @@ static int open_input_file(OptionsContext *o, const char *filename) ic->flags |= AVFMT_FLAG_NONBLOCK; if (o->bitexact) ic->flags |= AVFMT_FLAG_BITEXACT; - ic->interrupt_callback = int_cb; + ic->interrupt_callback = int_one_sig_cb; if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) { av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);