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

Mark Himsley mark.himsley at gmail.com
Mon Feb 3 21:40:30 EET 2020


On Mon, 3 Feb 2020 at 17:19, Marton Balint <cus at passwd.hu> wrote:
>
>
>
> On Mon, 3 Feb 2020, Mark Himsley wrote:
>
> > 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
>
> It looks like you are still building for Windows XP, but that is no longer
> supported. _WIN32_WINNT should be at least 0x0600.

Thanks Marton.
I'll remember, Windows Vista and above only.
Thanks - I'll update my build script.


> Regards,
> Marton
>
>
> > -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
> >
> >
> >
> > --
> > Mark Himsley


-- 
Mark Himsley


More information about the ffmpeg-devel mailing list