ffmpeg: windows: respond to logoff and ctrl+break messages as well

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
rogerdpack 2015-06-30 16:31:19 -06:00 committed by Michael Niedermayer
parent bd0f14123f
commit 4ebb43f19c
2 changed files with 43 additions and 0 deletions

2
configure vendored
View File

@ -1787,6 +1787,7 @@ SYSTEM_FUNCS="
pthread_cancel pthread_cancel
sched_getaffinity sched_getaffinity
SetConsoleTextAttribute SetConsoleTextAttribute
SetConsoleCtrlHandler
setmode setmode
setrlimit setrlimit
Sleep Sleep
@ -4990,6 +4991,7 @@ check_func_headers windows.h GetSystemTimeAsFileTime
check_func_headers windows.h MapViewOfFile check_func_headers windows.h MapViewOfFile
check_func_headers windows.h PeekNamedPipe check_func_headers windows.h PeekNamedPipe
check_func_headers windows.h SetConsoleTextAttribute check_func_headers windows.h SetConsoleTextAttribute
check_func_headers windows.h SetConsoleCtrlHandler
check_func_headers windows.h Sleep check_func_headers windows.h Sleep
check_func_headers windows.h VirtualAlloc check_func_headers windows.h VirtualAlloc
check_struct windows.h "CONDITION_VARIABLE" Ptr check_struct windows.h "CONDITION_VARIABLE" Ptr

View File

@ -79,6 +79,10 @@
#include <windows.h> #include <windows.h>
#include <psapi.h> #include <psapi.h>
#endif #endif
#if HAVE_SETCONSOLECTRLHANDLER
#include <windows.h>
#endif
#if HAVE_SYS_SELECT_H #if HAVE_SYS_SELECT_H
#include <sys/select.h> #include <sys/select.h>
@ -313,6 +317,7 @@ void term_exit(void)
static volatile int received_sigterm = 0; static volatile int received_sigterm = 0;
static volatile int received_nb_signals = 0; static volatile int received_nb_signals = 0;
static volatile int transcode_init_done = 0; static volatile int transcode_init_done = 0;
static volatile int ffmpeg_exited = 0;
static int main_return_code = 0; static int main_return_code = 0;
static void static void
@ -329,6 +334,38 @@ sigterm_handler(int sig)
} }
} }
#if HAVE_SETCONSOLECTRLHANDLER
static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
{
av_log(NULL, AV_LOG_DEBUG, "\nReceived windows signal %ld\n", fdwCtrlType);
switch (fdwCtrlType)
{
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
sigterm_handler(SIGINT);
return TRUE;
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
sigterm_handler(SIGTERM);
/* Basically, with these 3 events, when we return from this method the
process is hard terminated, so stall as long as we need to
to try and let the main thread(s) clean up and gracefully terminate
(we have at most 5 seconds, but should be done far before that). */
while (!ffmpeg_exited) {
Sleep(0);
}
return TRUE;
default:
av_log(NULL, AV_LOG_ERROR, "Received unknown windows signal %ld\n", fdwCtrlType);
return FALSE;
}
}
#endif
void term_init(void) void term_init(void)
{ {
#if HAVE_TERMIOS_H #if HAVE_TERMIOS_H
@ -362,6 +399,9 @@ void term_init(void)
#ifdef SIGXCPU #ifdef SIGXCPU
signal(SIGXCPU, sigterm_handler); signal(SIGXCPU, sigterm_handler);
#endif #endif
#if HAVE_SETCONSOLECTRLHANDLER
SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
#endif
} }
/* read a key without blocking */ /* read a key without blocking */
@ -537,6 +577,7 @@ static void ffmpeg_cleanup(int ret)
av_log(NULL, AV_LOG_INFO, "Conversion failed!\n"); av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
} }
term_exit(); term_exit();
ffmpeg_exited = 1;
} }
void remove_avoptions(AVDictionary **a, AVDictionary *b) void remove_avoptions(AVDictionary **a, AVDictionary *b)