39 static size_t rz_size;
40 static size_t usable_stack_size;
41 static char *last_stack;
62 return tid ? &errnos[tid - 1] : &errno0;
87 if (
ngx_ncpu > 1 && tries++ < 1000) {
95 if (ngx_atomic_cmp_set(lock, 0, 1)) {
128 char *stack, *stack_top;
130 if (nthreads >= max_threads) {
132 "no more than %ui threads can be created", max_threads);
138 stack = mmap(last_stack, usable_stack_size, PROT_READ|PROT_WRITE,
141 if (stack == MAP_FAILED) {
143 "mmap(%p:%uz, MAP_STACK) thread stack failed",
144 last_stack, usable_stack_size);
148 if (stack != last_stack) {
150 "stack %p address was changed to %p", last_stack, stack);
154 stack_top = stack + usable_stack_size;
157 "thread stack: %p-%p", stack, stack_top);
185 char *red_zone, *zone;
192 for (i = 0; i < n; i++) {
194 sa.sa_handler = SIG_IGN;
195 sigemptyset(&sa.sa_mask);
208 "sysctlbyname(kern.usrstack) failed");
217 "usrstack: %p red zone: %p",
220 zone = mmap(red_zone, rz_size, PROT_NONE, MAP_ANON, -1, 0);
221 if (zone == MAP_FAILED) {
223 "mmap(%p:%uz, PROT_NONE, MAP_ANON) red zone failed",
228 if (zone != red_zone) {
230 "red zone %p address was changed to %p", red_zone, zone);
237 if (errnos == NULL) {
260 last_stack = zone + rz_size;
261 usable_stack_size = size;
332 m->semid = semget(IPC_PRIVATE, 1, SEM_R|SEM_A);
333 if (m->semid == -1) {
340 if (semctl(m->semid, 0, SETVAL, op) == -1) {
343 if (semctl(m->semid, 0, IPC_RMID) == -1) {
345 "semctl(IPC_RMID) failed");
358 if (semctl(m->
semid, 0, IPC_RMID) == -1) {
360 "semctl(IPC_RMID) failed");
381 "try lock mutex %p lock:%XD", m, m->
lock);
384 "lock mutex %p lock:%XD", m, m->
lock);
398 if (
ngx_ncpu > 1 && tries++ < 1000) {
406 if (m->
semid == -1) {
415 "mutex %p lock:%XD", m, m->
lock);
424 if ((lock & ~NGX_MUTEX_LOCK_BUSY) > nthreads) {
426 "%D threads wait for mutex %p, "
427 "while only %ui threads are available",
428 lock & ~NGX_MUTEX_LOCK_BUSY, m, nthreads);
432 if (ngx_atomic_cmp_set(&m->
lock, old, lock)) {
435 "wait mutex %p lock:%XD", m, m->
lock);
448 if (semop(m->
semid, &op, 1) == -1) {
450 "semop() failed while waiting on mutex %p", m);
455 "mutex waked up %p lock:%XD", m, m->
lock);
467 if (ngx_atomic_cmp_set(&m->
lock, old, lock)) {
477 if (tries++ > 1000) {
480 "mutex %p is contested", m);
492 "mutex %p is locked, lock:%XD", m, m->
lock);
512 "trying to unlock the free mutex %p", m);
520 "unlock mutex %p lock:%XD", m, old);
524 lock = old & ~NGX_MUTEX_LOCK_BUSY;
526 if (ngx_atomic_cmp_set(&m->
lock, old, lock)) {
533 if (m->
semid == -1) {
535 "mutex %p is unlocked", m);
545 if (old & NGX_MUTEX_LOCK_BUSY) {
560 if (ngx_atomic_cmp_set(&m->
lock, old, lock)) {
565 "wake up mutex %p", m);
571 if (semop(m->
semid, &op, 1) == -1) {
573 "semop() failed while waking up on mutex %p", m);
584 "mutex %p is unlocked", m);
612 if (close(cv->
kq) == -1) {
614 "kqueue close() failed");
646 "cv kq:%d signo:%d", cv->
kq, cv->
signo);
648 kev.ident = cv->
signo;
649 kev.filter = EVFILT_SIGNAL;
658 if (kevent(cv->
kq, &kev, 1, NULL, 0, &ts) == -1) {
669 "cv %p wait, kq:%d, signo:%d", cv, cv->
kq, cv->
signo);
672 n = kevent(cv->
kq, NULL, 0, &kev, 1, NULL);
675 "cv %p kevent: %d", cv, n);
681 "kevent() failed while waiting condition variable %p",
693 "kevent() returned no events "
694 "while waiting condition variable %p",
699 if (kev.filter != EVFILT_SIGNAL) {
701 "kevent() returned unexpected events: %d "
702 "while waiting condition variable %p",
707 if (kev.ident != (uintptr_t) cv->
signo) {
709 "kevent() returned unexpected signal: %d ",
710 "while waiting condition variable %p",
732 "cv %p to signal %P %d",
739 if (kill(cv->
tid, cv->
signo) == -1) {
744 "kill() failed while signaling condition variable %p", cv);