[PATCH v2 12/19] nptl: Use tidlock when accessing TID on pthread_getcpuclockid
Florian Weimer
fweimer@redhat.com
Thu Aug 26 14:27:08 GMT 2021
* Adhemerval Zanella:
> Checked on x86_64-linux-gnu.
> ---
> nptl/pthread_getcpuclockid.c | 27 +++++++++++++++++----------
> 1 file changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/nptl/pthread_getcpuclockid.c b/nptl/pthread_getcpuclockid.c
> index 0a6656ea4c..8c0db0b9ba 100644
> --- a/nptl/pthread_getcpuclockid.c
> +++ b/nptl/pthread_getcpuclockid.c
> @@ -29,16 +29,23 @@ __pthread_getcpuclockid (pthread_t threadid, clockid_t *clockid)
> struct pthread *pd = (struct pthread *) threadid;
>
> /* Make sure the descriptor is valid. */
> - if (INVALID_TD_P (pd))
> - /* Not a valid thread handle. */
> - return ESRCH;
> -
> - /* The clockid_t value is a simple computation from the TID. */
> -
> - const clockid_t tidclock = MAKE_THREAD_CPUCLOCK (pd->tid, CPUCLOCK_SCHED);
> -
> - *clockid = tidclock;
> - return 0;
> + sigset_t oldmask;
> + __libc_signal_block_all (&oldmask);
> + lll_lock (pd->tidlock, LLL_PRIVATE);
> +
> + int res;
> + if (pd->tid != 0)
> + {
> + *clockid = MAKE_THREAD_CPUCLOCK (pd->tid, CPUCLOCK_SCHED);
> + res = 0;
> + }
> + else
> + res = -ESRCH;
> +
> + lll_unlock (pd->tidlock, LLL_PRIVATE);
> + __libc_signal_restore_set (&oldmask);
> +
> + return res;
This doesn't really solve the race, does it? The caller cannot use the
clock ID safely.
Thanks,
Florian
More information about the Libc-alpha
mailing list