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] nptl: Add pthread_thread_number_np function


On 12/14/2017 11:47 PM, Florian Weimer wrote:
> Subject: [PATCH] nptl: Add pthread_thread_number_np function
> To: libc-alpha@sourceware.org

I am re-reviewing this v2 of the patch, and in light of our discussion
downstream in this same thread. The intent is not to create an artificial
limit on the number of threads, but to provide vitally useful functions
for logging and uniquely identifying threads.

It is currently accepted, by both yourself, and Andrew Pinski, that the
64-bit thread identifier is large enough that no such overflow would be
probable within the lifetime of the hardware this code would run upon.
Even then we might extend this to 128-bit at a future date, which would
last until the sun burned out (unless we get massive parallelism, but
by then I hope pthreads is not be the interface in use)

I also understand that using a default of 128-bit, which would certainly
be future-proof, would be less useful because the type is harder to
manipulate efficiently, and makes the interface less useful.

We need a v3.

- See my suggestions for the manual.
- See my questions about preventing user abuse of monotonically increasing
  values from 1 for purposes we do not intend.

> The implementation is actually in libc.so.  With a full implementation
> of pthread_self in libc.so, pthread_thread_number_np is completely
> usable without libpthread.
> 
> 2017-12-14  Florian Weimer  <fweimer@redhat.com>
> 
> 	nptl: Add pthread_thread_number_np function.
> 	* csu/libc-tls.c (__libc_setup_tls): Call __dl_inittcb.
> 	* elf/Makefile (dl-routines): Add dl-inittcb.
> 	* elf/dl-inittcb.c: New file.
> 	* elf/rtld.c (init_tls): Call __dl_inittcb.
> 	* manual/threads.texi (Non-POSIX Extensions): Reference Non-POSIX
> 	Extensions.
> 	(Non-POSIX Extensions): New node.
> 	* nptl/Makefile (routines): Add thread_number.
> 	(tests): Add tst-thread_number-single, tst-thread_number-multi,
> 	tst-thread_number-single-static, tst-thread_number-multi-static.
> 	(tests-nolibpthread): Add tst-thread_number-single,
> 	tst-thread_number-single-static.
> 	(tests-static): Add tst-thread_number-single-static,
> 	tst-thread_number-multi-static.
> 	* nptl/Versions (GLIBC_2.27): Export pthread_thread_number_np.
> 	* nptl/allocatestack.c (allocate_stack): Increment
> 	global_thread_number under__default_pthread_attr_lock and use its
> 	value to set the new thread number.
> 	* nptl/descr.h (struct pthread): Add number member.
> 	* nptl/thread_number.c: New file.
> 	* nptl/tst-thread_number-multi.c: Likewise.
> 	* nptl/tst-thread_number-single.c: Likewise.
> 	* nptl/tst-thread_number-multi-static.c: Likewise.
> 	* nptl/tst-thread_number-single-static.c: Likewise.
> 	* sysdeps/nptl/pthread.h (pthread_thread_number_np): Declare.
> 	* sysdeps/unix/sysv/linux/libc**.abilist: Update.
> 
> diff --git a/NEWS b/NEWS
> index c5607c855f..257b252a63 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -46,7 +46,8 @@ Major new features:
>    _Float32x types, as defined by ISO/IEC TS 18661-3:2015.  These are
>    corresponding interfaces to those supported for _Float128.
>  
> -* glibc now implements the memfd_create and mlock2 functions on Linux.
> +* glibc now implements the memfd_create, mlock2, and
> +  pthread_thread_number_np functions on Linux.

OK.

>  
>  * Support for memory protection keys was added.  The <sys/mman.h> header now
>    declares the functions pkey_alloc, pkey_free, pkey_mprotect, pkey_set,
> diff --git a/csu/libc-tls.c b/csu/libc-tls.c
> index 00138eb43a..af81cba12c 100644
> --- a/csu/libc-tls.c
> +++ b/csu/libc-tls.c
> @@ -195,6 +195,7 @@ __libc_setup_tls (void)
>  #endif
>    if (__builtin_expect (lossage != NULL, 0))
>      _startup_fatal (lossage);
> +  __dl_inittcb ();

