[PATCH 2/3] nptl: Move cancel state out of cancelhandling
Florian Weimer
fw@deneb.enyo.de
Wed Apr 22 14:11:02 GMT 2020
* Adhemerval Zanella via Libc-alpha:
> diff --git a/nptl/pthread_setcancelstate.c b/nptl/pthread_setcancelstate.c
> index 4d7f413e19..aa1c8073a8 100644
> --- a/nptl/pthread_setcancelstate.c
> +++ b/nptl/pthread_setcancelstate.c
> @@ -31,39 +31,9 @@ __pthread_setcancelstate (int state, int *oldstate)
>
> self = THREAD_SELF;
>
> - int oldval = THREAD_GETMEM (self, cancelhandling);
> - while (1)
> - {
> - int newval = (state == PTHREAD_CANCEL_DISABLE
> - ? oldval | CANCELSTATE_BITMASK
> - : oldval & ~CANCELSTATE_BITMASK);
> -
> - /* Store the old value. */
> - if (oldstate != NULL)
> - *oldstate = ((oldval & CANCELSTATE_BITMASK)
> - ? PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE);
> -
> - /* Avoid doing unnecessary work. The atomic operation can
> - potentially be expensive if the memory has to be locked and
> - remote cache lines have to be invalidated. */
> - if (oldval == newval)
> - break;
> -
> - /* Update the cancel handling word. This has to be done
> - atomically since other bits could be modified as well. */
> - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
> - oldval);
> - if (__glibc_likely (curval == oldval))
> - {
> - if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
> - __do_cancel ();
> -
> - break;
> - }
> -
> - /* Prepare for the next round. */
> - oldval = curval;
> - }
> + if (oldstate != NULL)
> + *oldstate = self->cancelstate;
> + self->cancelstate = state;
>
> return 0;
> }
Why isn't this needed anymore? I think this should be mentioned
explicitly in the commit message.
More information about the Libc-alpha
mailing list