struct hurd_sigstate * _hurd_thread_sigstate (thread_t thread) { struct hurd_sigstate *ss; __mutex_lock (&_hurd_siglock); for (ss = _hurd_sigstates; ss != NULL; ss = ss->next) if (ss->thread == thread) break; if (ss == NULL) { ss = malloc (sizeof (*ss)); if (ss == NULL) __libc_fatal ("hurd: Can't allocate sigstate\n"); ss->thread = thread; __spin_lock_init (&ss->lock); /* Initialize default state. */ __sigemptyset (&ss->blocked); __sigemptyset (&ss->pending); memset (&ss->sigaltstack, 0, sizeof (ss->sigaltstack)); ss->preemptors = NULL; ss->suspended = MACH_PORT_NULL; ss->intr_port = MACH_PORT_NULL; ss->context = NULL; if (thread == MACH_PORT_NULL) { /* Process-wide sigstate, use the system defaults. */ default_sigaction (ss->actions); /* The global sigstate is not added to the _hurd_sigstates list. It is created with _hurd_thread_sigstate (MACH_PORT_NULL) but should be accessed through _hurd_global_sigstate. */ } else { /* Use the global actions as a default for new threads. */ struct hurd_sigstate *s = _hurd_global_sigstate; if (s) { __spin_lock (&s->lock); memcpy (ss->actions, s->actions, sizeof (s->actions)); __spin_unlock (&s->lock); } else default_sigaction (ss->actions); ss->next = _hurd_sigstates; _hurd_sigstates = ss; } } __mutex_unlock (&_hurd_siglock); return ss; }
struct hurd_sigstate * _hurd_thread_sigstate (thread_t thread) { struct hurd_sigstate *ss; __mutex_lock (&_hurd_siglock); for (ss = _hurd_sigstates; ss != NULL; ss = ss->next) if (ss->thread == thread) break; if (ss == NULL) { ss = malloc (sizeof (*ss)); if (ss == NULL) __libc_fatal ("hurd: Can't allocate thread sigstate\n"); ss->thread = thread; __spin_lock_init (&ss->lock); /* Initialize default state. */ __sigemptyset (&ss->blocked); __sigemptyset (&ss->pending); memset (&ss->sigaltstack, 0, sizeof (ss->sigaltstack)); ss->sigaltstack.ss_flags |= SS_DISABLE; ss->preemptors = NULL; ss->suspended = MACH_PORT_NULL; ss->intr_port = MACH_PORT_NULL; ss->context = NULL; /* Initialize the sigaction vector from the default signal receiving thread's state, and its from the system defaults. */ if (thread == _hurd_sigthread) default_sigaction (ss->actions); else { struct hurd_sigstate *s; for (s = _hurd_sigstates; s != NULL; s = s->next) if (s->thread == _hurd_sigthread) break; if (s) { __spin_lock (&s->lock); memcpy (ss->actions, s->actions, sizeof (s->actions)); __spin_unlock (&s->lock); } else default_sigaction (ss->actions); } ss->next = _hurd_sigstates; _hurd_sigstates = ss; } __mutex_unlock (&_hurd_siglock); return ss; }