(root)/
glibc-2.38/
htl/
forward.c
       1  /* Libc stubs for pthread functions.  Hurd pthread version.
       2     Copyright (C) 2002-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library;  if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <errno.h>
      20  #include <dlfcn.h>
      21  #include <stdlib.h>
      22  #include <shlib-compat.h>
      23  #include <pthread-functions.h>
      24  #include <libc-lock.h>
      25  #include <pt-internal.h>
      26  
      27  /* Pointers to the libc functions.  */
      28  struct pthread_functions __libc_pthread_functions attribute_hidden;
      29  int __libc_pthread_functions_init attribute_hidden;
      30  
      31  
      32  #define FORWARD2(name, rettype, decl, params, defaction) \
      33  rettype									      \
      34  name decl								      \
      35  {									      \
      36    if (!__libc_pthread_functions_init)					      \
      37      defaction;								      \
      38  									      \
      39    return PTHFCT_CALL (ptr_##name, params);				      \
      40  }
      41  
      42  /* Same as FORWARD2, only without return.  */
      43  #define FORWARD_NORETURN(name, rettype, decl, params, defaction) \
      44  rettype									      \
      45  name decl								      \
      46  {									      \
      47    if (!__libc_pthread_functions_init)					      \
      48      defaction;								      \
      49  									      \
      50    PTHFCT_CALL (ptr_##name, params);					      \
      51  }
      52  
      53  #define FORWARD(name, decl, params, defretval) \
      54    FORWARD2 (name, int, decl, params, return defretval)
      55  
      56  FORWARD (pthread_attr_destroy, (pthread_attr_t *attr), (attr), 0)
      57  
      58  FORWARD (pthread_attr_init, (pthread_attr_t *attr), (attr), 0)
      59  
      60  FORWARD (pthread_attr_getdetachstate,
      61  	 (const pthread_attr_t *attr, int *detachstate), (attr, detachstate),
      62  	 0)
      63  FORWARD (pthread_attr_setdetachstate, (pthread_attr_t *attr, int detachstate),
      64  	 (attr, detachstate), 0)
      65  
      66  FORWARD (pthread_attr_getinheritsched,
      67  	 (const pthread_attr_t *attr, int *inherit), (attr, inherit), 0)
      68  FORWARD (pthread_attr_setinheritsched, (pthread_attr_t *attr, int inherit),
      69  	 (attr, inherit), 0)
      70  
      71  FORWARD (pthread_attr_getschedparam,
      72  	 (const pthread_attr_t *attr, struct sched_param *param),
      73  	 (attr, param), 0)
      74  FORWARD (pthread_attr_setschedparam,
      75  	 (pthread_attr_t *attr, const struct sched_param *param),
      76  	 (attr, param), 0)
      77  
      78  FORWARD (pthread_attr_getschedpolicy,
      79  	 (const pthread_attr_t *attr, int *policy), (attr, policy), 0)
      80  FORWARD (pthread_attr_setschedpolicy, (pthread_attr_t *attr, int policy),
      81  	 (attr, policy), 0)
      82  
      83  FORWARD (pthread_attr_getscope,
      84  	 (const pthread_attr_t *attr, int *scope), (attr, scope), 0)
      85  FORWARD (pthread_attr_setscope, (pthread_attr_t *attr, int scope),
      86  	 (attr, scope), 0)
      87  
      88  
      89  FORWARD (pthread_condattr_destroy, (pthread_condattr_t *attr), (attr), 0)
      90  FORWARD (pthread_condattr_init, (pthread_condattr_t *attr), (attr), 0)
      91  
      92  
      93  FORWARD (pthread_cond_broadcast, (pthread_cond_t *cond), (cond), 0)
      94  FORWARD (pthread_cond_destroy, (pthread_cond_t *cond), (cond), 0)
      95  FORWARD (pthread_cond_init,
      96  	 (pthread_cond_t *cond, const pthread_condattr_t *cond_attr),
      97  	 (cond, cond_attr), 0)
      98  FORWARD (pthread_cond_signal, (pthread_cond_t *cond), (cond), 0)
      99  FORWARD (pthread_cond_wait, (pthread_cond_t *cond, pthread_mutex_t *mutex),
     100  	 (cond, mutex), 0)
     101  FORWARD (pthread_cond_timedwait,
     102  	 (pthread_cond_t *cond, pthread_mutex_t *mutex,
     103  	  const struct timespec *abstime), (cond, mutex, abstime), 0)
     104  
     105  FORWARD (pthread_equal, (pthread_t thread1, pthread_t thread2),
     106  	 (thread1, thread2), 1)
     107  
     108  
     109  /* Use an alias to avoid warning, as pthread_exit is declared noreturn.  */
     110  FORWARD_NORETURN (__pthread_exit, void, (void *retval), (retval),
     111  		  exit (EXIT_SUCCESS))
     112  strong_alias (__pthread_exit, pthread_exit);
     113  
     114  
     115  FORWARD (pthread_getschedparam,
     116  	 (pthread_t target_thread, int *policy, struct sched_param *param),
     117  	 (target_thread, policy, param), 0)
     118  FORWARD (pthread_setschedparam,
     119  	 (pthread_t target_thread, int policy,
     120  	  const struct sched_param *param), (target_thread, policy, param), 0)
     121  
     122  
     123  FORWARD (pthread_mutex_destroy, (pthread_mutex_t *mutex), (mutex), 0)
     124  
     125  FORWARD (pthread_mutex_init,
     126  	 (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr),
     127  	 (mutex, mutexattr), 0)
     128  
     129  FORWARD (pthread_mutex_lock, (pthread_mutex_t *mutex), (mutex), 0)
     130  
     131  FORWARD (pthread_mutex_unlock, (pthread_mutex_t *mutex), (mutex), 0)
     132  
     133  FORWARD (__pthread_setcancelstate, (int state, int *oldstate),
     134  	 (state, oldstate), 0)
     135  strong_alias (__pthread_setcancelstate, pthread_setcancelstate);
     136  
     137  FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0)
     138  
     139  FORWARD2 (__pthread_get_cleanup_stack, struct __pthread_cancelation_handler **,
     140  	  (void), (), return &__pthread_cleanup_stack);