glibc/nptl_db/td_thr_tsd.c
Paul Eggert 5a82c74822 Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:

sed -ri '
  s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
  s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
  $(find $(git ls-files) -prune -type f \
      ! -name '*.po' \
      ! -name 'ChangeLog*' \
      ! -path COPYING ! -path COPYING.LIB \
      ! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
      ! -path manual/texinfo.tex ! -path scripts/config.guess \
      ! -path scripts/config.sub ! -path scripts/install-sh \
      ! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
      ! -path INSTALL ! -path  locale/programs/charmap-kw.h \
      ! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
      ! '(' -name configure \
            -execdir test -f configure.ac -o -f configure.in ';' ')' \
      ! '(' -name preconfigure \
            -execdir test -f preconfigure.ac ';' ')' \
      -print)

and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:

  chmod a+x sysdeps/unix/sysv/linux/riscv/configure
  # Omit irrelevant whitespace and comment-only changes,
  # perhaps from a slightly-different Autoconf version.
  git checkout -f \
    sysdeps/csky/configure \
    sysdeps/hppa/configure \
    sysdeps/riscv/configure \
    sysdeps/unix/sysv/linux/csky/configure
  # Omit changes that caused a pre-commit check to fail like this:
  # remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
  git checkout -f \
    sysdeps/powerpc/powerpc64/ppc-mcount.S \
    sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
  # Omit change that caused a pre-commit check to fail like this:
  # remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
  git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 02:43:31 -07:00

97 lines
2.9 KiB
C

/* Get a thread-specific data pointer for a thread.
Copyright (C) 1999-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <stdint.h>
#include "thread_dbP.h"
td_err_e
td_thr_tsd (const td_thrhandle_t *th, const thread_key_t tk, void **data)
{
td_err_e err;
psaddr_t tk_seq, level1, level2, seq, value;
void *copy;
uint32_t pthread_key_2ndlevel_size, idx1st, idx2nd;
LOG ("td_thr_tsd");
/* Get the key entry. */
err = DB_GET_VALUE (tk_seq, th->th_ta_p, __pthread_keys, tk);
if (err == TD_NOAPLIC)
return TD_BADKEY;
if (err != TD_OK)
return err;
/* Fail if this key is not at all used. */
if (((uintptr_t) tk_seq & 1) == 0)
return TD_BADKEY;
/* This makes sure we have the size information on hand. */
err = DB_GET_FIELD_ADDRESS (level2, th->th_ta_p, 0, pthread_key_data_level2,
data, 1);
if (err != TD_OK)
return err;
/* Compute the indeces. */
pthread_key_2ndlevel_size
= DB_DESC_NELEM (th->th_ta_p->ta_field_pthread_key_data_level2_data);
idx1st = tk / pthread_key_2ndlevel_size;
idx2nd = tk % pthread_key_2ndlevel_size;
/* Now fetch the first level pointer. */
err = DB_GET_FIELD (level1, th->th_ta_p, th->th_unique, pthread,
specific, idx1st);
if (err == TD_NOAPLIC)
return TD_DBERR;
if (err != TD_OK)
return err;
/* Check the pointer to the second level array. */
if (level1 == 0)
return TD_NOTSD;
/* Locate the element within the second level array. */
err = DB_GET_FIELD_ADDRESS (level2, th->th_ta_p,
level1, pthread_key_data_level2, data, idx2nd);
if (err == TD_NOAPLIC)
return TD_DBERR;
if (err != TD_OK)
return err;
/* Now copy in that whole structure. */
err = DB_GET_STRUCT (copy, th->th_ta_p, level2, pthread_key_data);
if (err != TD_OK)
return err;
/* Check whether the data is valid. */
err = DB_GET_FIELD_LOCAL (seq, th->th_ta_p, copy, pthread_key_data, seq, 0);
if (err != TD_OK)
return err;
if (seq != tk_seq)
return TD_NOTSD;
/* Finally, fetch the value. */
err = DB_GET_FIELD_LOCAL (value, th->th_ta_p, copy, pthread_key_data,
data, 0);
if (err == TD_OK)
*data = value;
return err;
}