OK.

>  
>    /* Update the executable's link map with enough information to make
>       the TLS routines happy.  */
> diff --git a/elf/Makefile b/elf/Makefile
> index 8563555079..66ce2953a4 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -30,7 +30,7 @@ routines	= $(all-dl-routines) dl-support dl-iteratephdr \
>  # profiled libraries.
>  dl-routines	= $(addprefix dl-,load lookup object reloc deps hwcaps \
>  				  runtime init fini debug misc \
> -				  version profile tls origin scope \
> +				  version profile tls inittcb origin scope \

OK.

>  				  execstack caller open close trampoline \
>  				  exception sort-maps)
>  ifeq (yes,$(use-ldconfig))
> diff --git a/elf/dl-inittcb.c b/elf/dl-inittcb.c
> new file mode 100644
> index 0000000000..5a70e9775d
> --- /dev/null
> +++ b/elf/dl-inittcb.c
> @@ -0,0 +1,22 @@
> +/* Initialize TCB contents.  Generic version.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +void
> +__dl_inittcb (void)
> +{
> +}

OK.

> diff --git a/elf/rtld.c b/elf/rtld.c
> index cfd3729b8e..214e2312fa 100644
> --- a/elf/rtld.c
> +++ b/elf/rtld.c
> @@ -740,6 +740,7 @@ cannot allocate TLS data structures for initial thread\n");
>    const char *lossage = TLS_INIT_TP (tcbp);
>    if (__glibc_unlikely (lossage != NULL))
>      _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
> +  __dl_inittcb ();

OK.

>    tls_init_tp_called = true;
>  
>    return tcbp;
> diff --git a/manual/threads.texi b/manual/threads.texi
> index 769d974d50..6aa08f398a 100644
> --- a/manual/threads.texi
> +++ b/manual/threads.texi
> @@ -80,6 +80,7 @@ the standard.
>  @menu
>  * Default Thread Attributes::             Setting default attributes for
>  					  threads in a process.
> +* Identifying Threads::                   Unique identifiers for threads.

OK.

>  @end menu
>  
>  @node Default Thread Attributes
> @@ -124,6 +125,30 @@ The system does not have sufficient memory.
>  @end table
>  @end deftypefun
>  
> +@node Identifying Threads
> +@subsection Unique identifiers for threads
> +
> +@Theglibc{} provides a non-standard function to obtain a unique thread
> +identifier.
> +
> +@deftypefun uint64_t pthread_thread_number_np (pthread_t @var{thread})
> +@standards{GNU, pthread.h}
> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
> +
> +This function returns a number that uniquely identifies @var{thread}
> +among all past, current, and future running threads.  This number does
> +not change during the life-time of the thread.  Once returned by this
> +function, a number will not be reused after the thread terminates.
> +
> +The returned number is only unique with regards to the current process.
> +It may be shared by subprocesses and other processes in the system.
> +
> +The initial (main) thread has number 1.  Thread numbers are not
> +necessarily assigned in a consecutive fashion.  They bear no
> +relationship to POSIX thread IDs (@code{pthread_t} values), process IDs
> +or thread IDs assigned by the kernel.

I would like us to add something like this:
~~~
While the return type of this function is only 64-bits wide, the intent
is not to impose an artificial limit on the number of threads that can be
created by the runtime. In the future this interface may be extended
to 128-bits to support creating as many threads as a user may need
for the lifetime of the process.
~~~

That way the intent of the interface and future changes are clear.

I figure it's implied that this function cannot fail because it has no
error code, and therefore any internal failure aborts the process, as
you added with the assert.

> +@end deftypefun
> +
>  @c FIXME these are undocumented:
>  @c pthread_atfork
>  @c pthread_attr_destroy
> diff --git a/nptl/Makefile b/nptl/Makefile
> index ae388d1112..087fb6a8b5 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -30,7 +30,7 @@ install-lib-ldscripts := libpthread.so
>  
>  routines = alloca_cutoff forward libc-lowlevellock libc-cancellation \
>  	   libc-cleanup libc_pthread_init libc_multiple_threads \
> -	   register-atfork unregister-atfork pthread_self
> +	   register-atfork unregister-atfork pthread_self thread_number

OK.

>  shared-only-routines = forward
>  
>  # We need to provide certain routines for compatibility with existing
> @@ -302,7 +302,8 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
>  			    c89 gnu89 c99 gnu99 c11 gnu11) \
>  	tst-bad-schedattr \
>  	tst-thread_local1 tst-mutex-errorcheck tst-robust10 \
> -	tst-robust-fork tst-create-detached tst-memstream
> +	tst-robust-fork tst-create-detached tst-memstream \
> +	tst-thread_number-single tst-thread_number-multi \

OK.

>  
>  tests-internal := tst-rwlock19 tst-rwlock20 \
>  		  tst-sem11 tst-sem12 tst-sem13 \
> @@ -318,7 +319,9 @@ test-srcs = tst-oddstacklimit
>  test-xfail-tst-once5 = yes
>  
>  # Files which must not be linked with libpthread.
> -tests-nolibpthread = tst-unload
> +tests-nolibpthread = tst-unload \
> +  tst-thread_number-single \
> +  tst-thread_number-single-static \
>  
>  gen-as-const-headers = pthread-errnos.sym \
>  		       unwindbuf.sym \
> @@ -433,9 +436,13 @@ link-libc-static := $(common-objpfx)libc.a $(static-gnulib) \
>  tests-static += tst-locale1 tst-locale2 tst-stackguard1-static \
>  		tst-cancel21-static tst-cancel24-static tst-cond8-static \
>  		tst-mutex8-static tst-mutexpi8-static tst-sem11-static \
> -		tst-sem12-static
> +		tst-sem12-static tst-thread_number-single-static \
> +		tst-thread_number-multi-static \

OK.

> +
>  tests += tst-cancel21-static tst-cancel24-static \
> -	 tst-cond8-static
> +  tst-cond8-static tst-thread_number-single-static \
> +  tst-thread_number-multi-static \
> +

OK.

>  tests-internal += tst-sem11-static tst-sem12-static tst-stackguard1-static
>  xtests-static += tst-setuid1-static
>  
> diff --git a/nptl/Versions b/nptl/Versions
> index 0ae5def464..a7204912a8 100644
> --- a/nptl/Versions
> +++ b/nptl/Versions
> @@ -28,6 +28,9 @@ libc {
>      pthread_cond_wait; pthread_cond_signal;
>      pthread_cond_broadcast; pthread_cond_timedwait;
>    }
> +  GLIBC_2.27 {
> +    pthread_thread_number_np;
> +  }

OK. Typo fixed.

>    GLIBC_PRIVATE {
>      __libc_alloca_cutoff;
>      # Internal libc interface to libpthread
> diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
> index 1cc7893195..454df7740b 100644
> --- a/nptl/allocatestack.c
> +++ b/nptl/allocatestack.c
> @@ -413,16 +413,28 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
>    assert (powerof2 (pagesize_m1 + 1));
>    assert (TCB_ALIGNMENT >= STACK_ALIGN);
>  
> -  /* Get the stack size from the attribute if it is set.  Otherwise we
> -     use the default we determined at start time.  */
> -  if (attr->stacksize != 0)
> -    size = attr->stacksize;
> -  else
> -    {
> -      lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
> +  uint64_t thread_number;
> +  lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
> +  {
> +    /* Number 1 is reserved for the initial thread.  Reuse
> +       __default_pthread_attr_lock to avoid concurrent updates of this
> +       counter.  */

OK.

> +    static uint64_t global_thread_number = 1;
> +    thread_number = ++global_thread_number;

Alright, here comes serious worry #1.

If we say "Thread numbers are not necessarily assigned in a consecutive fashion.",
and we assign them in a consecutive fashion, users will ignore this statement
and use what empirically appears to be true.

People start relying on this counter incrementing from 1 upwards.

People start using this monotonic property for indexing.

Soon we can't change it because it's implied API behaviour.

I think we should disabuse them from doing something low cost to roll the value:

* Do nothing for thread 1, leaving it 1.
* Check global_thread_number for overflow instead.
* Pick a random number of bits to roll between 0-63 (picked at process startup)
* Roll the value by some that number of bits.
* Use the rolled value as the thread_number

Alternatively just pick __GLIBC_MINOR__ as the number of bits 
to roll so this changes with each major release.

> +
> +    /* Check for counter wrap-around.  This should never happen
> +       because 2**64 is such a large value.  */
> +    if (thread_number == 0)
> +      __libc_fatal ("Fatal glibc error: maximum number of threads exceeded\n");

OK. Perfect, overflow has defined fatal behaviour. This is good.

> +
> +    /* Get the stack size from the attribute if it is set.  Otherwise
> +       we use the default we determined at start time.  */
> +    if (attr->stacksize != 0)
> +      size = attr->stacksize;
> +    else
>        size = __default_pthread_attr.stacksize;
> -      lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
> -    }
> +  }
> +  lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);

