Commit 4ebb43f1 authored by rogerdpack's avatar rogerdpack Committed by Michael Niedermayer

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

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent bd0f1412
...@@ -1787,6 +1787,7 @@ SYSTEM_FUNCS=" ...@@ -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 ...@@ -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
......
...@@ -79,6 +79,10 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment