1 /* Copyright (C) 2002-2013 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3 Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
27 #include "kernel-features.h"
30 #define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD)
32 /* Unless otherwise specified, the thread "register" is going to be
33 initialized with a pointer to the TCB. */
39 # define ARCH_CLONE __clone
43 #ifndef TLS_MULTIPLE_THREADS_IN_TCB
44 /* Pointer to the corresponding variable in libc. */
45 int *__libc_multiple_threads_ptr attribute_hidden
;
50 do_clone (struct pthread
*pd
, const struct pthread_attr
*attr
,
51 int clone_flags
, int (*fct
) (void *), STACK_VARIABLES_PARMS
,
58 if (__builtin_expect (stopped
!= 0, 0))
59 /* We make sure the thread does not run far by forcing it to get a
60 lock. We lock it here too so that the new thread cannot continue
61 until we tell it to. */
62 lll_lock (pd
->lock
, LLL_PRIVATE
);
64 /* One more thread. We cannot have the thread do this itself, since it
65 might exist but not have been scheduled yet by the time we've returned
66 and need to check the value to behave correctly. We must do it before
67 creating the thread, in case it does get scheduled first and then
68 might mistakenly think it was the only thread. In the failure case,
69 we momentarily store a false value; this doesn't matter because there
70 is no kosher thing a signal handler interrupting us right here can do
71 that cares whether the thread count is correct. */
72 atomic_increment (&__nptl_nthreads
);
74 int rc
= ARCH_CLONE (fct
, STACK_VARIABLES_ARGS
, clone_flags
,
75 pd
, &pd
->tid
, TLS_VALUE
, &pd
->tid
);
77 if (__builtin_expect (rc
== -1, 0))
79 atomic_decrement (&__nptl_nthreads
); /* Oops, we lied for a second. */
81 /* Perhaps a thread wants to change the IDs and if waiting
82 for this stillborn thread. */
83 if (__builtin_expect (atomic_exchange_acq (&pd
->setxid_futex
, 0)
85 lll_futex_wake (&pd
->setxid_futex
, 1, LLL_PRIVATE
);
87 /* Free the resources. */
88 __deallocate_stack (pd
);
90 /* We have to translate error codes. */
91 return errno
== ENOMEM
? EAGAIN
: errno
;
94 /* Now we have the possibility to set scheduling parameters etc. */
95 if (__builtin_expect (stopped
!= 0, 0))
97 INTERNAL_SYSCALL_DECL (err
);
100 /* Set the affinity mask if necessary. */
101 if (attr
->cpuset
!= NULL
)
103 res
= INTERNAL_SYSCALL (sched_setaffinity
, err
, 3, pd
->tid
,
104 attr
->cpusetsize
, attr
->cpuset
);
106 if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res
, err
), 0))
108 /* The operation failed. We have to kill the thread. First
109 send it the cancellation signal. */
110 INTERNAL_SYSCALL_DECL (err2
);
112 (void) INTERNAL_SYSCALL (tgkill
, err2
, 3,
113 THREAD_GETMEM (THREAD_SELF
, pid
),
116 /* We do not free the stack here because the canceled thread
117 itself will do this. */
119 return (INTERNAL_SYSCALL_ERROR_P (res
, err
)
120 ? INTERNAL_SYSCALL_ERRNO (res
, err
)
125 /* Set the scheduling parameters. */
126 if ((attr
->flags
& ATTR_FLAG_NOTINHERITSCHED
) != 0)
128 res
= INTERNAL_SYSCALL (sched_setscheduler
, err
, 3, pd
->tid
,
129 pd
->schedpolicy
, &pd
->schedparam
);
131 if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res
, err
), 0))
136 /* We now have for sure more than one thread. The main thread might
137 not yet have the flag set. No need to set the global variable
138 again if this is what we use. */
139 THREAD_SETMEM (THREAD_SELF
, header
.multiple_threads
, 1);
146 create_thread (struct pthread
*pd
, const struct pthread_attr
*attr
,
147 STACK_VARIABLES_PARMS
)
150 assert (pd
->header
.tcb
!= NULL
);
153 /* We rely heavily on various flags the CLONE function understands:
155 CLONE_VM, CLONE_FS, CLONE_FILES
156 These flags select semantics with shared address space and
157 file descriptors according to what POSIX requires.
160 This flag selects the POSIX signal semantics.
163 The sixth parameter to CLONE determines the TLS area for the
167 The kernels writes the thread ID of the newly created thread
168 into the location pointed to by the fifth parameters to CLONE.
170 Note that it would be semantically equivalent to use
171 CLONE_CHILD_SETTID but it is be more expensive in the kernel.
174 The kernels clears the thread ID of a thread that has called
175 sys_exit() in the location pointed to by the seventh parameter
178 The termination signal is chosen to be zero which means no signal
180 int clone_flags
= (CLONE_VM
| CLONE_FS
| CLONE_FILES
| CLONE_SIGNAL
181 | CLONE_SETTLS
| CLONE_PARENT_SETTID
182 | CLONE_CHILD_CLEARTID
| CLONE_SYSVSEM
185 if (__builtin_expect (THREAD_GETMEM (THREAD_SELF
, report_events
), 0))
187 /* The parent thread is supposed to report events. Check whether
188 the TD_CREATE event is needed, too. */
189 const int _idx
= __td_eventword (TD_CREATE
);
190 const uint32_t _mask
= __td_eventmask (TD_CREATE
);
192 if ((_mask
& (__nptl_threads_events
.event_bits
[_idx
]
193 | pd
->eventbuf
.eventmask
.event_bits
[_idx
])) != 0)
195 /* We always must have the thread start stopped. */
196 pd
->stopped_start
= true;
198 /* Create the thread. We always create the thread stopped
199 so that it does not get far before we tell the debugger. */
200 int res
= do_clone (pd
, attr
, clone_flags
, start_thread
,
201 STACK_VARIABLES_ARGS
, 1);
204 /* Now fill in the information about the new thread in
205 the newly created thread's data structure. We cannot let
206 the new thread do this since we don't know whether it was
207 already scheduled when we send the event. */
208 pd
->eventbuf
.eventnum
= TD_CREATE
;
209 pd
->eventbuf
.eventdata
= pd
;
211 /* Enqueue the descriptor. */
213 pd
->nextevent
= __nptl_last_event
;
214 while (atomic_compare_and_exchange_bool_acq (&__nptl_last_event
,
218 /* Now call the function which signals the event. */
219 __nptl_create_event ();
221 /* And finally restart the new thread. */
222 lll_unlock (pd
->lock
, LLL_PRIVATE
);
229 #ifdef NEED_DL_SYSINFO
230 assert (THREAD_SELF_SYSINFO
== THREAD_SYSINFO (pd
));
233 /* Determine whether the newly created threads has to be started
234 stopped since we have to set the scheduling parameters or set the
236 bool stopped
= false;
237 if (attr
!= NULL
&& (attr
->cpuset
!= NULL
238 || (attr
->flags
& ATTR_FLAG_NOTINHERITSCHED
) != 0))
240 pd
->stopped_start
= stopped
;
241 pd
->parent_cancelhandling
= THREAD_GETMEM (THREAD_SELF
, cancelhandling
);
243 /* Actually create the thread. */
244 int res
= do_clone (pd
, attr
, clone_flags
, start_thread
,
245 STACK_VARIABLES_ARGS
, stopped
);
247 if (res
== 0 && stopped
)
248 /* And finally restart the new thread. */
249 lll_unlock (pd
->lock
, LLL_PRIVATE
);