Openwall GNU/*/Linux - a small security-enhanced Linux distro for servers
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Mon, 28 Sep 2015 18:21:21 -0400
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: [PATCH 1/2] pthread: add missing memory barrier

On Mon, Sep 28, 2015 at 04:58:44PM -0500, Bobby Bingham wrote:
> posix requires pthread_join to synchronize memory on success. in the
> case that we call __timedwait_cp, we can rely on its futex_wake call
> to synchronize memory, but we need a memory barrier for the case where
> we don't call it.
> ---
>  src/thread/pthread_join.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/src/thread/pthread_join.c b/src/thread/pthread_join.c
> index 966b4ab..eb78e2f 100644
> --- a/src/thread/pthread_join.c
> +++ b/src/thread/pthread_join.c
> @@ -11,7 +11,9 @@ int __pthread_join(pthread_t t, void **res)
>  	__pthread_testcancel();
>  	__pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
>  	if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
> -	while ((tmp = t->tid)) __timedwait_cp(&t->tid, tmp, 0, 0, 0);
> +	if (!(tmp = t->tid)) a_barrier();
> +	else do __timedwait_cp(&t->tid, tmp, 0, 0, 0);
> +	while ((tmp = t->tid));
>  	__pthread_setcancelstate(cs, 0);
>  	if (res) *res = t->result;
>  	if (t->map_base) __munmap(t->map_base, t->map_size);
> -- 

I think this works, but it depends on __timedwait_cp containing a
barrier. Is this something we should view as part of its contract or
as an implementation detail? We could punt on the question and just
put an unconditional a_barrier() after the loop above, but I'd kind of
like to think through the question while we're looking at it.

Rich

Powered by blists - more mailing lists

Your e-mail address:

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.