diff options
author | Roland McGrath <roland@hack.frob.com> | 2014-12-17 10:35:02 -0800 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2014-12-17 10:35:02 -0800 |
commit | 3a0a6b73bcc929f2a1167c7c23d36f630fdc615f (patch) | |
tree | 216ba382241b832c1af26fa84ce25576e0f96571 | |
parent | ccca0e6e2bd824370e4b9d98893324bfd532cf91 (diff) | |
download | glibc-3a0a6b73bcc929f2a1167c7c23d36f630fdc615f.tar.gz glibc-3a0a6b73bcc929f2a1167c7c23d36f630fdc615f.tar.xz glibc-3a0a6b73bcc929f2a1167c7c23d36f630fdc615f.zip |
NPTL thread creation
-rw-r--r-- | sysdeps/nacl/createthread.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/sysdeps/nacl/createthread.c b/sysdeps/nacl/createthread.c new file mode 100644 index 0000000000..89a58a7807 --- /dev/null +++ b/sysdeps/nacl/createthread.c @@ -0,0 +1,46 @@ +/* Low-level thread creation for NPTL. NaCl version. + Copyright (C) 2014 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 <nacl-interfaces.h> + +/* See the comments in pthread_create.c for the requirements for these + two macros and the create_thread function. */ + +#define START_THREAD_DEFN \ + static void __attribute__ ((noreturn)) start_thread (void) +#define START_THREAD_SELF THREAD_SELF + +/* pthread_create.c defines this using START_THREAD_DEFN + We need a forward declaration here so we can take its address. */ +static void start_thread (void) __attribute__ ((noreturn)); + +static int +create_thread (struct pthread *pd, const struct pthread_attr *attr, + bool stopped_start, STACK_VARIABLES_PARMS, bool *thread_ran) +{ + 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 + lock. We lock it here too so that the new thread cannot continue + until we tell it to. */ + lll_lock (pd->lock, LLL_PRIVATE); + + TLS_DEFINE_INIT_TP (tp, pd); + + return __nacl_irt_thread.thread_create (&start_thread, stackaddr, tp); +} |