* Daniel P. Berrangé (berrange@redhat.com) wrote:
> This has greater portability than directly call pthread_setname_np,
> which is only 1 out of 3 possible functions for pthreads that can
> set the name.
>
> The new API requires a trampoline function, since it can only set
> the name of the current thread.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
> ---
> audio/jackaudio.c | 28 +++++++++++++++++++++++-----
> 1 file changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/audio/jackaudio.c b/audio/jackaudio.c
> index 974a3caad3..48ffbf735f 100644
> --- a/audio/jackaudio.c
> +++ b/audio/jackaudio.c
> @@ -629,18 +629,36 @@ static void qjack_enable_in(HWVoiceIn *hw, bool enable)
> ji->c.enabled = enable;
> }
>
> -#if !defined(WIN32) && defined(CONFIG_PTHREAD_SETNAME_NP_W_TID)
> +#if !defined(WIN32)
> +struct QJackThreadData {
> + void *(*function)(void *);
> + void *arg;
> +};
> +
> +static void *qjack_thread_trampoline(void *targ)
> +{
> + struct QJackThreadData *data = targ;
> + void *(*function)(void *) = data->function;
> + void *arg = data->arg;
> +
> + g_free(data);
> + qemu_thread_set_name("jack-client");
> +
> + return function(arg);
> +}
> +
> static int qjack_thread_creator(jack_native_thread_t *thread,
> const pthread_attr_t *attr, void *(*function)(void *), void *arg)
> {
> - int ret = pthread_create(thread, attr, function, arg);
> + struct QJackThreadData *data = g_new0(struct QJackThreadData, 1);
> + data->function = function;
> + data->arg = arg;
> + int ret = pthread_create(thread, attr, qjack_thread_trampoline, data);
> if (ret != 0) {
> + g_free(data);
> return ret;
> }
>
> - /* set the name of the thread */
> - pthread_setname_np(*thread, "jack-client");
> -
> return ret;
> }
> #endif
> --
> 2.50.1
>
--
-----Open up your eyes, open up your mind, open up your code -------
/ Dr. David Alan Gilbert | Running GNU/Linux | Happy \
\ dave @ treblig.org | | In Hex /
\ _________________________|_____ http://www.treblig.org |_______/