On Sun, 26 Jan 2020 at 21:22, Marton Balint <c...@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 <c...@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@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". -- Mark Himsley _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".