OK.

>  
>    /* Get memory for the stack.  */
>    if (__glibc_unlikely (attr->flags & ATTR_FLAG_STACKADDR))
> @@ -758,6 +770,8 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
>  #endif
>    pd->robust_head.list = &pd->robust_head;
>  
> +  pd->number = thread_number;

OK.

> +
>    /* We place the thread descriptor at the end of the stack.  */
>    *pdp = pd;
>  
> diff --git a/nptl/descr.h b/nptl/descr.h
> index c83b17b674..49e266139e 100644
> --- a/nptl/descr.h
> +++ b/nptl/descr.h
> @@ -395,6 +395,9 @@ struct pthread
>    /* Resolver state.  */
>    struct __res_state res;
>  
> +  /* Unique number assigned to this thread.  */
> +  uint64_t number;

OK.

> +
>    /* This member must be last.  */
>    char end_padding[];
>  
> diff --git a/nptl/thread_number.c b/nptl/thread_number.c
> new file mode 100644
> index 0000000000..a9fdaa508b
> --- /dev/null
> +++ b/nptl/thread_number.c
> @@ -0,0 +1,26 @@
> +/* Unique numbers for threads.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include "pthreadP.h"
> +
> +__uint64_t
> +pthread_thread_number_np (pthread_t threadid)
> +{
> +  struct pthread *pd = (struct pthread *) threadid;
> +  return pd->number;
> +}

OK.

> diff --git a/nptl/tst-thread_number-multi-static.c b/nptl/tst-thread_number-multi-static.c
> new file mode 100644
> index 0000000000..658928cfd5
> --- /dev/null
> +++ b/nptl/tst-thread_number-multi-static.c
> @@ -0,0 +1,19 @@
> +/* Test unique numbers for threads, static multi-threaded version.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include "tst-thread_number-multi.c"

OK.

> diff --git a/nptl/tst-thread_number-multi.c b/nptl/tst-thread_number-multi.c
> new file mode 100644
> index 0000000000..881fe6b097
> --- /dev/null
> +++ b/nptl/tst-thread_number-multi.c
> @@ -0,0 +1,101 @@
> +/* Test unique numbers for threads, non-static multi-threaded version.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <pthread.h>
> +#include <stdbool.h>
> +#include <stdint.h>
> +#include <stdlib.h>
> +#include <support/check.h>
> +#include <support/namespace.h>
> +#include <support/xthread.h>
> +
> +/* Used to check that the main thread still has thread number 1 in a
> +   subprocess.  */
> +static void
> +subprocess (void *closure)
> +{
> +  TEST_COMPARE (pthread_thread_number_np (pthread_self ()), 1U);
> +}

