[vlc-devel] [PATCH] threads: make vlc_cleanup_push call the cleanup function in C++ on Win32/OS2

Rémi Denis-Courmont remi at remlab.net
Mon Feb 10 16:36:35 CET 2020


It's a problem of the site of the cancellation point not to have C++ frames in need of unwinding. Thus pushing cleanup handler in C++ is useless, AFAICT.

Except on GNU/Linux which defines cancellation in C++ code.

Le 10 février 2020 17:06:38 GMT+02:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>On 2020-02-10 15:53, Rémi Denis-Courmont wrote:
>> Hi,
>> 
>> This is missing unwinding code for C++. The removed comments are
>there 
>> for reasons...
>
>Isn't that a problem of the routine called, rather than storing the 
>routine ? In that case we may impose some restrictions on the routine 
>(via strong typing).
>
>It seems throwing an exception in the routine might be a good way to do
>
>things cleanly.
>
>> Le 10 février 2020 15:55:44 GMT+02:00, Steve Lhomme
><robux4 at ycbcr.xyz> a 
>> écrit :
>> 
>>     Should fix #23591
>>    
>------------------------------------------------------------------------
>>       include/vlc_threads.h | 12 ++----------
>>       1 file changed, 2 insertions(+), 10 deletions(-)
>> 
>>     diff --git a/include/vlc_threads.h b/include/vlc_threads.h
>>     index 0e27ea803fa..b2ef5222d3b 100644
>>     --- a/include/vlc_threads.h
>>     +++ b/include/vlc_threads.h
>>     @@ -1071,26 +1071,18 @@ struct vlc_cleanup_t
>>           void          *data;
>>       };
>>       
>>     -# ifndef __cplusplus
>>       /* This macros opens a code block on purpose: It reduces the
>chance of
>>        * not pairing the push and pop. It also matches the POSIX
>Thread internals.
>>        * That way, Win32 developers will not accidentally break other
>platforms.
>>        */
>>       # define vlc_cleanup_push( routine, arg ) \
>>           do { \
>>     -        vlc_control_cancel(&(vlc_cleanup_t){ NULL, routine, arg
>})
>>     +        vlc_cleanup_t _cleanup = (vlc_cleanup_t){ NULL, routine,
>arg }; \
>>     +        vlc_control_cancel(&_cleanup)
>>       
>>       #  define vlc_cleanup_pop( ) \
>>               vlc_control_cancel (NULL); \
>>           } while (0)
>>     -# else
>>     -/* Those macros do not work in C++. However common C/C++ helpers
>may call them
>>     - * anyway - this is fine if the code is never cancelled in C++
>case.
>>     - * So define the macros to do nothing.
>>     - */
>>     -#  define vlc_cleanup_push(routine, arg) do { (routine, arg)
>>     -#  define vlc_cleanup_pop() } while (0)
>>     -# endif
>>       
>>       #endif /* !LIBVLC_USE_PTHREAD_CLEANUP */
>>       
>> 
>> 
>> -- 
>> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
>excuser 
>> ma brièveté.
>> 
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>> 
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20200210/3aa10ee5/attachment.html>


More information about the vlc-devel mailing list