[PATCH] Update to new generic semaphore algorithm v2
Andreas Schwab
schwab@suse.de
Thu Feb 7 10:26:00 GMT 2019
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."
More information about the Libc-alpha
mailing list