OK.

> +
> +static void *
> +subthread (void *closure)
> +{
> +  if (closure != NULL)
> +    xpthread_barrier_wait (closure);
> +  return NULL;
> +}
> +
> +static int
> +compare (const void *pleft, const void *pright)
> +{
> +  uint64_t left = *(const uint64_t *)pleft;
> +  uint64_t right = *(const uint64_t *)pright;
> +  if (left < right)
> +    return -1;
> +  if (left > right)
> +    return 1;
> +  return 0;
> +}
> +
> +static int
> +do_test (void)
> +{
> +  TEST_COMPARE (pthread_thread_number_np (pthread_self ()), 1U);
> +  support_isolate_in_subprocess (subprocess, NULL);
> +
> +  /* Create thread_count threads, half of which are joined
> +     immediately, have of which stay around.  */
> +  enum { thread_count = 10 };
> +  pthread_barrier_t barrier;
> +  xpthread_barrier_init (&barrier, NULL, thread_count / 2 + 1);
> +  uint64_t ids[thread_count];
> +  pthread_t threads[thread_count]; /* Only even-numbered entries are valid.  */
> +  for (int i = 0; i < thread_count; ++i)
> +    {
> +      bool stay_around = (i % 2) == 0;
> +      threads[i] = xpthread_create (NULL, subthread,
> +                                    stay_around ? &barrier : NULL);
> +      ids[i] = pthread_thread_number_np (threads[i]);
> +      TEST_VERIFY (ids[i] != 1);

OK.

> +      if (!stay_around)
> +        xpthread_join (threads[i]);
> +    }
> +
> +  /* Check that the IDs are all distinct.  */
> +  qsort (ids, thread_count, sizeof (ids[0]), compare);
> +  for (int i = 1; i < thread_count; ++i)
> +    TEST_VERIFY (ids[i - 1] < ids[i]);

OK.

> +
> +  /* Main thread ID should remain at 1.  */
> +  TEST_COMPARE (pthread_thread_number_np (pthread_self ()), 1U);
> +  support_isolate_in_subprocess (subprocess, NULL);

OK.

> +
> +  /* Clean up.  */
> +  xpthread_barrier_wait (&barrier);
> +  for (int i = 0; i < thread_count; ++i)
> +    if ((i % 2) == 0)
> +      xpthread_join (threads[i]);
> +
> +  /* Main thread ID should still remain at 1.  */
> +  TEST_COMPARE (pthread_thread_number_np (pthread_self ()), 1U);
> +  support_isolate_in_subprocess (subprocess, NULL);
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/nptl/tst-thread_number-single-static.c b/nptl/tst-thread_number-single-static.c
> new file mode 100644
> index 0000000000..5c21063c36
> --- /dev/null
> +++ b/nptl/tst-thread_number-single-static.c
> @@ -0,0 +1,19 @@
> +/* Test unique numbers for threads, static single-threaded version.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include "tst-thread_number-single.c"

OK.

> diff --git a/nptl/tst-thread_number-single.c b/nptl/tst-thread_number-single.c
> new file mode 100644
> index 0000000000..7d3e7ee1dd
> --- /dev/null
> +++ b/nptl/tst-thread_number-single.c
> @@ -0,0 +1,40 @@
> +/* Test unique numbers for threads, non-static single-threaded version.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <pthread.h>
> +#include <support/check.h>
> +#include <support/namespace.h>
> +
> +/* Used to check that the main thread still has thread number 1 in a
> +   subprocess.  */
> +static void
> +subprocess (void *closure)
> +{
> +  TEST_COMPARE (pthread_thread_number_np (pthread_self ()), 1U);
> +}
> +
> +static int
> +do_test (void)
> +{
> +  TEST_COMPARE (pthread_thread_number_np (pthread_self ()), 1U);
> +  support_isolate_in_subprocess (subprocess, NULL);
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index 7a65dc641c..99f2e58875 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -1056,6 +1056,10 @@ void __libc_setup_tls (void);
>  void __pthread_initialize_minimal (void) weak_function;
>  #endif
>  
> +/* Initialize the already-existing TCB for the main thread.  Called
> +   during dynamic linker startup or from __libc_setup_tls.  */
> +void __dl_inittcb (void) attribute_hidden;

OK.

> +
>  /* Allocate memory for static TLS block (unless MEM is nonzero) and dtv.  */
>  extern void *_dl_allocate_tls (void *mem);
>  rtld_hidden_proto (_dl_allocate_tls)
> diff --git a/sysdeps/nptl/dl-inittcb.c b/sysdeps/nptl/dl-inittcb.c
> new file mode 100644
> index 0000000000..c25424dfa6
> --- /dev/null
> +++ b/sysdeps/nptl/dl-inittcb.c
> @@ -0,0 +1,27 @@
> +/* Initialize TCB contents.  NPTL version.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <ldsodefs.h>
> +#include <tls.h>
> +
> +void
> +__dl_inittcb (void)
> +{
> +  /* The main thread has number 1.  */
> +  THREAD_SELF->number = 1;
> +}

OK.

> diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h
> index 2b2b386ab3..e0714ed951 100644
> --- a/sysdeps/nptl/pthread.h
> +++ b/sysdeps/nptl/pthread.h
> @@ -1148,6 +1148,10 @@ extern int pthread_atfork (void (*__prepare) (void),
>  			   void (*__child) (void)) __THROW;
>  
>  
> +/* Return a number uniquely identifying THREAD, even after its
> +   termination.  */
> +__uint64_t pthread_thread_number_np (pthread_t __thread_id) __THROW;
> +

OK.

>  #ifdef __USE_EXTERN_INLINES
>  /* Optimizations.  */
>  __extern_inline int
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index ec0ead15dd..e9ba69cd43 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2113,6 +2113,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index 5355769974..71258b014b 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2024,6 +2024,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist
> index 9bafe71b51..df5eb357f8 100644
> --- a/sysdeps/unix/sysv/linux/arm/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
> @@ -114,6 +114,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index 90aa8d034f..3c37cf48ec 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -1878,6 +1878,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index 4d44c30c64..aba40e2119 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2043,6 +2043,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 112fc57634..6ef38f5150 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -1907,6 +1907,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index 2e8b6a4586..63cda3a92e 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -115,6 +115,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 3c33400f67..4b0d923e1c 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -1992,6 +1992,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> index e1b1a579d2..68c927f54e 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> @@ -2113,6 +2113,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index c1550323f3..71f3785cdd 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -1967,6 +1967,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 3b3a172e4f..09d7344ce9 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -1965,6 +1965,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 101ca7a241..fea609bd3a 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -1963,6 +1963,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 2d129f7170..3cd9e072a3 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -1958,6 +1958,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index 8bc350aff8..b8b2941999 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2154,6 +2154,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index 127c426e1c..60f5c63cc9 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -1996,6 +1996,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index a9411318e2..f538a91cb2 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -2001,6 +2001,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> index d7bf5db601..f83d43c8cb 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> @@ -2208,6 +2208,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> index a3415a72ac..e61ce85a68 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> @@ -115,6 +115,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index 414338f9a2..ae74cb8184 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -1996,6 +1996,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index f0f7a69b64..fffbcb3d3e 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -1897,6 +1897,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist
> index 9f95aba898..cb8eb05b2e 100644
> --- a/sysdeps/unix/sysv/linux/sh/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
> @@ -1882,6 +1882,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 83fbdf2d7e..4184dcff17 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -1989,6 +1989,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index ee84ad10bc..cb9a0ae97f 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -1926,6 +1926,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf128 F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
> diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
> index dcbfbc05ac..c305690b5a 100644
> --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
> @@ -2120,6 +2120,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
> index 53dc99c45a..be6507ee22 100644
> --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
> @@ -2120,6 +2120,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
> index dcbfbc05ac..c305690b5a 100644
> --- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
> @@ -2120,6 +2120,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index ae4dcaa47e..f418549369 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -1884,6 +1884,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 0dbda14796..6bc513a7ed 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2127,6 +2127,7 @@ GLIBC_2.27 pkey_free F
>  GLIBC_2.27 pkey_get F
>  GLIBC_2.27 pkey_mprotect F
>  GLIBC_2.27 pkey_set F
> +GLIBC_2.27 pthread_thread_number_np F
>  GLIBC_2.27 strfromf32 F
>  GLIBC_2.27 strfromf32x F
>  GLIBC_2.27 strfromf64 F

OK.

-- 
Cheers,
Carlos.


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