This is the mail archive of the glibc-cvs@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]

GNU C Library master sources branch master updated. glibc-2.21-376-g7cea621


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  7cea6212785552b73f22af110a71aa77e2333b82 (commit)
      from  5e2aa9a421cd429e9ef7d169eda7c18a119e9b8c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=7cea6212785552b73f22af110a71aa77e2333b82

commit 7cea6212785552b73f22af110a71aa77e2333b82
Author: Roland McGrath <roland@hack.frob.com>
Date:   Wed May 20 14:52:05 2015 -0700

    NaCl: Set tid field to a unique value.

diff --git a/ChangeLog b/ChangeLog
index 180c504..830d362 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2015-05-20  Roland McGrath  <roland@hack.frob.com>
 
+	* sysdeps/nacl/pthread-pids.h: New file.
+	* sysdeps/nacl/createthread.c: Include <pthread-pids.h>.
+	(create_thread): Use __nacl_get_tid to initialize PD->tid.
+
+	* nptl/pthread-pids.h: New file.
+	* sysdeps/unix/sysv/linux/pthread-pids.h: New file.
+	* nptl/nptl-init.c: Include <pthread-pids.h>.
+	(__pthread_initialize_minimal_internal):
+	Call __pthread_initialize_pids instead of set_tid_address syscall.
+
 	* sysdeps/unix/sysv/linux/usleep.c: Moved to ...
 	* sysdeps/posix/usleep.c: ... here.
 
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index 1ad41c5..5b8d931 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -36,6 +36,7 @@
 #include <lowlevellock.h>
 #include <kernel-features.h>
 #include <libc-internal.h>
+#include <pthread-pids.h>
 
 #ifndef TLS_MULTIPLE_THREADS_IN_TCB
 /* Pointer to the corresponding variable in libc.  */
@@ -311,10 +312,7 @@ __pthread_initialize_minimal_internal (void)
 
   /* Minimal initialization of the thread descriptor.  */
   struct pthread *pd = THREAD_SELF;
-#ifdef __NR_set_tid_address
-  INTERNAL_SYSCALL_DECL (err);
-  pd->pid = pd->tid = INTERNAL_SYSCALL (set_tid_address, err, 1, &pd->tid);
-#endif
+  __pthread_initialize_pids (pd);
   THREAD_SETMEM (pd, specific[0], &pd->specific_1stblock[0]);
   THREAD_SETMEM (pd, user_stack, true);
   if (LLL_LOCK_INITIALIZER != 0)
diff --git a/nptl/pthread-pids.h b/nptl/pthread-pids.h
new file mode 100644
index 0000000..33d764c
--- /dev/null
+++ b/nptl/pthread-pids.h
@@ -0,0 +1,29 @@
+/* Initialize pid and tid fields of struct pthread.  Stub version.
+   Copyright (C) 2015 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>
+
+/* Initialize PD->pid and PD->tid for the initial thread.  If there is
+   setup required to arrange that __exit_thread causes PD->tid to be
+   cleared and futex-woken, then this function should do that as well.  */
+static inline void
+__pthread_initialize_pids (struct pthread *pd)
+{
+#error "sysdeps pthread-pids.h file required"
+  pd->pid = pd->tid = -1;
+}
diff --git a/sysdeps/nacl/createthread.c b/sysdeps/nacl/createthread.c
index 9df4eae..9d9284a 100644
--- a/sysdeps/nacl/createthread.c
+++ b/sysdeps/nacl/createthread.c
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <nacl-interfaces.h>
+#include <pthread-pids.h>
 
 /* See the comments in pthread_create.c for the requirements for these
    two macros and the create_thread function.  */
