This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Update to new generic semaphore algorithm v2


On Jan 13 2015, Torvald Riegel <triegel@redhat.com> wrote:

> diff --git a/nptl/sem_getvalue.c b/nptl/sem_getvalue.c
> index c3c91e1..1432cc7 100644
> --- a/nptl/sem_getvalue.c
> +++ b/nptl/sem_getvalue.c
> @@ -19,23 +19,37 @@
>  #include <semaphore.h>
>  #include <shlib-compat.h>
>  #include "semaphoreP.h"
> +#include <atomic.h>
>  
>  
>  int
> -__new_sem_getvalue (sem, sval)
> -     sem_t *sem;
> -     int *sval;
> +__new_sem_getvalue (sem_t *sem, int *sval)
>  {
>    struct new_sem *isem = (struct new_sem *) sem;
>  
>    /* XXX Check for valid SEM parameter.  */
> -
> -  *sval = isem->value;
> +  /* FIXME This uses relaxed MO, even though POSIX specifies that this function
> +     should be linearizable.  However, its debatable whether linearizability
> +     is the right requirement.  We need to follow up with POSIX and, if
> +     necessary, use a stronger MO here and elsewhere (e.g., potentially
> +     release MO in all places where we consume a token).  */
> +
> +#if __HAVE_64B_ATOMICS
> +  *sval = atomic_load_relaxed (&isem->data) & SEM_VALUE_MASK;
> +#else
> +  *sval = atomic_load_relaxed (&isem->value) >> SEM_VALUE_SHIFT;
> +#endif

This has the effect that a semaphore that is shared between a x86-64 and
a x86-32 process no longer yields the same value, because the latter
does not define __HAVE_64B_ATOMICS.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]