[vlc-devel] [PATCH 1/2] win32: factor thread exit code
Steve Lhomme
robux4 at ycbcr.xyz
Mon Sep 7 10:29:06 CEST 2020
On 2020-09-07 10:23, Rémi Denis-Courmont wrote:
> Hi,
>
> The _endthreadex() is called indirectly by returning from vlc_entry().
> The patch makes it called explicitly but it does bot change the
> semantics as such. I can add a note though.
Yes that would help. I see this is explained in the _endthreadex doc:
"You can call _endthread or _endthreadex explicitly to terminate a
thread; however, _endthread or _endthreadex is called automatically when
the thread returns from the routine passed as a parameter to
_beginthread or _beginthreadex."
> Le 7 septembre 2020 08:45:34 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz>
> a écrit :
>
> I think the title is misleading. It's not just code factoring. A regular
> thread not calling test_cancel() will now call ExitThread. It's probably
> right, but it has some side effects that should be mentioned:
>
> "When this function is called (either explicitly or by returning from a
> thread procedure), the current thread's stack is deallocated, all
> pending I/O initiated by the thread is canceled, and the thread
> terminates. The entry-point function of all attached dynamic-link
> libraries (DLLs) is invoked with a value indicating that the thread is
> detaching from the DLL."
>
> On 2020-09-06 19:12, Rémi Denis-Courmont wrote:
>
> ------------------------------------------------------------------------
> src/win32/thread.c | 27 ++++++++++++++++-----------
> 1 file changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/src/win32/thread.c b/src/win32/thread.c
> index 255946913c..cd15828128 100644
> --- a/src/win32/thread.c
> +++ b/src/win32/thread.c
> @@ -35,6 +35,7 @@
> #include "libvlc.h"
> #include <stdarg.h>
> #include <stdatomic.h>
> +#include <stdnoreturn.h>
> #include <assert.h>
> #include <limits.h>
> #include <errno.h>
> @@ -345,6 +346,18 @@ static void vlc_thread_destroy(vlc_thread_t th)
> free(th);
> }
>
> +static noreturn void vlc_thread_exit(vlc_thread_t self)
> +{
> + if (self->id == NULL) /* Detached thread */
> + vlc_thread_destroy(self);
> +
> +#if VLC_WINSTORE_APP
> + ExitThread(0);
> +#else // !VLC_WINSTORE_APP
> + _endthreadex(0);
> +#endif // !VLC_WINSTORE_APP
> +}
> +
> static
> #if VLC_WINSTORE_APP
> DWORD
> @@ -359,10 +372,7 @@ __stdcall vlc_entry (void *p)
> th->killable = true;
> th->data = th->entry (th->data);
> TlsSetValue(thread_key, NULL);
> -
> - if (th->id == NULL) /* Detached thread */
> - vlc_thread_destroy(th);
> - return 0;
> + vlc_thread_exit(th);
> }
>
> static int vlc_clone_attr (vlc_thread_t *p_handle, bool detached,
> @@ -524,13 +534,8 @@ void vlc_testcancel (void)
> p->proc (p->data);
>
> th->data = NULL; /* TODO: special value? */
> - if (th->id == NULL) /* Detached thread */
> - vlc_thread_destroy(th);
> -#if VLC_WINSTORE_APP
> - ExitThread(0);
> -#else // !VLC_WINSTORE_APP
> - _endthreadex(0);
> -#endif // !VLC_WINSTORE_APP
> +
> + vlc_thread_exit(th);
> }
>
> void vlc_control_cancel (vlc_cleanup_t *cleaner)
> --
> 2.28.0
> ------------------------------------------------------------------------
> 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é.
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list