@@ -33,6 +34,8 @@ static int
 create_thread (struct pthread *pd, const struct pthread_attr *attr,
 	       bool stopped_start, STACK_VARIABLES_PARMS, bool *thread_ran)
 {
+  pd->tid = __nacl_get_tid (pd);
+
   pd->stopped_start = stopped_start;
   if (__glibc_unlikely (stopped_start))
     /* We make sure the thread does not run far by forcing it to get a
diff --git a/sysdeps/nacl/pthread-pids.h b/sysdeps/nacl/pthread-pids.h
new file mode 100644
index 0000000..ccb99d6
--- /dev/null
+++ b/sysdeps/nacl/pthread-pids.h
@@ -0,0 +1,65 @@
+/* Initialize pid and tid fields of struct pthread.  NaCl version.
+   Copyright (C) 2015 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>
+
+
+/* NaCl has no concept of PID or TID, nor even any notion of an
+   identifier for a thread within the process.  But various places in
+   the NPTL implementation rely on using the 'tid' field of the TCB
+   (struct pthread) as an identifier that is unique at least among all
+   live threads in the process.  So we must synthesize some number to
+   use.  Conveniently, the 'pthread_t' value itself is already unique
+   in exactly this way (because it's the 'struct pthread' pointer).
+
+   The only wrinkle is that 'tid' is a (32-bit) 'int' and its high
+   (sign) bit is used for special purposes, so we must be absolutely
+   sure that we never use a pointer value with the high bit set.  (It
+   also cannot be zero, but zero is never a valid pointer anyway.)
+   The NaCl sandbox models for 32-bit machines limit the address space
+   to less than 3GB (in fact, to 1GB), so it's already impossible that
+   a valid pointer will have its high bit set.  But the NaCl x86-64
+   sandbox model allows a full 4GB of address space, so we cannot
+   assume that an arbitrary pointer value will not have the high bit
+   set.  Conveniently, there are always unused bits in the pointer
+   value for a 'struct pthread', because it is always aligned to at
+   least 32 bits and so the low bits are always zero.  Hence, we can
+   safely avoid the danger of a nonzero high bit just by shifting the
+   pointer value right.  */
+
+static inline int
+__nacl_get_tid (struct pthread *pd)
+{
+  uintptr_t id = (uintptr_t) pd;
+  int tid = id >> 1;
+  assert ((id & 1) == 0);
+  assert (sizeof id == sizeof tid);
+  assert (tid > 0);
+  return tid;
+}
+
+
+/* Initialize PD->pid and PD->tid for the initial thread.  If there is
+   setup required to arrange that __exit_thread causes PD->tid to be
+   cleared and futex-woken, then this function should do that as well.  */
+static inline void
+__pthread_initialize_pids (struct pthread *pd)
+{
+  pd->tid = __nacl_get_tid (pd);
+  pd->pid = -1;
+}
diff --git a/sysdeps/unix/sysv/linux/pthread-pids.h b/sysdeps/unix/sysv/linux/pthread-pids.h
new file mode 100644
index 0000000..d333648
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/pthread-pids.h
@@ -0,0 +1,30 @@
+/* Initialize pid and tid fields of struct pthread.  Linux version.
+   Copyright (C) 2015 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>
+#include <sysdep.h>
+
+/* Initialize PD->pid and PD->tid for the initial thread.  If there is
+   setup required to arrange that __exit_thread causes PD->tid to be
+   cleared and futex-woken, then this function should do that as well.  */
+static inline void
+__pthread_initialize_pids (struct pthread *pd)
+{
+  INTERNAL_SYSCALL_DECL (err);
+  pd->pid = pd->tid = INTERNAL_SYSCALL (set_tid_address, err, 1, &pd->tid);
+}

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                              |   10 +++++
 nptl/nptl-init.c                       |    6 +--
 nptl/pthread-pids.h                    |   29 ++++++++++++++
 sysdeps/nacl/createthread.c            |    3 +
 sysdeps/nacl/pthread-pids.h            |   65 ++++++++++++++++++++++++++++++++
 sysdeps/unix/sysv/linux/pthread-pids.h |   30 +++++++++++++++
 6 files changed, 139 insertions(+), 4 deletions(-)
 create mode 100644 nptl/pthread-pids.h
 create mode 100644 sysdeps/nacl/pthread-pids.h
 create mode 100644 sysdeps/unix/sysv/linux/pthread-pids.h


hooks/post-receive
-- 
GNU C Library master sources


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