LCOV - code coverage report
Current view: top level - usr/include - pthread.h (source / functions) Hit Total Coverage
Test: coverage report for v4-17-test 1498b464 Lines: 3 4 75.0 %
Date: 2024-06-13 04:01:37 Functions: 2 2 100.0 %

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

Generated by: LCOV version 1.13