[FFmpeg-devel] [PATCH 2/2] avformat/udp: cancel pending IO on win32 manually

Mark Himsley mark.himsley at gmail.com
Mon Feb 3 12:42:44 EET 2020


On Sun, 26 Jan 2020 at 21:22, Marton Balint <cus at passwd.hu> wrote:
>
> recvfrom() is not a cancellation point in pthreads-win32, see
> https://sourceware.org/pthreads-win32/manual/pthread_cancel.html
>
> In order to be able to cancel the reader thread on Win32 properly we first
> shutdown the socket then call CancelIoEx to abort pending IO. Subsequent
> recvfrom() calls will fail with WSAESHUTDOWN causing the thread to exit.
>
> Fixes ticket #5717.
>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
>  libavformat/udp.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/udp.c b/libavformat/udp.c
> index 85c9e3a900..23c3773c64 100644
> --- a/libavformat/udp.c
> +++ b/libavformat/udp.c
> @@ -1069,8 +1069,17 @@ static int udp_close(URLContext *h)
>      if (s->thread_started) {
>          int ret;
>          // Cancel only read, as write has been signaled as success to the user
> -        if (h->flags & AVIO_FLAG_READ)
> +        if (h->flags & AVIO_FLAG_READ) {
> +#ifdef _WIN32
> +            /* recvfrom() is not a cancellation point for win32, so we shutdown
> +             * the socket and abort pending IO, subsequent recvfrom() calls
> +             * will fail with WSAESHUTDOWN causing the thread to exit. */
> +            shutdown(s->udp_fd, SD_RECEIVE);
> +            CancelIoEx((HANDLE)(SOCKET)s->udp_fd, NULL);
> +#else
>              pthread_cancel(s->circular_buffer_thread);
> +#endif
> +        }
>          ret = pthread_join(s->circular_buffer_thread, NULL);
>          if (ret != 0)
>              av_log(h, AV_LOG_ERROR, "pthread_join(): %s\n", strerror(ret));
> --
> 2.16.4

This was applied as 53aa76686e7ff4f1f6625502503d7923cec8c10e, but that
commit fails to compile in my mingw cross-compile build.


x86_64-w64-mingw32-gcc -I. -I./ --static -DPTW32_STATIC_LIB
-D_WIN32_WINNT=0x0501 -I/opt/ffbuild/include -D_ISOC99_SOURCE
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -U__STRICT_ANSI__
-D__USE_MINGW_ANSI_STDIO=1 -D__printf__=__gnu_printf__
-D_WIN32_WINNT=0x0600 -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
-DPIC -DOPJ_STATIC -DZLIB_CONST -DHAVE_AV_CONFIG_H -DBUILDING_avformat
--static -DPTW32_STATIC_LIB -D_WIN32_WINNT=0x0501
-I/opt/ffbuild/include  --static -DPTW32_STATIC_LIB
-D_WIN32_WINNT=0x0501 -std=c11 -fomit-frame-pointer -pthread
-I/opt/ffbuild/include -I/opt/ffbuild/include -I/opt/ffbuild/include
-I/opt/ffbuild/include/openjpeg-2.3 -I/opt/ffbuild/include/opus
-I/opt/ffbuild/include/opus -I/opt/ffbuild/include
-I/opt/ffbuild/include -I/opt/ffbuild/include -I/opt/ffbuild/include
-I/opt/ffbuild/include -I/opt/ffbuild/include -I/opt/ffbuild/include
-I/opt/ffbuild/include -I/opt/ffbuild/include -DLIBXML_STATIC
-I/opt/ffbuild/include/libxml2 -I/opt/ffbuild/include -g
-Wdeclaration-after-statement -Wall -Wdisabled-optimization
-Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits
-Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast
-Wstrict-prototypes -Wempty-body -Wno-parentheses -Wno-switch
-Wno-format-zero-length -Wno-pointer-sign -Wno-char-subscripts -O3
-fno-math-errno -fno-signed-zeros -fno-tree-vectorize
-Werror=format-security -Werror=implicit-function-declaration
-Werror=missing-prototypes -Werror=return-type -Werror=vla -Wformat
-fdiagnostics-color=auto -Wno-maybe-uninitialized  -MMD -MF
libavformat/udp.d -MT libavformat/udp.o -c -o libavformat/udp.o
libavformat/udp.c
In file included from libavformat/udp.c:65:0:
/opt/ffbuild/include/pthread.h:108:0: warning: "PTW32_LEVEL" redefined
 #define PTW32_LEVEL PTW32_LEVEL_MAX
 ^
/opt/ffbuild/include/pthread.h:95:0: note: this is the location of the
previous definition
 #define PTW32_LEVEL 1
 ^
In file included from /opt/ffbuild/include/pthread.h:299:0,
                 from libavformat/udp.c:65:
/opt/ffbuild/include/sched.h:64:0: warning: "PTW32_SCHED_LEVEL" redefined
 #define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX
 ^
/opt/ffbuild/include/sched.h:51:0: note: this is the location of the
previous definition
 #define PTW32_SCHED_LEVEL 1
 ^
libavformat/udp.c: In function 'udp_close':
libavformat/udp.c:1078:13: error: implicit declaration of function
'CancelIoEx' [-Werror=implicit-function-declaration]
             CancelIoEx((HANDLE)(SOCKET)s->udp_fd, NULL);
             ^
cc1: some warnings being treated as errors
ffbuild/common.mak:59: recipe for target 'libavformat/udp.o' failed
make: *** [libavformat/udp.o] Error 1




> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



-- 
Mark Himsley


More information about the ffmpeg-devel mailing list