LCOV - code coverage report
Current view: top level - usr/include - pthread.h (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 4 4 100.0 %
Date: 2024-04-21 15:09:00 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /* Copyright (C) 2002-2022 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             : #ifndef _PTHREAD_H
      19             : #define _PTHREAD_H      1
      20             : 
      21             : #include <features.h>
      22             : #include <sched.h>
      23             : #include <time.h>
      24             : 
      25             : #include <bits/endian.h>
      26             : #include <bits/pthreadtypes.h>
      27             : #include <bits/setjmp.h>
      28             : #include <bits/wordsize.h>
      29             : #include <bits/types/struct_timespec.h>
      30             : #include <bits/types/__sigset_t.h>
      31             : #include <bits/types/struct___jmp_buf_tag.h>
      32             : #ifdef __USE_MISC
      33             : # include <bits/pthread_stack_min-dynamic.h>
      34             : #endif
      35             : 
      36             : /* Detach state.  */
      37             : enum
      38             : {
      39             :   PTHREAD_CREATE_JOINABLE,
      40             : #define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE
      41             :   PTHREAD_CREATE_DETACHED
      42             : #define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED
      43             : };
      44             : 
      45             : 
      46             : /* Mutex types.  */
      47             : enum
      48             : {
      49             :   PTHREAD_MUTEX_TIMED_NP,
      50             :   PTHREAD_MUTEX_RECURSIVE_NP,
      51             :   PTHREAD_MUTEX_ERRORCHECK_NP,
      52             :   PTHREAD_MUTEX_ADAPTIVE_NP
      53             : #if defined __USE_UNIX98 || defined __USE_XOPEN2K8
      54             :   ,
      55             :   PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
      56             :   PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
      57             :   PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
      58             :   PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
      59             : #endif
      60             : #ifdef __USE_GNU
      61             :   /* For compatibility.  */
      62             :   , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP
      63             : #endif
      64             : };
      65             : 
      66             : 
      67             : #ifdef __USE_XOPEN2K
      68             : /* Robust mutex or not flags.  */
      69             : enum
      70             : {
      71             :   PTHREAD_MUTEX_STALLED,
      72             :   PTHREAD_MUTEX_STALLED_NP = PTHREAD_MUTEX_STALLED,
      73             :   PTHREAD_MUTEX_ROBUST,
      74             :   PTHREAD_MUTEX_ROBUST_NP = PTHREAD_MUTEX_ROBUST
      75             : };
      76             : #endif
      77             : 
      78             : 
      79             : #if defined __USE_POSIX199506 || defined __USE_UNIX98
      80             : /* Mutex protocols.  */
      81             : enum
      82             : {
      83             :   PTHREAD_PRIO_NONE,
      84             :   PTHREAD_PRIO_INHERIT,
      85             :   PTHREAD_PRIO_PROTECT
      86             : };
      87             : #endif
      88             : 
      89             : 
      90             : #define PTHREAD_MUTEX_INITIALIZER \
      91             :  { {  __PTHREAD_MUTEX_INITIALIZER (PTHREAD_MUTEX_TIMED_NP) } }
      92             : #ifdef __USE_GNU
      93             : # define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
      94             :  { {  __PTHREAD_MUTEX_INITIALIZER (PTHREAD_MUTEX_RECURSIVE_NP) } }
      95             : # define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
      96             :  { {  __PTHREAD_MUTEX_INITIALIZER (PTHREAD_MUTEX_ERRORCHECK_NP) } }
      97             : # define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
      98             :  { {  __PTHREAD_MUTEX_INITIALIZER (PTHREAD_MUTEX_ADAPTIVE_NP) } }
      99             : #endif
     100             : 
     101             : 
     102             : /* Read-write lock types.  */
     103             : #if defined __USE_UNIX98 || defined __USE_XOPEN2K
     104             : enum
     105             : {
     106             :   PTHREAD_RWLOCK_PREFER_READER_NP,
     107             :   PTHREAD_RWLOCK_PREFER_WRITER_NP,
     108             :   PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
     109             :   PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP
     110             : };
     111             : 
     112             : 
     113             : /* Read-write lock initializers.  */
     114             : # define PTHREAD_RWLOCK_INITIALIZER \
     115             :   { { __PTHREAD_RWLOCK_INITIALIZER (PTHREAD_RWLOCK_DEFAULT_NP) } }
     116             : # ifdef __USE_GNU
     117             : #  define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
     118             :   { { __PTHREAD_RWLOCK_INITIALIZER (PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP) } }
     119             : # endif
     120             : #endif  /* Unix98 or XOpen2K */
     121             : 
     122             : 
     123             : /* Scheduler inheritance.  */
     124             : enum
     125             : {
     126             :   PTHREAD_INHERIT_SCHED,
     127             : #define PTHREAD_INHERIT_SCHED   PTHREAD_INHERIT_SCHED
     128             :   PTHREAD_EXPLICIT_SCHED
     129             : #define PTHREAD_EXPLICIT_SCHED  PTHREAD_EXPLICIT_SCHED
     130             : };
     131             : 
     132             : 
     133             : /* Scope handling.  */
     134             : enum
     135             : {
     136             :   PTHREAD_SCOPE_SYSTEM,
     137             : #define PTHREAD_SCOPE_SYSTEM    PTHREAD_SCOPE_SYSTEM
     138             :   PTHREAD_SCOPE_PROCESS
     139             : #define PTHREAD_SCOPE_PROCESS   PTHREAD_SCOPE_PROCESS
     140             : };
     141             : 
     142             : 
     143             : /* Process shared or private flag.  */
     144             : enum
     145             : {
     146             :   PTHREAD_PROCESS_PRIVATE,
     147             : #define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
     148             :   PTHREAD_PROCESS_SHARED
     149             : #define PTHREAD_PROCESS_SHARED  PTHREAD_PROCESS_SHARED
     150             : };
     151             : 
     152             : 
     153             : 
     154             : /* Conditional variable handling.  */
     155             : #define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, {0, 0}, 0, 0, {0, 0} } }
     156             : 
     157             : 
     158             : /* Cleanup buffers */
     159             : struct _pthread_cleanup_buffer
     160             : {
     161             :   void (*__routine) (void *);             /* Function to call.  */
     162             :   void *__arg;                            /* Its argument.  */
     163             :   int __canceltype;                       /* Saved cancellation type. */
     164             :   struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions.  */
     165             : };
     166             : 
     167             : /* Cancellation */
     168             : enum
     169             : {
     170             :   PTHREAD_CANCEL_ENABLE,
     171             : #define PTHREAD_CANCEL_ENABLE   PTHREAD_CANCEL_ENABLE
     172             :   PTHREAD_CANCEL_DISABLE
     173             : #define PTHREAD_CANCEL_DISABLE  PTHREAD_CANCEL_DISABLE
     174             : };
     175             : enum
     176             : {
     177             :   PTHREAD_CANCEL_DEFERRED,
     178             : #define PTHREAD_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED
     179             :   PTHREAD_CANCEL_ASYNCHRONOUS
     180             : #define PTHREAD_CANCEL_ASYNCHRONOUS     PTHREAD_CANCEL_ASYNCHRONOUS
     181             : };
     182             : #define PTHREAD_CANCELED ((void *) -1)
     183             : 
     184             : 
     185             : /* Single execution handling.  */
     186             : #define PTHREAD_ONCE_INIT 0
     187             : 
     188             : 
     189             : #ifdef __USE_XOPEN2K
     190             : /* Value returned by 'pthread_barrier_wait' for one of the threads after
     191             :    the required number of threads have called this function.
     192             :    -1 is distinct from 0 and all errno constants */
     193             : # define PTHREAD_BARRIER_SERIAL_THREAD -1
     194             : #endif
     195             : 
     196             : 
     197             : __BEGIN_DECLS
     198             : 
     199             : /* Create a new thread, starting with execution of START-ROUTINE
     200             :    getting passed ARG.  Creation attributed come from ATTR.  The new
     201             :    handle is stored in *NEWTHREAD.  */
     202        4657 : extern int pthread_create (pthread_t *__restrict __newthread,
     203             :                            const pthread_attr_t *__restrict __attr,
     204             :                            void *(*__start_routine) (void *),
     205             :                            void *__restrict __arg) __THROWNL __nonnull ((1, 3));
     206             : 
     207             : /* Terminate calling thread.
     208             : 
     209             :    The registered cleanup handlers are called via exception handling
     210             :    so we cannot mark this function with __THROW.*/
     211          64 : extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__));
     212             : 
     213             : /* Make calling thread wait for termination of the thread TH.  The
     214             :    exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN
     215             :    is not NULL.
     216             : 
     217             :    This function is a cancellation point and therefore not marked with
     218             :    __THROW.  */
     219             : extern int pthread_join (pthread_t __th, void **__thread_return);
     220             : 
     221             : #ifdef __USE_GNU
     222             : /* Check whether thread TH has terminated.  If yes return the status of
     223             :    the thread in *THREAD_RETURN, if THREAD_RETURN is not NULL.  */
     224             : extern int pthread_tryjoin_np (pthread_t __th, void **__thread_return) __THROW;
     225             : 
     226             : # ifndef __USE_TIME_BITS64
     227             : /* Make calling thread wait for termination of the thread TH, but only
     228             :    until TIMEOUT.  The exit status of the thread is stored in
     229             :    *THREAD_RETURN, if THREAD_RETURN is not NULL.
     230             : 
     231             :    This function is a cancellation point and therefore not marked with
     232             :    __THROW.  */
     233             : extern int pthread_timedjoin_np (pthread_t __th, void **__thread_return,
     234             :                                  const struct timespec *__abstime);
     235             : 
     236             : /* Make calling thread wait for termination of the thread TH, but only
     237             :    until TIMEOUT measured against the clock specified by CLOCKID.  The
     238             :    exit status of the thread is stored in *THREAD_RETURN, if
     239             :    THREAD_RETURN is not NULL.
     240             : 
     241             :    This function is a cancellation point and therefore not marked with
     242             :    __THROW.  */
     243             : extern int pthread_clockjoin_np (pthread_t __th, void **__thread_return,
     244             :                                  clockid_t __clockid,
     245             :                                  const struct timespec *__abstime);
     246             : # else
     247             : #  ifdef __REDIRECT
     248             : extern int __REDIRECT (pthread_timedjoin_np,
     249             :                        (pthread_t __th, void **__thread_return,
     250             :                         const struct timespec *__abstime),
     251             :                        __pthread_timedjoin_np64);
     252             : 
     253             : extern int __REDIRECT (pthread_clockjoin_np,
     254             :                        (pthread_t __th, void **__thread_return,
     255             :                         clockid_t __clockid,
     256             :                         const struct timespec *__abstime),
     257             :                        __pthread_clockjoin_np64);
     258             : #  else
     259             : #   define pthread_timedjoin_np __pthread_timedjoin_np64
     260             : #   define pthread_clockjoin_np __pthread_clockjoin_np64
     261             : #  endif
     262             : # endif
     263             : #endif
     264             : 
     265             : /* Indicate that the thread TH is never to be joined with PTHREAD_JOIN.
     266             :    The resources of TH will therefore be freed immediately when it
     267             :    terminates, instead of waiting for another thread to perform PTHREAD_JOIN
     268             :    on it.  */
     269             : extern int pthread_detach (pthread_t __th) __THROW;
     270             : 
     271             : 
     272             : /* Obtain the identifier of the current thread.  */
     273             : extern pthread_t pthread_self (void) __THROW __attribute__ ((__const__));
     274             : 
     275             : /* Compare two thread identifiers.  */
     276             : extern int pthread_equal (pthread_t __thread1, pthread_t __thread2)
     277             :   __THROW __attribute__ ((__const__));
     278             : 
     279             : 
     280             : /* Thread attribute handling.  */
     281             : 
     282             : /* Initialize thread attribute *ATTR with default attributes
     283             :    (detachstate is PTHREAD_JOINABLE, scheduling policy is SCHED_OTHER,
     284             :     no user-provided stack).  */
     285             : extern int pthread_attr_init (pthread_attr_t *__attr) __THROW __nonnull ((1));
     286             : 
     287             : /* Destroy thread attribute *ATTR.  */
     288             : extern int pthread_attr_destroy (pthread_attr_t *__attr)
     289             :      __THROW __nonnull ((1));
     290             : 
     291             : /* Get detach state attribute.  */
     292             : extern int pthread_attr_getdetachstate (const pthread_attr_t *__attr,
     293             :                                         int *__detachstate)
     294             :      __THROW __nonnull ((1, 2));
     295             : 
     296             : /* Set detach state attribute.  */
     297             : extern int pthread_attr_setdetachstate (pthread_attr_t *__attr,
     298             :                                         int __detachstate)
     299             :      __THROW __nonnull ((1));
     300             : 
     301             : 
     302             : /* Get the size of the guard area created for stack overflow protection.  */
     303             : extern int pthread_attr_getguardsize (const pthread_attr_t *__attr,
     304             :                                       size_t *__guardsize)
     305             :      __THROW __nonnull ((1, 2));
     306             : 
     307             : /* Set the size of the guard area created for stack overflow protection.  */
     308             : extern int pthread_attr_setguardsize (pthread_attr_t *__attr,
     309             :                                       size_t __guardsize)
     310             :      __THROW __nonnull ((1));
     311             : 
     312             : 
     313             : /* Return in *PARAM the scheduling parameters of *ATTR.  */
     314             : extern int pthread_attr_getschedparam (const pthread_attr_t *__restrict __attr,
     315             :                                        struct sched_param *__restrict __param)
     316             :      __THROW __nonnull ((1, 2));
     317             : 
     318             : /* Set scheduling parameters (priority, etc) in *ATTR according to PARAM.  */
     319             : extern int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr,
     320             :                                        const struct sched_param *__restrict
     321             :                                        __param) __THROW __nonnull ((1, 2));
     322             : 
     323             : /* Return in *POLICY the scheduling policy of *ATTR.  */
     324             : extern int pthread_attr_getschedpolicy (const pthread_attr_t *__restrict
     325             :                                         __attr, int *__restrict __policy)
     326             :      __THROW __nonnull ((1, 2));
     327             : 
     328             : /* Set scheduling policy in *ATTR according to POLICY.  */
     329             : extern int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy)
     330             :      __THROW __nonnull ((1));
     331             : 
     332             : /* Return in *INHERIT the scheduling inheritance mode of *ATTR.  */
     333             : extern int pthread_attr_getinheritsched (const pthread_attr_t *__restrict
     334             :                                          __attr, int *__restrict __inherit)
     335             :      __THROW __nonnull ((1, 2));
     336             : 
     337             : /* Set scheduling inheritance mode in *ATTR according to INHERIT.  */
     338             : extern int pthread_attr_setinheritsched (pthread_attr_t *__attr,
     339             :                                          int __inherit)
     340             :      __THROW __nonnull ((1));
     341             : 
     342             : 
     343             : /* Return in *SCOPE the scheduling contention scope of *ATTR.  */
     344             : extern int pthread_attr_getscope (const pthread_attr_t *__restrict __attr,
     345             :                                   int *__restrict __scope)
     346             :      __THROW __nonnull ((1, 2));
     347             : 
     348             : /* Set scheduling contention scope in *ATTR according to SCOPE.  */
     349             : extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope)
     350             :      __THROW __nonnull ((1));
     351             : 
     352             : /* Return the previously set address for the stack.  */
     353             : extern int pthread_attr_getstackaddr (const pthread_attr_t *__restrict
     354             :                                       __attr, void **__restrict __stackaddr)
     355             :      __THROW __nonnull ((1, 2)) __attribute_deprecated__;
     356             : 
     357             : /* Set the starting address of the stack of the thread to be created.
     358             :    Depending on whether the stack grows up or down the value must either
     359             :    be higher or lower than all the address in the memory block.  The
     360             :    minimal size of the block must be PTHREAD_STACK_MIN.  */
     361             : extern int pthread_attr_setstackaddr (pthread_attr_t *__attr,
     362             :                                       void *__stackaddr)
     363             :      __THROW __nonnull ((1)) __attribute_deprecated__;
     364             : 
     365             : /* Return the currently used minimal stack size.  */
     366             : extern int pthread_attr_getstacksize (const pthread_attr_t *__restrict
     367             :                                       __attr, size_t *__restrict __stacksize)
     368             :      __THROW __nonnull ((1, 2));
     369             : 
     370             : /* Add information about the minimum stack size needed for the thread
     371             :    to be started.  This size must never be less than PTHREAD_STACK_MIN
     372             :    and must also not exceed the system limits.  */
     373             : extern int pthread_attr_setstacksize (pthread_attr_t *__attr,
     374             :                                       size_t __stacksize)
     375             :      __THROW __nonnull ((1));
     376             : 
     377             : #ifdef __USE_XOPEN2K
     378             : /* Return the previously set address for the stack.  */
     379             : extern int pthread_attr_getstack (const pthread_attr_t *__restrict __attr,
     380             :                                   void **__restrict __stackaddr,
     381             :                                   size_t *__restrict __stacksize)
     382             :      __THROW __nonnull ((1, 2, 3));
     383             : 
     384             : /* The following two interfaces are intended to replace the last two.  They
     385             :    require setting the address as well as the size since only setting the
     386             :    address will make the implementation on some architectures impossible.  */
     387             : extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr,
     388             :                                   size_t __stacksize) __THROW __nonnull ((1));
     389             : #endif
     390             : 
     391             : #ifdef __USE_GNU
     392             : /* Thread created with attribute ATTR will be limited to run only on
     393             :    the processors represented in CPUSET.  */
     394             : extern int pthread_attr_setaffinity_np (pthread_attr_t *__attr,
     395             :                                         size_t __cpusetsize,
     396             :                                         const cpu_set_t *__cpuset)
     397             :      __THROW __nonnull ((1, 3));
     398             : 
     399             : /* Get bit set in CPUSET representing the processors threads created with
     400             :    ATTR can run on.  */
     401             : extern int pthread_attr_getaffinity_np (const pthread_attr_t *__attr,
     402             :                                         size_t __cpusetsize,
     403             :                                         cpu_set_t *__cpuset)
     404             :      __THROW __nonnull ((1, 3));
     405             : 
     406             : /* Get the default attributes used by pthread_create in this process.  */
     407             : extern int pthread_getattr_default_np (pthread_attr_t *__attr)
     408             :      __THROW __nonnull ((1));
     409             : 
     410             : /* Store *SIGMASK as the signal mask for the new thread in *ATTR.  */
     411             : extern int pthread_attr_setsigmask_np (pthread_attr_t *__attr,
     412             :                                        const __sigset_t *sigmask);
     413             : 
     414             : /* Store the signal mask of *ATTR in *SIGMASK.  If there is no signal
     415             :    mask stored, return PTHREAD_ATTR_NOSIGMASK_NP.  Return zero on
     416             :    success.  */
     417             : extern int pthread_attr_getsigmask_np (const pthread_attr_t *__attr,
     418             :                                        __sigset_t *sigmask);
     419             : 
     420             : /* Special return value from pthread_attr_getsigmask_np if the signal
     421             :    mask has not been set.  */
     422             : #define PTHREAD_ATTR_NO_SIGMASK_NP (-1)
     423             : 
     424             : /* Set the default attributes to be used by pthread_create in this
     425             :    process.  */
     426             : extern int pthread_setattr_default_np (const pthread_attr_t *__attr)
     427             :      __THROW __nonnull ((1));
     428             : 
     429             : /* Initialize thread attribute *ATTR with attributes corresponding to the
     430             :    already running thread TH.  It shall be called on uninitialized ATTR
     431             :    and destroyed with pthread_attr_destroy when no longer needed.  */
     432             : extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)
     433             :      __THROW __nonnull ((2));
     434             : #endif
     435             : 
     436             : 
     437             : /* Functions for scheduling control.  */
     438             : 
     439             : /* Set the scheduling parameters for TARGET_THREAD according to POLICY
     440             :    and *PARAM.  */
     441             : extern int pthread_setschedparam (pthread_t __target_thread, int __policy,
     442             :                                   const struct sched_param *__param)
     443             :      __THROW __nonnull ((3));
     444             : 
     445             : /* Return in *POLICY and *PARAM the scheduling parameters for TARGET_THREAD. */
     446             : extern int pthread_getschedparam (pthread_t __target_thread,
     447             :                                   int *__restrict __policy,
     448             :                                   struct sched_param *__restrict __param)
     449             :      __THROW __nonnull ((2, 3));
     450             : 
     451             : /* Set the scheduling priority for TARGET_THREAD.  */
     452             : extern int pthread_setschedprio (pthread_t __target_thread, int __prio)
     453             :      __THROW;
     454             : 
     455             : 
     456             : #ifdef __USE_GNU
     457             : /* Get thread name visible in the kernel and its interfaces.  */
     458             : extern int pthread_getname_np (pthread_t __target_thread, char *__buf,
     459             :                                size_t __buflen)
     460             :      __THROW __nonnull ((2));
     461             : 
     462             : /* Set thread name visible in the kernel and its interfaces.  */
     463             : extern int pthread_setname_np (pthread_t __target_thread, const char *__name)
     464             :      __THROW __nonnull ((2));
     465             : #endif
     466             : 
     467             : 
     468             : #ifdef __USE_UNIX98
     469             : /* Determine level of concurrency.  */
     470             : extern int pthread_getconcurrency (void) __THROW;
     471             : 
     472             : /* Set new concurrency level to LEVEL.  */
     473             : extern int pthread_setconcurrency (int __level) __THROW;
     474             : #endif
     475             : 
     476             : #ifdef __USE_GNU
     477             : extern int pthread_yield (void) __THROW;
     478             : # ifdef __REDIRECT_NTH
     479             : extern int __REDIRECT_NTH (pthread_yield, (void), sched_yield)
     480             :   __attribute_deprecated_msg__ ("\
     481             : pthread_yield is deprecated, use sched_yield instead");
     482             : # else
     483             : #  define pthread_yield sched_yield
     484             : # endif
     485             : 
     486             : 
     487             : /* Limit specified thread TH to run only on the processors represented
     488             :    in CPUSET.  */
     489             : extern int pthread_setaffinity_np (pthread_t __th, size_t __cpusetsize,
     490             :                                    const cpu_set_t *__cpuset)
     491             :      __THROW __nonnull ((3));
     492             : 
     493             : /* Get bit set in CPUSET representing the processors TH can run on.  */
     494             : extern int pthread_getaffinity_np (pthread_t __th, size_t __cpusetsize,
     495             :                                    cpu_set_t *__cpuset)
     496             :      __THROW __nonnull ((3));
     497             : #endif
     498             : 
     499             : 
     500             : /* Functions for handling initialization.  */
     501             : 
     502             : /* Guarantee that the initialization function INIT_ROUTINE will be called
     503             :    only once, even if pthread_once is executed several times with the
     504             :    same ONCE_CONTROL argument. ONCE_CONTROL must point to a static or
     505             :    extern variable initialized to PTHREAD_ONCE_INIT.
     506             : 
     507             :    The initialization functions might throw exception which is why
     508             :    this function is not marked with __THROW.  */
     509             : extern int pthread_once (pthread_once_t *__once_control,
     510             :                          void (*__init_routine) (void)) __nonnull ((1, 2));
     511             : 
     512             : 
     513             : /* Functions for handling cancellation.
     514             : 
     515             :    Note that these functions are explicitly not marked to not throw an
     516             :    exception in C++ code.  If cancellation is implemented by unwinding
     517             :    this is necessary to have the compiler generate the unwind information.  */
     518             : 
     519             : /* Set cancelability state of current thread to STATE, returning old
     520             :    state in *OLDSTATE if OLDSTATE is not NULL.  */
     521             : extern int pthread_setcancelstate (int __state, int *__oldstate);
     522             : 
     523             : /* Set cancellation state of current thread to TYPE, returning the old
     524             :    type in *OLDTYPE if OLDTYPE is not NULL.  */
     525             : extern int pthread_setcanceltype (int __type, int *__oldtype);
     526             : 
     527             : /* Cancel THREAD immediately or at the next possibility.  */
     528             : extern int pthread_cancel (pthread_t __th);
     529             : 
     530             : /* Test for pending cancellation for the current thread and terminate
     531             :    the thread as per pthread_exit(PTHREAD_CANCELED) if it has been
     532             :    cancelled.  */
     533             : extern void pthread_testcancel (void);
     534             : 
     535             : 
     536             : /* Cancellation handling with integration into exception handling.  */
     537             : 
     538             : struct __cancel_jmp_buf_tag
     539             : {
     540             :   __jmp_buf __cancel_jmp_buf;
     541             :   int __mask_was_saved;
     542             : };
     543             : 
     544             : typedef struct
     545             : {
     546             :   struct __cancel_jmp_buf_tag __cancel_jmp_buf[1];
     547             :   void *__pad[4];
     548             : } __pthread_unwind_buf_t __attribute__ ((__aligned__));
     549             : 
     550             : /* No special attributes by default.  */
     551             : #ifndef __cleanup_fct_attribute
     552             : # define __cleanup_fct_attribute
     553             : #endif
     554             : 
     555             : 
     556             : /* Structure to hold the cleanup handler information.  */
     557             : struct __pthread_cleanup_frame
     558             : {
     559             :   void (*__cancel_routine) (void *);
     560             :   void *__cancel_arg;
     561             :   int __do_it;
     562             :   int __cancel_type;
     563             : };
     564             : 
     565             : #if defined __GNUC__ && defined __EXCEPTIONS
     566             : # ifdef __cplusplus
     567             : /* Class to handle cancellation handler invocation.  */
     568             : class __pthread_cleanup_class
     569             : {
     570             :   void (*__cancel_routine) (void *);
     571             :   void *__cancel_arg;
     572             :   int __do_it;
     573             :   int __cancel_type;
     574             : 
     575             :  public:
     576             :   __pthread_cleanup_class (void (*__fct) (void *), void *__arg)
     577             :     : __cancel_routine (__fct), __cancel_arg (__arg), __do_it (1) { }
     578             :   ~__pthread_cleanup_class () { if (__do_it) __cancel_routine (__cancel_arg); }
     579             :   void __setdoit (int __newval) { __do_it = __newval; }
     580             :   void __defer () { pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED,
     581             :                                            &__cancel_type); }
     582             :   void __restore () const { pthread_setcanceltype (__cancel_type, 0); }
     583             : };
     584             : 
     585             : /* Install a cleanup handler: ROUTINE will be called with arguments ARG
     586             :    when the thread is canceled or calls pthread_exit.  ROUTINE will also
     587             :    be called with arguments ARG when the matching pthread_cleanup_pop
     588             :    is executed with non-zero EXECUTE argument.
     589             : 
     590             :    pthread_cleanup_push and pthread_cleanup_pop are macros and must always
     591             :    be used in matching pairs at the same nesting level of braces.  */
     592             : #  define pthread_cleanup_push(routine, arg) \
     593             :   do {                                                                        \
     594             :     __pthread_cleanup_class __clframe (routine, arg)
     595             : 
     596             : /* Remove a cleanup handler installed by the matching pthread_cleanup_push.
     597             :    If EXECUTE is non-zero, the handler function is called. */
     598             : #  define pthread_cleanup_pop(execute) \
     599             :     __clframe.__setdoit (execute);                                            \
     600             :   } while (0)
     601             : 
     602             : #  ifdef __USE_GNU
     603             : /* Install a cleanup handler as pthread_cleanup_push does, but also
     604             :    saves the current cancellation type and sets it to deferred
     605             :    cancellation.  */
     606             : #   define pthread_cleanup_push_defer_np(routine, arg) \
     607             :   do {                                                                        \
     608             :     __pthread_cleanup_class __clframe (routine, arg);                         \
     609             :     __clframe.__defer ()
     610             : 
     611             : /* Remove a cleanup handler as pthread_cleanup_pop does, but also
     612             :    restores the cancellation type that was in effect when the matching
     613             :    pthread_cleanup_push_defer was called.  */
     614             : #   define pthread_cleanup_pop_restore_np(execute) \
     615             :     __clframe.__restore ();                                                   \
     616             :     __clframe.__setdoit (execute);                                            \
     617             :   } while (0)
     618             : #  endif
     619             : # else
     620             : /* Function called to call the cleanup handler.  As an extern inline
     621             :    function the compiler is free to decide inlining the change when
     622             :    needed or fall back on the copy which must exist somewhere
     623             :    else.  */
     624             : __extern_inline void
     625             : __pthread_cleanup_routine (struct __pthread_cleanup_frame *__frame)
     626             : {
     627             :   if (__frame->__do_it)
     628             :     __frame->__cancel_routine (__frame->__cancel_arg);
     629             : }
     630             : 
     631             : /* Install a cleanup handler: ROUTINE will be called with arguments ARG
     632             :    when the thread is canceled or calls pthread_exit.  ROUTINE will also
     633             :    be called with arguments ARG when the matching pthread_cleanup_pop
     634             :    is executed with non-zero EXECUTE argument.
     635             : 
     636             :    pthread_cleanup_push and pthread_cleanup_pop are macros and must always
     637             :    be used in matching pairs at the same nesting level of braces.  */
     638             : #  define pthread_cleanup_push(routine, arg) \
     639             :   do {                                                                        \
     640             :     struct __pthread_cleanup_frame __clframe                                  \
     641             :       __attribute__ ((__cleanup__ (__pthread_cleanup_routine)))               \
     642             :       = { .__cancel_routine = (routine), .__cancel_arg = (arg),               \
     643             :           .__do_it = 1 };
     644             : 
     645             : /* Remove a cleanup handler installed by the matching pthread_cleanup_push.
     646             :    If EXECUTE is non-zero, the handler function is called. */
     647             : #  define pthread_cleanup_pop(execute) \
     648             :     __clframe.__do_it = (execute);                                            \
     649             :   } while (0)
     650             : 
     651             : #  ifdef __USE_GNU
     652             : /* Install a cleanup handler as pthread_cleanup_push does, but also
     653             :    saves the current cancellation type and sets it to deferred
     654             :    cancellation.  */
     655             : #   define pthread_cleanup_push_defer_np(routine, arg) \
     656             :   do {                                                                        \
     657             :     struct __pthread_cleanup_frame __clframe                                  \
     658             :       __attribute__ ((__cleanup__ (__pthread_cleanup_routine)))               \
     659             :       = { .__cancel_routine = (routine), .__cancel_arg = (arg),               \
     660             :           .__do_it = 1 };                                                     \
     661             :     (void) pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED,                    \
     662             :                                   &__clframe.__cancel_type)
     663             : 
     664             : /* Remove a cleanup handler as pthread_cleanup_pop does, but also
     665             :    restores the cancellation type that was in effect when the matching
     666             :    pthread_cleanup_push_defer was called.  */
     667             : #   define pthread_cleanup_pop_restore_np(execute) \
     668             :     (void) pthread_setcanceltype (__clframe.__cancel_type, NULL);             \
     669             :     __clframe.__do_it = (execute);                                            \
     670             :   } while (0)
     671             : #  endif
     672             : # endif
     673             : #else
     674             : /* Install a cleanup handler: ROUTINE will be called with arguments ARG
     675             :    when the thread is canceled or calls pthread_exit.  ROUTINE will also
     676             :    be called with arguments ARG when the matching pthread_cleanup_pop
     677             :    is executed with non-zero EXECUTE argument.
     678             : 
     679             :    pthread_cleanup_push and pthread_cleanup_pop are macros and must always
     680             :    be used in matching pairs at the same nesting level of braces.  */
     681             : # define pthread_cleanup_push(routine, arg) \
     682             :   do {                                                                        \
     683             :     __pthread_unwind_buf_t __cancel_buf;                                      \
     684             :     void (*__cancel_routine) (void *) = (routine);                            \
     685             :     void *__cancel_arg = (arg);                                               \
     686             :     int __not_first_call = __sigsetjmp_cancel (__cancel_buf.__cancel_jmp_buf, \
     687             :                                                0);                            \
     688             :     if (__glibc_unlikely (__not_first_call))                                  \
     689             :       {                                                                       \
     690             :         __cancel_routine (__cancel_arg);                                      \
     691             :         __pthread_unwind_next (&__cancel_buf);                                    \
     692             :         /* NOTREACHED */                                                      \
     693             :       }                                                                       \
     694             :                                                                               \
     695             :     __pthread_register_cancel (&__cancel_buf);                                    \
     696             :     do {
     697             : extern void __pthread_register_cancel (__pthread_unwind_buf_t *__buf)
     698             :      __cleanup_fct_attribute;
     699             : 
     700             : /* Remove a cleanup handler installed by the matching pthread_cleanup_push.
     701             :    If EXECUTE is non-zero, the handler function is called. */
     702             : # define pthread_cleanup_pop(execute) \
     703             :       do { } while (0);/* Empty to allow label before pthread_cleanup_pop.  */\
     704             :     } while (0);                                                              \
     705             :     __pthread_unregister_cancel (&__cancel_buf);                          \
     706             :     if (execute)                                                              \
     707             :       __cancel_routine (__cancel_arg);                                        \
     708             :   } while (0)
     709             : extern void __pthread_unregister_cancel (__pthread_unwind_buf_t *__buf)
     710             :   __cleanup_fct_attribute;
     711             : 
     712             : # ifdef __USE_GNU
     713             : /* Install a cleanup handler as pthread_cleanup_push does, but also
     714             :    saves the current cancellation type and sets it to deferred
     715             :    cancellation.  */
     716             : #  define pthread_cleanup_push_defer_np(routine, arg) \
     717             :   do {                                                                        \
     718             :     __pthread_unwind_buf_t __cancel_buf;                                      \
     719             :     void (*__cancel_routine) (void *) = (routine);                            \
     720             :     void *__cancel_arg = (arg);                                               \
     721             :     int __not_first_call = __sigsetjmp_cancel (__cancel_buf.__cancel_jmp_buf, \
     722             :                                                0);                            \
     723             :     if (__glibc_unlikely (__not_first_call))                                  \
     724             :       {                                                                       \
     725             :         __cancel_routine (__cancel_arg);                                      \
     726             :         __pthread_unwind_next (&__cancel_buf);                                    \
     727             :         /* NOTREACHED */                                                      \
     728             :       }                                                                       \
     729             :                                                                               \
     730             :     __pthread_register_cancel_defer (&__cancel_buf);                              \
     731             :     do {
     732             : extern void __pthread_register_cancel_defer (__pthread_unwind_buf_t *__buf)
     733             :      __cleanup_fct_attribute;
     734             : 
     735             : /* Remove a cleanup handler as pthread_cleanup_pop does, but also
     736             :    restores the cancellation type that was in effect when the matching
     737             :    pthread_cleanup_push_defer was called.  */
     738             : #  define pthread_cleanup_pop_restore_np(execute) \
     739             :       do { } while (0);/* Empty to allow label before pthread_cleanup_pop.  */\
     740             :     } while (0);                                                              \
     741             :     __pthread_unregister_cancel_restore (&__cancel_buf);                  \
     742             :     if (execute)                                                              \
     743             :       __cancel_routine (__cancel_arg);                                        \
     744             :   } while (0)
     745             : extern void __pthread_unregister_cancel_restore (__pthread_unwind_buf_t *__buf)
     746             :   __cleanup_fct_attribute;
     747             : # endif
     748             : 
     749             : /* Internal interface to initiate cleanup.  */
     750             : extern void __pthread_unwind_next (__pthread_unwind_buf_t *__buf)
     751             :      __cleanup_fct_attribute __attribute__ ((__noreturn__))
     752             : # ifndef SHARED
     753             :      __attribute__ ((__weak__))
     754             : # endif
     755             :      ;
     756             : #endif
     757             : 
     758             : /* Function used in the macros.  Calling __sigsetjmp, with its first
     759             :    argument declared as an array, results in a -Wstringop-overflow
     760             :    warning from GCC 11 because struct pthread_unwind_buf is smaller
     761             :    than jmp_buf.  The calls from the macros have __SAVEMASK set to 0,
     762             :    so nothing beyond the common prefix is used and this warning is a
     763             :    false positive.  Use an alias with its first argument declared to
     764             :    use the type in the macros if possible to avoid this warning.  */
     765             : #if __GNUC_PREREQ (11, 0)
     766             : extern int __REDIRECT_NTHNL (__sigsetjmp_cancel,
     767             :                              (struct __cancel_jmp_buf_tag __env[1],
     768             :                               int __savemask),
     769             :                              __sigsetjmp) __attribute_returns_twice__;
     770             : #else
     771             : # define __sigsetjmp_cancel(env, savemask) \
     772             :   __sigsetjmp ((struct __jmp_buf_tag *) (void *) (env), (savemask))
     773             : extern int __sigsetjmp (struct __jmp_buf_tag __env[1],
     774             :                         int __savemask) __THROWNL;
     775             : #endif
     776             : 
     777             : 
     778             : /* Mutex handling.  */
     779             : 
     780             : /* Initialize a mutex.  */
     781             : extern int pthread_mutex_init (pthread_mutex_t *__mutex,
     782             :                                const pthread_mutexattr_t *__mutexattr)
     783             :      __THROW __nonnull ((1));
     784             : 
     785             : /* Destroy a mutex.  */
     786             : extern int pthread_mutex_destroy (pthread_mutex_t *__mutex)
     787             :      __THROW __nonnull ((1));
     788             : 
     789             : /* Try locking a mutex.  */
     790             : extern int pthread_mutex_trylock (pthread_mutex_t *__mutex)
     791             :      __THROWNL __nonnull ((1));
     792             : 
     793             : /* Lock a mutex.  */
     794             : extern int pthread_mutex_lock (pthread_mutex_t *__mutex)
     795             :      __THROWNL __nonnull ((1));
     796             : 
     797             : #ifdef __USE_XOPEN2K
     798             : /* Wait until lock becomes available, or specified time passes. */
     799             : # ifndef __USE_TIME_BITS64
     800             : extern int pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex,
     801             :                                     const struct timespec *__restrict
     802             :                                     __abstime) __THROWNL __nonnull ((1, 2));
     803             : # else
     804             : #  ifdef __REDIRECT_NTHNL
     805             : extern int __REDIRECT_NTHNL (pthread_mutex_timedlock,
     806             :                              (pthread_mutex_t *__restrict __mutex,
     807             :                               const struct timespec *__restrict __abstime),
     808             :                              __pthread_mutex_timedlock64) __nonnull ((1, 2));
     809             : #  else
     810             : #   define pthread_mutex_timedlock __pthread_mutex_timedlock64
     811             : #  endif
     812             : # endif
     813             : #endif
     814             : 
     815             : #ifdef __USE_GNU
     816             : # ifndef __USE_TIME_BITS64
     817             : extern int pthread_mutex_clocklock (pthread_mutex_t *__restrict __mutex,
     818             :                                     clockid_t __clockid,
     819             :                                     const struct timespec *__restrict
     820             :                                     __abstime) __THROWNL __nonnull ((1, 3));
     821             : # else
     822             : #  ifdef __REDIRECT_NTHNL
     823             : extern int __REDIRECT_NTHNL (pthread_mutex_clocklock,
     824             :                              (pthread_mutex_t *__restrict __mutex,
     825             :                               clockid_t __clockid,
     826             :                               const struct timespec *__restrict __abstime),
     827             :                              __pthread_mutex_clocklock64) __nonnull ((1, 3));
     828             : #  else
     829             : #   define pthread_mutex_clocklock __pthread_mutex_clocklock64
     830             : #  endif
     831             : # endif
     832             : #endif
     833             : 
     834             : /* Unlock a mutex.  */
     835             : extern int pthread_mutex_unlock (pthread_mutex_t *__mutex)
     836             :      __THROWNL __nonnull ((1));
     837             : 
     838             : 
     839             : /* Get the priority ceiling of MUTEX.  */
     840             : extern int pthread_mutex_getprioceiling (const pthread_mutex_t *
     841             :                                          __restrict __mutex,
     842             :                                          int *__restrict __prioceiling)
     843             :      __THROW __nonnull ((1, 2));
     844             : 
     845             : /* Set the priority ceiling of MUTEX to PRIOCEILING, return old
     846             :    priority ceiling value in *OLD_CEILING.  */
     847             : extern int pthread_mutex_setprioceiling (pthread_mutex_t *__restrict __mutex,
     848             :                                          int __prioceiling,
     849             :                                          int *__restrict __old_ceiling)
     850             :      __THROW __nonnull ((1, 3));
     851             : 
     852             : 
     853             : #ifdef __USE_XOPEN2K8
     854             : /* Declare the state protected by MUTEX as consistent.  */
     855             : extern int pthread_mutex_consistent (pthread_mutex_t *__mutex)
     856             :      __THROW __nonnull ((1));
     857             : # ifdef __USE_GNU
     858             : #  ifdef __REDIRECT_NTH
     859             : extern int __REDIRECT_NTH (pthread_mutex_consistent_np, (pthread_mutex_t *),
     860             :                            pthread_mutex_consistent) __nonnull ((1))
     861             :   __attribute_deprecated_msg__ ("\
     862             : pthread_mutex_consistent_np is deprecated, use pthread_mutex_consistent");
     863             : #  else
     864             : #   define pthread_mutex_consistent_np pthread_mutex_consistent
     865             : #  endif
     866             : # endif
     867             : #endif
     868             : 
     869             : 
     870             : /* Functions for handling mutex attributes.  */
     871             : 
     872             : /* Initialize mutex attribute object ATTR with default attributes
     873             :    (kind is PTHREAD_MUTEX_TIMED_NP).  */
     874             : extern int pthread_mutexattr_init (pthread_mutexattr_t *__attr)
     875             :      __THROW __nonnull ((1));
     876             : 
     877             : /* Destroy mutex attribute object ATTR.  */
     878             : extern int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr)
     879             :      __THROW __nonnull ((1));
     880             : 
     881             : /* Get the process-shared flag of the mutex attribute ATTR.  */
     882             : extern int pthread_mutexattr_getpshared (const pthread_mutexattr_t *
     883             :                                          __restrict __attr,
     884             :                                          int *__restrict __pshared)
     885             :      __THROW __nonnull ((1, 2));
     886             : 
     887             : /* Set the process-shared flag of the mutex attribute ATTR.  */
     888             : extern int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr,
     889             :                                          int __pshared)
     890             :      __THROW __nonnull ((1));
     891             : 
     892             : #if defined __USE_UNIX98 || defined __USE_XOPEN2K8
     893             : /* Return in *KIND the mutex kind attribute in *ATTR.  */
     894             : extern int pthread_mutexattr_gettype (const pthread_mutexattr_t *__restrict
     895             :                                       __attr, int *__restrict __kind)
     896             :      __THROW __nonnull ((1, 2));
     897             : 
     898             : /* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL,
     899             :    PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or
     900             :    PTHREAD_MUTEX_DEFAULT).  */
     901             : extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind)
     902             :      __THROW __nonnull ((1));
     903             : #endif
     904             : 
     905             : /* Return in *PROTOCOL the mutex protocol attribute in *ATTR.  */
     906             : extern int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *
     907             :                                           __restrict __attr,
     908             :                                           int *__restrict __protocol)
     909             :      __THROW __nonnull ((1, 2));
     910             : 
     911             : /* Set the mutex protocol attribute in *ATTR to PROTOCOL (either
     912             :    PTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, or PTHREAD_PRIO_PROTECT).  */
     913             : extern int pthread_mutexattr_setprotocol (pthread_mutexattr_t *__attr,
     914             :                                           int __protocol)
     915             :      __THROW __nonnull ((1));
     916             : 
     917             : /* Return in *PRIOCEILING the mutex prioceiling attribute in *ATTR.  */
     918             : extern int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *
     919             :                                              __restrict __attr,
     920             :                                              int *__restrict __prioceiling)
     921             :      __THROW __nonnull ((1, 2));
     922             : 
     923             : /* Set the mutex prioceiling attribute in *ATTR to PRIOCEILING.  */
     924             : extern int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr,
     925             :                                              int __prioceiling)
     926             :      __THROW __nonnull ((1));
     927             : 
     928             : #ifdef __USE_XOPEN2K
     929             : /* Get the robustness flag of the mutex attribute ATTR.  */
     930             : extern int pthread_mutexattr_getrobust (const pthread_mutexattr_t *__attr,
     931             :                                         int *__robustness)
     932             :      __THROW __nonnull ((1, 2));
     933             : # ifdef __USE_GNU
     934             : #  ifdef __REDIRECT_NTH
     935             : extern int __REDIRECT_NTH (pthread_mutexattr_getrobust_np,
     936             :                            (pthread_mutexattr_t *, int *),
     937             :                            pthread_mutexattr_getrobust) __nonnull ((1))
     938             :   __attribute_deprecated_msg__ ("\
     939             : pthread_mutexattr_getrobust_np is deprecated, use pthread_mutexattr_getrobust");
     940             : #  else
     941             : #   define pthread_mutexattr_getrobust_np pthread_mutexattr_getrobust
     942             : #  endif
     943             : # endif
     944             : 
     945             : /* Set the robustness flag of the mutex attribute ATTR.  */
     946             : extern int pthread_mutexattr_setrobust (pthread_mutexattr_t *__attr,
     947             :                                         int __robustness)
     948             :      __THROW __nonnull ((1));
     949             : # ifdef __USE_GNU
     950             : #  ifdef __REDIRECT_NTH
     951             : extern int __REDIRECT_NTH (pthread_mutexattr_setrobust_np,
     952             :                            (pthread_mutexattr_t *, int),
     953             :                            pthread_mutexattr_setrobust) __nonnull ((1))
     954             :   __attribute_deprecated_msg__ ("\
     955             : pthread_mutexattr_setrobust_np is deprecated, use pthread_mutexattr_setrobust");
     956             : #  else
     957             : #   define pthread_mutexattr_setrobust_np pthread_mutexattr_setrobust
     958             : #  endif
     959             : # endif
     960             : #endif
     961             : 
     962             : #if defined __USE_UNIX98 || defined __USE_XOPEN2K
     963             : /* Functions for handling read-write locks.  */
     964             : 
     965             : /* Initialize read-write lock RWLOCK using attributes ATTR, or use
     966             :    the default values if later is NULL.  */
     967             : extern int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock,
     968             :                                 const pthread_rwlockattr_t *__restrict
     969             :                                 __attr) __THROW __nonnull ((1));
     970             : 
     971             : /* Destroy read-write lock RWLOCK.  */
     972             : extern int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock)
     973             :      __THROW __nonnull ((1));
     974             : 
     975             : /* Acquire read lock for RWLOCK.  */
     976             : extern int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock)
     977             :      __THROWNL __nonnull ((1));
     978             : 
     979             : /* Try to acquire read lock for RWLOCK.  */
     980             : extern int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock)
     981             :   __THROWNL __nonnull ((1));
     982             : 
     983             : # ifdef __USE_XOPEN2K
     984             : /* Try to acquire read lock for RWLOCK or return after specfied time.  */
     985             : #  ifndef __USE_TIME_BITS64
     986             : extern int pthread_rwlock_timedrdlock (pthread_rwlock_t *__restrict __rwlock,
     987             :                                        const struct timespec *__restrict
     988             :                                        __abstime) __THROWNL __nonnull ((1, 2));
     989             : #  else
     990             : #   ifdef __REDIRECT_NTHNL
     991             : extern int __REDIRECT_NTHNL (pthread_rwlock_timedrdlock,
     992             :                              (pthread_rwlock_t *__restrict __rwlock,
     993             :                               const struct timespec *__restrict __abstime),
     994             :                              __pthread_rwlock_timedrdlock64)
     995             :     __nonnull ((1, 2));
     996             : #   else
     997             : #    define pthread_rwlock_timedrdlock __pthread_rwlock_timedrdlock64
     998             : #   endif
     999             : #  endif
    1000             : # endif
    1001             : 
    1002             : # ifdef __USE_GNU
    1003             : #  ifndef __USE_TIME_BITS64
    1004             : extern int pthread_rwlock_clockrdlock (pthread_rwlock_t *__restrict __rwlock,
    1005             :                                        clockid_t __clockid,
    1006             :                                        const struct timespec *__restrict
    1007             :                                        __abstime) __THROWNL __nonnull ((1, 3));
    1008             : #  else
    1009             : #   ifdef __REDIRECT_NTHNL
    1010             : extern int __REDIRECT_NTHNL (pthread_rwlock_clockrdlock,
    1011             :                              (pthread_rwlock_t *__restrict __rwlock,
    1012             :                               clockid_t __clockid,
    1013             :                               const struct timespec *__restrict __abstime),
    1014             :                              __pthread_rwlock_clockrdlock64)
    1015             :     __nonnull ((1, 3));
    1016             : #   else
    1017             : #    define pthread_rwlock_clockrdlock __pthread_rwlock_clockrdlock64
    1018             : #   endif
    1019             : #  endif
    1020             : # endif
    1021             : 
    1022             : /* Acquire write lock for RWLOCK.  */
    1023             : extern int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock)
    1024             :      __THROWNL __nonnull ((1));
    1025             : 
    1026             : /* Try to acquire write lock for RWLOCK.  */
    1027             : extern int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock)
    1028             :      __THROWNL __nonnull ((1));
    1029             : 
    1030             : # ifdef __USE_XOPEN2K
    1031             : /* Try to acquire write lock for RWLOCK or return after specfied time.  */
    1032             : #  ifndef __USE_TIME_BITS64
    1033             : extern int pthread_rwlock_timedwrlock (pthread_rwlock_t *__restrict __rwlock,
    1034             :                                        const struct timespec *__restrict
    1035             :                                        __abstime) __THROWNL __nonnull ((1, 2));
    1036             : #  else
    1037             : #   ifdef __REDIRECT_NTHNL
    1038             : extern int __REDIRECT_NTHNL (pthread_rwlock_timedwrlock,
    1039             :                              (pthread_rwlock_t *__restrict __rwlock,
    1040             :                               const struct timespec *__restrict __abstime),
    1041             :                              __pthread_rwlock_timedwrlock64)
    1042             :     __nonnull ((1, 2));
    1043             : #   else
    1044             : #    define pthread_rwlock_timedwrlock __pthread_rwlock_timedwrlock64
    1045             : #   endif
    1046             : #  endif
    1047             : # endif
    1048             : 
    1049             : # ifdef __USE_GNU
    1050             : #  ifndef __USE_TIME_BITS64
    1051             : extern int pthread_rwlock_clockwrlock (pthread_rwlock_t *__restrict __rwlock,
    1052             :                                        clockid_t __clockid,
    1053             :                                        const struct timespec *__restrict
    1054             :                                        __abstime) __THROWNL __nonnull ((1, 3));
    1055             : 
    1056             : #  else
    1057             : #   ifdef __REDIRECT_NTHNL
    1058             : extern int __REDIRECT_NTHNL (pthread_rwlock_clockwrlock,
    1059             :                              (pthread_rwlock_t *__restrict __rwlock,
    1060             :                               clockid_t __clockid,
    1061             :                               const struct timespec *__restrict __abstime),
    1062             :                              __pthread_rwlock_clockwrlock64)
    1063             :     __nonnull ((1, 3));
    1064             : #   else
    1065             : #    define pthread_rwlock_clockwrlock __pthread_rwlock_clockwrlock64
    1066             : #   endif
    1067             : #  endif
    1068             : # endif
    1069             : 
    1070             : /* Unlock RWLOCK.  */
    1071             : extern int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock)
    1072             :      __THROWNL __nonnull ((1));
    1073             : 
    1074             : 
    1075             : /* Functions for handling read-write lock attributes.  */
    1076             : 
    1077             : /* Initialize attribute object ATTR with default values.  */
    1078             : extern int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr)
    1079             :      __THROW __nonnull ((1));
    1080             : 
    1081             : /* Destroy attribute object ATTR.  */
    1082             : extern int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr)
    1083             :      __THROW __nonnull ((1));
    1084             : 
    1085             : /* Return current setting of process-shared attribute of ATTR in PSHARED.  */
    1086             : extern int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *
    1087             :                                           __restrict __attr,
    1088             :                                           int *__restrict __pshared)
    1089             :      __THROW __nonnull ((1, 2));
    1090             : 
    1091             : /* Set process-shared attribute of ATTR to PSHARED.  */
    1092             : extern int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr,
    1093             :                                           int __pshared)
    1094             :      __THROW __nonnull ((1));
    1095             : 
    1096             : /* Return current setting of reader/writer preference.  */
    1097             : extern int pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t *
    1098             :                                           __restrict __attr,
    1099             :                                           int *__restrict __pref)
    1100             :      __THROW __nonnull ((1, 2));
    1101             : 
    1102             : /* Set reader/write preference.  */
    1103             : extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
    1104             :                                           int __pref) __THROW __nonnull ((1));
    1105             : #endif
    1106             : 
    1107             : 
    1108             : /* Functions for handling conditional variables.  */
    1109             : 
    1110             : /* Initialize condition variable COND using attributes ATTR, or use
    1111             :    the default values if later is NULL.  */
    1112             : extern int pthread_cond_init (pthread_cond_t *__restrict __cond,
    1113             :                               const pthread_condattr_t *__restrict __cond_attr)
    1114             :      __THROW __nonnull ((1));
    1115             : 
    1116             : /* Destroy condition variable COND.  */
    1117             : extern int pthread_cond_destroy (pthread_cond_t *__cond)
    1118             :      __THROW __nonnull ((1));
    1119             : 
    1120             : /* Wake up one thread waiting for condition variable COND.  */
    1121             : extern int pthread_cond_signal (pthread_cond_t *__cond)
    1122             :      __THROWNL __nonnull ((1));
    1123             : 
    1124             : /* Wake up all threads waiting for condition variables COND.  */
    1125             : extern int pthread_cond_broadcast (pthread_cond_t *__cond)
    1126             :      __THROWNL __nonnull ((1));
    1127             : 
    1128             : /* Wait for condition variable COND to be signaled or broadcast.
    1129             :    MUTEX is assumed to be locked before.
    1130             : 
    1131             :    This function is a cancellation point and therefore not marked with
    1132             :    __THROW.  */
    1133             : extern int pthread_cond_wait (pthread_cond_t *__restrict __cond,
    1134             :                               pthread_mutex_t *__restrict __mutex)
    1135             :      __nonnull ((1, 2));
    1136             : 
    1137             : /* Wait for condition variable COND to be signaled or broadcast until
    1138             :    ABSTIME.  MUTEX is assumed to be locked before.  ABSTIME is an
    1139             :    absolute time specification; zero is the beginning of the epoch
    1140             :    (00:00:00 GMT, January 1, 1970).
    1141             : 
    1142             :    This function is a cancellation point and therefore not marked with
    1143             :    __THROW.  */
    1144             : # ifndef __USE_TIME_BITS64
    1145             : extern int pthread_cond_timedwait (pthread_cond_t *__restrict __cond,
    1146             :                                    pthread_mutex_t *__restrict __mutex,
    1147             :                                    const struct timespec *__restrict __abstime)
    1148             :      __nonnull ((1, 2, 3));
    1149             : # else
    1150             : #  ifdef __REDIRECT
    1151             : extern int __REDIRECT (pthread_cond_timedwait,
    1152             :                        (pthread_cond_t *__restrict __cond,
    1153             :                         pthread_mutex_t *__restrict __mutex,
    1154             :                         const struct timespec *__restrict __abstime),
    1155             :                        __pthread_cond_timedwait64)
    1156             :      __nonnull ((1, 2, 3));
    1157             : #  else
    1158             : #   define pthread_cond_timedwait __pthread_cond_timedwait64
    1159             : #  endif
    1160             : # endif
    1161             : 
    1162             : # ifdef __USE_GNU
    1163             : /* Wait for condition variable COND to be signaled or broadcast until
    1164             :    ABSTIME measured by the specified clock. MUTEX is assumed to be
    1165             :    locked before. CLOCK is the clock to use. ABSTIME is an absolute
    1166             :    time specification against CLOCK's epoch.
    1167             : 
    1168             :    This function is a cancellation point and therefore not marked with
    1169             :    __THROW. */
    1170             : #  ifndef __USE_TIME_BITS64
    1171             : extern int pthread_cond_clockwait (pthread_cond_t *__restrict __cond,
    1172             :                                    pthread_mutex_t *__restrict __mutex,
    1173             :                                    __clockid_t __clock_id,
    1174             :                                    const struct timespec *__restrict __abstime)
    1175             :      __nonnull ((1, 2, 4));
    1176             : #  else
    1177             : #   ifdef __REDIRECT
    1178             : extern int __REDIRECT (pthread_cond_clockwait,
    1179             :                        (pthread_cond_t *__restrict __cond,
    1180             :                         pthread_mutex_t *__restrict __mutex,
    1181             :                         __clockid_t __clock_id,
    1182             :                         const struct timespec *__restrict __abstime),
    1183             :                        __pthread_cond_clockwait64)
    1184             :      __nonnull ((1, 2, 4));
    1185             : #   else
    1186             : #    define pthread_cond_clockwait __pthread_cond_clockwait64
    1187             : #   endif
    1188             : #  endif
    1189             : # endif
    1190             : 
    1191             : /* Functions for handling condition variable attributes.  */
    1192             : 
    1193             : /* Initialize condition variable attribute ATTR.  */
    1194             : extern int pthread_condattr_init (pthread_condattr_t *__attr)
    1195             :      __THROW __nonnull ((1));
    1196             : 
    1197             : /* Destroy condition variable attribute ATTR.  */
    1198             : extern int pthread_condattr_destroy (pthread_condattr_t *__attr)
    1199             :      __THROW __nonnull ((1));
    1200             : 
    1201             : /* Get the process-shared flag of the condition variable attribute ATTR.  */
    1202             : extern int pthread_condattr_getpshared (const pthread_condattr_t *
    1203             :                                         __restrict __attr,
    1204             :                                         int *__restrict __pshared)
    1205             :      __THROW __nonnull ((1, 2));
    1206             : 
    1207             : /* Set the process-shared flag of the condition variable attribute ATTR.  */
    1208             : extern int pthread_condattr_setpshared (pthread_condattr_t *__attr,
    1209             :                                         int __pshared) __THROW __nonnull ((1));
    1210             : 
    1211             : #ifdef __USE_XOPEN2K
    1212             : /* Get the clock selected for the condition variable attribute ATTR.  */
    1213             : extern int pthread_condattr_getclock (const pthread_condattr_t *
    1214             :                                       __restrict __attr,
    1215             :                                       __clockid_t *__restrict __clock_id)
    1216             :      __THROW __nonnull ((1, 2));
    1217             : 
    1218             : /* Set the clock selected for the condition variable attribute ATTR.  */
    1219             : extern int pthread_condattr_setclock (pthread_condattr_t *__attr,
    1220             :                                       __clockid_t __clock_id)
    1221             :      __THROW __nonnull ((1));
    1222             : #endif
    1223             : 
    1224             : 
    1225             : #ifdef __USE_XOPEN2K
    1226             : /* Functions to handle spinlocks.  */
    1227             : 
    1228             : /* Initialize the spinlock LOCK.  If PSHARED is nonzero the spinlock can
    1229             :    be shared between different processes.  */
    1230             : extern int pthread_spin_init (pthread_spinlock_t *__lock, int __pshared)
    1231             :      __THROW __nonnull ((1));
    1232             : 
    1233             : /* Destroy the spinlock LOCK.  */
    1234             : extern int pthread_spin_destroy (pthread_spinlock_t *__lock)
    1235             :      __THROW __nonnull ((1));
    1236             : 
    1237             : /* Wait until spinlock LOCK is retrieved.  */
    1238             : extern int pthread_spin_lock (pthread_spinlock_t *__lock)
    1239             :      __THROWNL __nonnull ((1));
    1240             : 
    1241             : /* Try to lock spinlock LOCK.  */
    1242             : extern int pthread_spin_trylock (pthread_spinlock_t *__lock)
    1243             :      __THROWNL __nonnull ((1));
    1244             : 
    1245             : /* Release spinlock LOCK.  */
    1246             : extern int pthread_spin_unlock (pthread_spinlock_t *__lock)
    1247             :      __THROWNL __nonnull ((1));
    1248             : 
    1249             : 
    1250             : /* Functions to handle barriers.  */
    1251             : 
    1252             : /* Initialize BARRIER with the attributes in ATTR.  The barrier is
    1253             :    opened when COUNT waiters arrived.  */
    1254             : extern int pthread_barrier_init (pthread_barrier_t *__restrict __barrier,
    1255             :                                  const pthread_barrierattr_t *__restrict
    1256             :                                  __attr, unsigned int __count)
    1257             :      __THROW __nonnull ((1));
    1258             : 
    1259             : /* Destroy a previously dynamically initialized barrier BARRIER.  */
    1260             : extern int pthread_barrier_destroy (pthread_barrier_t *__barrier)
    1261             :      __THROW __nonnull ((1));
    1262             : 
    1263             : /* Wait on barrier BARRIER.  */
    1264             : extern int pthread_barrier_wait (pthread_barrier_t *__barrier)
    1265             :      __THROWNL __nonnull ((1));
    1266             : 
    1267             : 
    1268             : /* Initialize barrier attribute ATTR.  */
    1269             : extern int pthread_barrierattr_init (pthread_barrierattr_t *__attr)
    1270             :      __THROW __nonnull ((1));
    1271             : 
    1272             : /* Destroy previously dynamically initialized barrier attribute ATTR.  */
    1273             : extern int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr)
    1274             :      __THROW __nonnull ((1));
    1275             : 
    1276             : /* Get the process-shared flag of the barrier attribute ATTR.  */
    1277             : extern int pthread_barrierattr_getpshared (const pthread_barrierattr_t *
    1278             :                                            __restrict __attr,
    1279             :                                            int *__restrict __pshared)
    1280             :      __THROW __nonnull ((1, 2));
    1281             : 
    1282             : /* Set the process-shared flag of the barrier attribute ATTR.  */
    1283             : extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr,
    1284             :                                            int __pshared)
    1285             :      __THROW __nonnull ((1));
    1286             : #endif
    1287             : 
    1288             : 
    1289             : /* Functions for handling thread-specific data.  */
    1290             : 
    1291             : /* Create a key value identifying a location in the thread-specific
    1292             :    data area.  Each thread maintains a distinct thread-specific data
    1293             :    area.  DESTR_FUNCTION, if non-NULL, is called with the value
    1294             :    associated to that key when the key is destroyed.
    1295             :    DESTR_FUNCTION is not called if the value associated is NULL when
    1296             :    the key is destroyed.  */
    1297             : extern int pthread_key_create (pthread_key_t *__key,
    1298             :                                void (*__destr_function) (void *))
    1299             :      __THROW __nonnull ((1));
    1300             : 
    1301             : /* Destroy KEY.  */
    1302             : extern int pthread_key_delete (pthread_key_t __key) __THROW;
    1303             : 
    1304             : /* Return current value of the thread-specific data slot identified by KEY.  */
    1305             : extern void *pthread_getspecific (pthread_key_t __key) __THROW;
    1306             : 
    1307             : /* Store POINTER in the thread-specific data slot identified by KEY. */
    1308             : extern int pthread_setspecific (pthread_key_t __key,
    1309             :                                 const void *__pointer)
    1310             :   __THROW __attr_access_none (2);
    1311             : 
    1312             : 
    1313             : #ifdef __USE_XOPEN2K
    1314             : /* Get ID of CPU-time clock for thread THREAD_ID.  */
    1315             : extern int pthread_getcpuclockid (pthread_t __thread_id,
    1316             :                                   __clockid_t *__clock_id)
    1317             :      __THROW __nonnull ((2));
    1318             : #endif
    1319             : 
    1320             : 
    1321             : /* Install handlers to be called when a new process is created with FORK.
    1322             :    The PREPARE handler is called in the parent process just before performing
    1323             :    FORK. The PARENT handler is called in the parent process just after FORK.
    1324             :    The CHILD handler is called in the child process.  Each of the three
    1325             :    handlers can be NULL, meaning that no handler needs to be called at that
    1326             :    point.
    1327             :    PTHREAD_ATFORK can be called several times, in which case the PREPARE
    1328             :    handlers are called in LIFO order (last added with PTHREAD_ATFORK,
    1329             :    first called before FORK), and the PARENT and CHILD handlers are called
    1330             :    in FIFO (first added, first called).  */
    1331             : 
    1332             : extern int pthread_atfork (void (*__prepare) (void),
    1333             :                            void (*__parent) (void),
    1334             :                            void (*__child) (void)) __THROW;
    1335             : 
    1336             : 
    1337             : #ifdef __USE_EXTERN_INLINES
    1338             : /* Optimizations.  */
    1339             : __extern_inline int
    1340           7 : __NTH (pthread_equal (pthread_t __thread1, pthread_t __thread2))
    1341             : {
    1342           7 :   return __thread1 == __thread2;
    1343             : }
    1344             : #endif
    1345             : 
    1346             : __END_DECLS
    1347             : 
    1348             : #endif  /* pthread.h */

Generated by: LCOV version 1.14