1  /* Copyright (C) 2004-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 License as
       6     published by the Free Software Foundation; either version 2.1 of the
       7     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; see the file COPYING.LIB.  If
      16     not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #ifndef _AIO_MISC_H
      19  # include_next <aio_misc.h>
      20  # include <limits.h>
      21  # include <pthread.h>
      22  # include <signal.h>
      23  # include <sysdep.h>
      24  
      25  # define aio_start_notify_thread __aio_start_notify_thread
      26  # define aio_create_helper_thread __aio_create_helper_thread
      27  
      28  extern inline void
      29  __aio_start_notify_thread (void)
      30  {
      31    sigset_t ss;
      32    sigemptyset (&ss);
      33    INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_SETMASK, &ss, NULL,
      34  			 __NSIG_BYTES);
      35  }
      36  
      37  extern inline int
      38  __aio_create_helper_thread (pthread_t *threadp, void *(*tf) (void *),
      39  			    void *arg)
      40  {
      41    pthread_attr_t attr;
      42  
      43    /* Make sure the thread is created detached.  */
      44    __pthread_attr_init (&attr);
      45    __pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
      46  
      47    /* The helper thread needs only very little resources.  */
      48    __pthread_attr_setstacksize (&attr, __pthread_get_minstack (&attr));
      49  
      50    /* Block all signals in the helper thread.  To do this thoroughly we
      51       temporarily have to block all signals here.  */
      52    sigset_t ss;
      53    sigset_t oss;
      54    sigfillset (&ss);
      55    INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_SETMASK, &ss, &oss,
      56  			 __NSIG_BYTES);
      57  
      58    int ret = __pthread_create (threadp, &attr, tf, arg);
      59  
      60    /* Restore the signal mask.  */
      61    INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_SETMASK, &oss, NULL,
      62  			 __NSIG_BYTES);
      63  
      64    __pthread_attr_destroy (&attr);
      65    return ret;
      66  }
      67  #endif