/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ │ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ │ above copyright notice and this permission notice appear in all copies. │ │ │ │ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ │ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ │ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ │ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ │ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ │ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/str/str.h" #include "libc/thread/thread2.h" /** * Sets signal mask on thread attributes object. * * For example, to spawn a thread that won't interfere with signals: * * pthread_t id; * sigset_t mask; * pthread_attr_t attr; * sigfillset(&mask); * pthread_attr_init(&attr); * pthread_attr_setsigmask_np(&attr, &mask); * pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); * pthread_create(&id, &attr, Worker, 0); * pthread_attr_destroy(&attr); * * @param attr is the thread attributes object * @param sigmask will be copied into attributes, or if it's null, then * the existing signal mask presence on the object will be cleared * @return 0 on success, or errno on error */ errno_t pthread_attr_setsigmask_np(pthread_attr_t *attr, const sigset_t *sigmask) { _Static_assert(sizeof(attr->__sigmask) == sizeof(*sigmask), ""); if (sigmask) { attr->__havesigmask = true; memcpy(attr->__sigmask, sigmask, sizeof(*sigmask)); } else { attr->__havesigmask = false; } return 0; }