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

Marton Balint cus at passwd.hu
Mon Feb 3 19:18:55 EET 2020



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.

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
>
>
>
>
>> _______________________________________________
>> 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
> _______________________________________________
> 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".


More information about the ffmpeg-devel mailing list