(root)/
glibc-2.38/
nptl/
pthread_sigmask.c
       1  /* Copyright (C) 2002-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <signal.h>
      19  #include <pthreadP.h>
      20  #include <sysdep.h>
      21  #include <shlib-compat.h>
      22  
      23  int
      24  __pthread_sigmask (int how, const sigset_t *newmask, sigset_t *oldmask)
      25  {
      26    sigset_t local_newmask;
      27  
      28    /* The only thing we have to make sure here is that SIGCANCEL and
      29       SIGSETXID is not blocked.  */
      30    if (newmask != NULL
      31        && (__glibc_unlikely (__sigismember (newmask, SIGCANCEL))
      32           || __glibc_unlikely (__sigismember (newmask, SIGSETXID))))
      33      {
      34        local_newmask = *newmask;
      35        clear_internal_signals (&local_newmask);
      36        newmask = &local_newmask;
      37      }
      38  
      39    /* We know that realtime signals are available if NPTL is used.  */
      40    int result = INTERNAL_SYSCALL_CALL (rt_sigprocmask, how, newmask,
      41  				      oldmask, __NSIG_BYTES);
      42  
      43    return (INTERNAL_SYSCALL_ERROR_P (result)
      44  	  ? INTERNAL_SYSCALL_ERRNO (result)
      45  	  : 0);
      46  }
      47  libc_hidden_def (__pthread_sigmask)
      48  
      49  versioned_symbol (libc, __pthread_sigmask, pthread_sigmask, GLIBC_2_32);
      50  #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_32)
      51  strong_alias (__pthread_sigmask, __pthread_sigmask_2);
      52  compat_symbol (libc, __pthread_sigmask_2, pthread_sigmask, GLIBC_2_0);
      53  #endif