Lines Matching +full:parent +full:- +full:locked

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
43 #include "un-namespace.h"
68 int i, cpusetsize, create_suspended, locked, old_stack_prot, ret; in _pthread_create() local
90 new_thread->attr = _pthread_attr_default; in _pthread_create()
92 new_thread->attr = *(*attr); in _pthread_create()
93 cpusetp = new_thread->attr.cpuset; in _pthread_create()
94 cpusetsize = new_thread->attr.cpusetsize; in _pthread_create()
95 new_thread->attr.cpuset = NULL; in _pthread_create()
96 new_thread->attr.cpusetsize = 0; in _pthread_create()
98 if (new_thread->attr.sched_inherit == PTHREAD_INHERIT_SCHED) { in _pthread_create()
100 if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM) in _pthread_create()
101 new_thread->attr.flags |= PTHREAD_SCOPE_SYSTEM; in _pthread_create()
103 new_thread->attr.flags &= ~PTHREAD_SCOPE_SYSTEM; in _pthread_create()
105 new_thread->attr.prio = curthread->attr.prio; in _pthread_create()
106 new_thread->attr.sched_policy = curthread->attr.sched_policy; in _pthread_create()
109 new_thread->tid = TID_TERMINATED; in _pthread_create()
112 if (create_stack(&new_thread->attr) != 0) { in _pthread_create()
121 new_thread->magic = THR_MAGIC; in _pthread_create()
122 new_thread->start_routine = start_routine; in _pthread_create()
123 new_thread->arg = arg; in _pthread_create()
124 new_thread->cancel_enable = 1; in _pthread_create()
125 new_thread->cancel_async = 0; in _pthread_create()
128 TAILQ_INIT(&new_thread->mq[i]); in _pthread_create()
131 if (new_thread->attr.suspend == THR_CREATE_SUSPENDED) { in _pthread_create()
132 new_thread->flags = THR_FLAGS_NEED_SUSPEND; in _pthread_create()
138 new_thread->state = PS_RUNNING; in _pthread_create()
140 if (new_thread->attr.flags & PTHREAD_CREATE_DETACHED) in _pthread_create()
141 new_thread->flags |= THR_FLAGS_DETACHED; in _pthread_create()
144 new_thread->refcount = 1; in _pthread_create()
158 locked = 1; in _pthread_create()
160 locked = 0; in _pthread_create()
163 param.stack_base = new_thread->attr.stackaddr_attr; in _pthread_create()
164 param.stack_size = new_thread->attr.stacksize_attr; in _pthread_create()
165 param.tls_base = (char *)new_thread->tcb; in _pthread_create()
167 param.child_tid = &new_thread->tid; in _pthread_create()
168 param.parent_tid = &new_thread->tid; in _pthread_create()
170 if (new_thread->attr.flags & PTHREAD_SCOPE_SYSTEM) in _pthread_create()
172 if (new_thread->attr.sched_inherit == PTHREAD_INHERIT_SCHED) in _pthread_create()
175 sched_param.sched_priority = new_thread->attr.prio; in _pthread_create()
176 _schedparam_to_rtp(new_thread->attr.sched_policy, in _pthread_create()
186 new_thread->sigmask = oset; in _pthread_create()
187 SIGDELSET(new_thread->sigmask, SIGCANCEL); in _pthread_create()
195 * Translate EPROCLIM into well-known POSIX code EAGAIN. in _pthread_create()
205 if (!locked) in _pthread_create()
207 new_thread->state = PS_DEAD; in _pthread_create()
208 new_thread->tid = TID_TERMINATED; in _pthread_create()
209 new_thread->flags |= THR_FLAGS_DETACHED; in _pthread_create()
210 new_thread->refcount--; in _pthread_create()
211 if (new_thread->flags & THR_FLAGS_NEED_SUSPEND) { in _pthread_create()
212 new_thread->cycle++; in _pthread_create()
213 _thr_umtx_wake(&new_thread->cycle, INT_MAX, 0); in _pthread_create()
216 atomic_add_int(&_thread_active_threads, -1); in _pthread_create()
217 } else if (locked) { in _pthread_create()
223 new_thread->force_exit = 1; in _pthread_create()
224 new_thread->flags |= THR_FLAGS_DETACHED; in _pthread_create()
246 if ((pattr->stackaddr_attr) != NULL) { in create_stack()
247 pattr->guardsize_attr = 0; in create_stack()
248 pattr->flags |= THR_STACK_USER; in create_stack()
261 if (curthread->attr.suspend == THR_CREATE_SUSPENDED) in thread_start()
262 set = curthread->sigmask; in thread_start()
266 * This is used as a serialization point to allow parent in thread_start()
268 * attributes before the new thread does real-world work. in thread_start()
273 if (curthread->force_exit) in thread_start()
276 if (curthread->attr.suspend == THR_CREATE_SUSPENDED) { in thread_start()
283 * Parent thread have stored signal mask for us, in thread_start()
290 curthread->unwind_stackend = (char *)curthread->attr.stackaddr_attr + in thread_start()
291 curthread->attr.stacksize_attr; in thread_start()
294 curthread->uexterr.ver = UEXTERROR_VER; in thread_start()
296 exterrctl(EXTERRCTL_ENABLE, 0, &curthread->uexterr); in thread_start()
299 _pthread_exit(curthread->start_routine(curthread->arg)); in thread_start()