Blame sysdeps/nptl/libc-lockP.h

Packit Service 82fcde
/* Private libc-internal interface for mutex locks.  NPTL version.
Packit Service 82fcde
   Copyright (C) 1996-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public License as
Packit Service 82fcde
   published by the Free Software Foundation; either version 2.1 of the
Packit Service 82fcde
   License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; see the file COPYING.LIB.  If
Packit Service 82fcde
   not, see <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef _LIBC_LOCKP_H
Packit Service 82fcde
#define _LIBC_LOCKP_H 1
Packit Service 82fcde
Packit Service 82fcde
#include <pthread.h>
Packit Service 82fcde
#define __need_NULL
Packit Service 82fcde
#include <stddef.h>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Fortunately Linux now has a mean to do locking which is realtime
Packit Service 82fcde
   safe without the aid of the thread library.  We also need no fancy
Packit Service 82fcde
   options like error checking mutexes etc.  We only need simple
Packit Service 82fcde
   locks, maybe recursive.  This can be easily and cheaply implemented
Packit Service 82fcde
   using futexes.  We will use them everywhere except in ld.so since
Packit Service 82fcde
   ld.so might be used on old kernels with a different libc.so.  */
Packit Service 82fcde
#include <lowlevellock.h>
Packit Service 82fcde
#include <tls.h>
Packit Service 82fcde
#include <pthread-functions.h>
Packit Service 82fcde
Packit Service 82fcde
#if IS_IN (libpthread)
Packit Service 82fcde
/* This gets us the declarations of the __pthread_* internal names,
Packit Service 82fcde
   and hidden_proto for them.  */
Packit Service 82fcde
# include <nptl/pthreadP.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Mutex type.  */
Packit Service 82fcde
#if !IS_IN (libc) && !IS_IN (libpthread)
Packit Service 82fcde
typedef pthread_mutex_t __libc_lock_t;
Packit Service 82fcde
#else
Packit Service 82fcde
typedef int __libc_lock_t;
Packit Service 82fcde
#endif
Packit Service 82fcde
typedef struct { pthread_mutex_t mutex; } __rtld_lock_recursive_t;
Packit Service 82fcde
typedef pthread_rwlock_t __libc_rwlock_t;
Packit Service 82fcde
Packit Service 82fcde
/* Type for key to thread-specific data.  */
Packit Service 82fcde
typedef pthread_key_t __libc_key_t;
Packit Service 82fcde
Packit Service 82fcde
/* Define a lock variable NAME with storage class CLASS.  The lock must be
Packit Service 82fcde
   initialized with __libc_lock_init before it can be used (or define it
Packit Service 82fcde
   with __libc_lock_define_initialized, below).  Use `extern' for CLASS to
Packit Service 82fcde
   declare a lock defined in another module.  In public structure
Packit Service 82fcde
   definitions you must use a pointer to the lock structure (i.e., NAME
Packit Service 82fcde
   begins with a `*'), because its storage size will not be known outside
Packit Service 82fcde
   of libc.  */
Packit Service 82fcde
#define __libc_lock_define(CLASS,NAME) \
Packit Service 82fcde
  CLASS __libc_lock_t NAME;
Packit Service 82fcde
#define __libc_rwlock_define(CLASS,NAME) \
Packit Service 82fcde
  CLASS __libc_rwlock_t NAME;
Packit Service 82fcde
#define __rtld_lock_define_recursive(CLASS,NAME) \
Packit Service 82fcde
  CLASS __rtld_lock_recursive_t NAME;
Packit Service 82fcde
Packit Service 82fcde
/* Define an initialized lock variable NAME with storage class CLASS.
Packit Service 82fcde
Packit Service 82fcde
   For the C library we take a deeper look at the initializer.  For
Packit Service 82fcde
   this implementation all fields are initialized to zero.  Therefore
Packit Service 82fcde
   we don't initialize the variable which allows putting it into the
Packit Service 82fcde
   BSS section.  (Except on PA-RISC and other odd architectures, where
Packit Service 82fcde
   initialized locks must be set to one due to the lack of normal
Packit Service 82fcde
   atomic operations.) */
Packit Service 82fcde
Packit Service 82fcde
#define _LIBC_LOCK_INITIALIZER LLL_LOCK_INITIALIZER
Packit Service 82fcde
#if IS_IN (libc) || IS_IN (libpthread)
Packit Service 82fcde
# if LLL_LOCK_INITIALIZER == 0
Packit Service 82fcde
#  define __libc_lock_define_initialized(CLASS,NAME) \
Packit Service 82fcde
  CLASS __libc_lock_t NAME;
Packit Service 82fcde
# else
Packit Service 82fcde
#  define __libc_lock_define_initialized(CLASS,NAME) \
Packit Service 82fcde
  CLASS __libc_lock_t NAME = LLL_LOCK_INITIALIZER;
Packit Service 82fcde
# endif
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_lock_define_initialized(CLASS,NAME) \
Packit Service 82fcde
  CLASS __libc_lock_t NAME;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#define __libc_rwlock_define_initialized(CLASS,NAME) \
Packit Service 82fcde
  CLASS __libc_rwlock_t NAME = PTHREAD_RWLOCK_INITIALIZER;
Packit Service 82fcde
Packit Service 82fcde
#define __rtld_lock_define_initialized_recursive(CLASS,NAME) \
Packit Service 82fcde
  CLASS __rtld_lock_recursive_t NAME = _RTLD_LOCK_RECURSIVE_INITIALIZER;
Packit Service 82fcde
#define _RTLD_LOCK_RECURSIVE_INITIALIZER \
Packit Service 82fcde
  {PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP}
Packit Service 82fcde
Packit Service 82fcde
#define __rtld_lock_initialize(NAME) \
Packit Service 82fcde
  (void) ((NAME) = (__rtld_lock_recursive_t) _RTLD_LOCK_RECURSIVE_INITIALIZER)
Packit Service 82fcde
Packit Service 82fcde
/* If we check for a weakly referenced symbol and then perform a
Packit Service 82fcde
   normal jump to it te code generated for some platforms in case of
Packit Service 82fcde
   PIC is unnecessarily slow.  What would happen is that the function
Packit Service 82fcde
   is first referenced as data and then it is called indirectly
Packit Service 82fcde
   through the PLT.  We can make this a direct jump.  */
Packit Service 82fcde
#ifdef __PIC__
Packit Service 82fcde
# define __libc_maybe_call(FUNC, ARGS, ELSE) \
Packit Service 82fcde
  (__extension__ ({ __typeof (FUNC) *_fn = (FUNC); \
Packit Service 82fcde
		    _fn != NULL ? (*_fn) ARGS : ELSE; }))
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_maybe_call(FUNC, ARGS, ELSE) \
Packit Service 82fcde
  (FUNC != NULL ? FUNC ARGS : ELSE)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Call thread functions through the function pointer table.  */
Packit Service 82fcde
#if defined SHARED && IS_IN (libc)
Packit Service 82fcde
# define PTFAVAIL(NAME) __libc_pthread_functions_init
Packit Service 82fcde
# define __libc_ptf_call(FUNC, ARGS, ELSE) \
Packit Service 82fcde
  (__libc_pthread_functions_init ? PTHFCT_CALL (ptr_##FUNC, ARGS) : ELSE)
Packit Service 82fcde
# define __libc_ptf_call_always(FUNC, ARGS) \
Packit Service 82fcde
  PTHFCT_CALL (ptr_##FUNC, ARGS)
Packit Service 82fcde
#elif IS_IN (libpthread)
Packit Service 82fcde
# define PTFAVAIL(NAME) 1
Packit Service 82fcde
# define __libc_ptf_call(FUNC, ARGS, ELSE) \
Packit Service 82fcde
  FUNC ARGS
Packit Service 82fcde
# define __libc_ptf_call_always(FUNC, ARGS) \
Packit Service 82fcde
  FUNC ARGS
Packit Service 82fcde
#else
Packit Service 82fcde
# define PTFAVAIL(NAME) (NAME != NULL)
Packit Service 82fcde
# define __libc_ptf_call(FUNC, ARGS, ELSE) \
Packit Service 82fcde
  __libc_maybe_call (FUNC, ARGS, ELSE)
Packit Service 82fcde
# define __libc_ptf_call_always(FUNC, ARGS) \
Packit Service 82fcde
  FUNC ARGS
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Initialize the named lock variable, leaving it in a consistent, unlocked
Packit Service 82fcde
   state.  */
Packit Service 82fcde
#if IS_IN (libc) || IS_IN (libpthread)
Packit Service 82fcde
# define __libc_lock_init(NAME) \
Packit Service 82fcde
  ((void) ((NAME) = LLL_LOCK_INITIALIZER))
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_lock_init(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_init, (&(NAME), NULL), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
#if defined SHARED && IS_IN (libc)
Packit Service 82fcde
/* ((NAME) = (__libc_rwlock_t) PTHREAD_RWLOCK_INITIALIZER) is inefficient.  */
Packit Service 82fcde
# define __libc_rwlock_init(NAME) \
Packit Service 82fcde
  ((void) __builtin_memset (&(NAME), '\0', sizeof (NAME)))
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_rwlock_init(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_rwlock_init, (&(NAME), NULL), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Finalize the named lock variable, which must be locked.  It cannot be
Packit Service 82fcde
   used again until __libc_lock_init is called again on it.  This must be
Packit Service 82fcde
   called on a lock variable before the containing storage is reused.  */
Packit Service 82fcde
#if IS_IN (libc) || IS_IN (libpthread)
Packit Service 82fcde
# define __libc_lock_fini(NAME) ((void) 0)
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_lock_fini(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_destroy, (&(NAME)), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
#if defined SHARED && IS_IN (libc)
Packit Service 82fcde
# define __libc_rwlock_fini(NAME) ((void) 0)
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_rwlock_fini(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_rwlock_destroy, (&(NAME)), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Lock the named lock variable.  */
Packit Service 82fcde
#if IS_IN (libc) || IS_IN (libpthread)
Packit Service 82fcde
# ifndef __libc_lock_lock
Packit Service 82fcde
#  define __libc_lock_lock(NAME) \
Packit Service 82fcde
  ({ lll_lock (NAME, LLL_PRIVATE); 0; })
Packit Service 82fcde
# endif
Packit Service 82fcde
#else
Packit Service 82fcde
# undef __libc_lock_lock
Packit Service 82fcde
# define __libc_lock_lock(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_lock, (&(NAME)), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
#define __libc_rwlock_rdlock(NAME) \
Packit Service 82fcde
  __libc_ptf_call (__pthread_rwlock_rdlock, (&(NAME)), 0)
Packit Service 82fcde
#define __libc_rwlock_wrlock(NAME) \
Packit Service 82fcde
  __libc_ptf_call (__pthread_rwlock_wrlock, (&(NAME)), 0)
Packit Service 82fcde
Packit Service 82fcde
/* Try to lock the named lock variable.  */
Packit Service 82fcde
#if IS_IN (libc) || IS_IN (libpthread)
Packit Service 82fcde
# ifndef __libc_lock_trylock
Packit Service 82fcde
#  define __libc_lock_trylock(NAME) \
Packit Service 82fcde
  lll_trylock (NAME)
Packit Service 82fcde
# endif
Packit Service 82fcde
#else
Packit Service 82fcde
# undef __libc_lock_trylock
Packit Service 82fcde
# define __libc_lock_trylock(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_trylock, (&(NAME)), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
#define __libc_rwlock_tryrdlock(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_rwlock_tryrdlock, (&(NAME)), 0)
Packit Service 82fcde
#define __libc_rwlock_trywrlock(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_rwlock_trywrlock, (&(NAME)), 0)
Packit Service 82fcde
Packit Service 82fcde
#define __rtld_lock_trylock_recursive(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_trylock, (&(NAME).mutex), 0)
Packit Service 82fcde
Packit Service 82fcde
/* Unlock the named lock variable.  */
Packit Service 82fcde
#if IS_IN (libc) || IS_IN (libpthread)
Packit Service 82fcde
# define __libc_lock_unlock(NAME) \
Packit Service 82fcde
  lll_unlock (NAME, LLL_PRIVATE)
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_lock_unlock(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_unlock, (&(NAME)), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
#define __libc_rwlock_unlock(NAME) \
Packit Service 82fcde
  __libc_ptf_call (__pthread_rwlock_unlock, (&(NAME)), 0)
Packit Service 82fcde
Packit Service 82fcde
#ifdef SHARED
Packit Service 82fcde
# define __rtld_lock_default_lock_recursive(lock) \
Packit Service 82fcde
  ++((pthread_mutex_t *)(lock))->__data.__count;
Packit Service 82fcde
Packit Service 82fcde
# define __rtld_lock_default_unlock_recursive(lock) \
Packit Service 82fcde
  --((pthread_mutex_t *)(lock))->__data.__count;
Packit Service 82fcde
Packit Service 82fcde
# define __rtld_lock_lock_recursive(NAME) \
Packit Service 82fcde
  GL(dl_rtld_lock_recursive) (&(NAME).mutex)
Packit Service 82fcde
Packit Service 82fcde
# define __rtld_lock_unlock_recursive(NAME) \
Packit Service 82fcde
  GL(dl_rtld_unlock_recursive) (&(NAME).mutex)
Packit Service 82fcde
#else
Packit Service 82fcde
# define __rtld_lock_lock_recursive(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_lock, (&(NAME).mutex), 0)
Packit Service 82fcde
Packit Service 82fcde
# define __rtld_lock_unlock_recursive(NAME) \
Packit Service 82fcde
  __libc_maybe_call (__pthread_mutex_unlock, (&(NAME).mutex), 0)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Define once control variable.  */
Packit Service 82fcde
#if PTHREAD_ONCE_INIT == 0
Packit Service 82fcde
/* Special case for static variables where we can avoid the initialization
Packit Service 82fcde
   if it is zero.  */
Packit Service 82fcde
# define __libc_once_define(CLASS, NAME) \
Packit Service 82fcde
  CLASS pthread_once_t NAME
Packit Service 82fcde
#else
Packit Service 82fcde
# define __libc_once_define(CLASS, NAME) \
Packit Service 82fcde
  CLASS pthread_once_t NAME = PTHREAD_ONCE_INIT
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Call handler iff the first call.  */
Packit Service 82fcde
#define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \
Packit Service 82fcde
  do {									      \
Packit Service 82fcde
    if (PTFAVAIL (__pthread_once))					      \
Packit Service 82fcde
      __libc_ptf_call_always (__pthread_once, (&(ONCE_CONTROL),		      \
Packit Service 82fcde
					       INIT_FUNCTION));		      \
Packit Service 82fcde
    else if ((ONCE_CONTROL) == PTHREAD_ONCE_INIT) {			      \
Packit Service 82fcde
      INIT_FUNCTION ();							      \
Packit Service 82fcde
      (ONCE_CONTROL) |= 2;						      \
Packit Service 82fcde
    }									      \
Packit Service 82fcde
  } while (0)
Packit Service 82fcde
Packit Service 82fcde
/* Get once control variable.  */
Packit Service 82fcde
#define __libc_once_get(ONCE_CONTROL)	((ONCE_CONTROL) != PTHREAD_ONCE_INIT)
Packit Service 82fcde
Packit Service 82fcde
/* Note that for I/O cleanup handling we are using the old-style
Packit Service 82fcde
   cancel handling.  It does not have to be integrated with C++ snce
Packit Service 82fcde
   no C++ code is called in the middle.  The old-style handling is
Packit Service 82fcde
   faster and the support is not going away.  */
Packit Service 82fcde
extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
Packit Service 82fcde
				   void (*routine) (void *), void *arg);
Packit Service 82fcde
extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
Packit Service 82fcde
				  int execute);
Packit Service 82fcde
extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer,
Packit Service 82fcde
					 void (*routine) (void *), void *arg);
Packit Service 82fcde
extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer,
Packit Service 82fcde
					  int execute);
Packit Service 82fcde
Packit Service 82fcde
/* Sometimes we have to exit the block in the middle.  */
Packit Service 82fcde
#define __libc_cleanup_end(DOIT) \
Packit Service 82fcde
    if (_avail) {							      \
Packit Service 82fcde
      __libc_ptf_call_always (_pthread_cleanup_pop_restore, (&_buffer, DOIT));\
Packit Service 82fcde
    } else if (DOIT)							      \
Packit Service 82fcde
      _buffer.__routine (_buffer.__arg)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Normal cleanup handling, based on C cleanup attribute.  */
Packit Service 82fcde
__extern_inline void
Packit Service 82fcde
__libc_cleanup_routine (struct __pthread_cleanup_frame *f)
Packit Service 82fcde
{
Packit Service 82fcde
  if (f->__do_it)
Packit Service 82fcde
    f->__cancel_routine (f->__cancel_arg);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define __libc_cleanup_push(fct, arg) \
Packit Service 82fcde
  do {									      \
Packit Service 82fcde
    struct __pthread_cleanup_frame __clframe				      \
Packit Service 82fcde
      __attribute__ ((__cleanup__ (__libc_cleanup_routine)))		      \
Packit Service 82fcde
      = { .__cancel_routine = (fct), .__cancel_arg = (arg),		      \
Packit Service 82fcde
	  .__do_it = 1 };
Packit Service 82fcde
Packit Service 82fcde
#define __libc_cleanup_pop(execute) \
Packit Service 82fcde
    __clframe.__do_it = (execute);					      \
Packit Service 82fcde
  } while (0)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Create thread-specific key.  */
Packit Service 82fcde
#define __libc_key_create(KEY, DESTRUCTOR) \
Packit Service 82fcde
  __libc_ptf_call (__pthread_key_create, (KEY, DESTRUCTOR), 1)
Packit Service 82fcde
Packit Service 82fcde
/* Get thread-specific data.  */
Packit Service 82fcde
#define __libc_getspecific(KEY) \
Packit Service 82fcde
  __libc_ptf_call (__pthread_getspecific, (KEY), NULL)
Packit Service 82fcde
Packit Service 82fcde
/* Set thread-specific data.  */
Packit Service 82fcde
#define __libc_setspecific(KEY, VALUE) \
Packit Service 82fcde
  __libc_ptf_call (__pthread_setspecific, (KEY, VALUE), 0)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Register handlers to execute before and after `fork'.  Note that the
Packit Service 82fcde
   last parameter is NULL.  The handlers registered by the libc are
Packit Service 82fcde
   never removed so this is OK.  */
Packit Service 82fcde
extern int __register_atfork (void (*__prepare) (void),
Packit Service 82fcde
			      void (*__parent) (void),
Packit Service 82fcde
			      void (*__child) (void),
Packit Service 82fcde
			      void *__dso_handle);
Packit Service 82fcde
Packit Service 82fcde
/* Functions that are used by this file and are internal to the GNU C
Packit Service 82fcde
   library.  */
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutex_init (pthread_mutex_t *__mutex,
Packit Service 82fcde
				 const pthread_mutexattr_t *__mutex_attr);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutex_destroy (pthread_mutex_t *__mutex);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutex_trylock (pthread_mutex_t *__mutex);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutex_lock (pthread_mutex_t *__mutex);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutex_unlock (pthread_mutex_t *__mutex);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutexattr_init (pthread_mutexattr_t *__attr);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutexattr_destroy (pthread_mutexattr_t *__attr);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_mutexattr_settype (pthread_mutexattr_t *__attr,
Packit Service 82fcde
					int __kind);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_rwlock_init (pthread_rwlock_t *__rwlock,
Packit Service 82fcde
				  const pthread_rwlockattr_t *__attr);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_rwlock_destroy (pthread_rwlock_t *__rwlock);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_rwlock_unlock (pthread_rwlock_t *__rwlock);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_key_create (pthread_key_t *__key,
Packit Service 82fcde
				 void (*__destr_function) (void *));
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_setspecific (pthread_key_t __key,
Packit Service 82fcde
				  const void *__pointer);
Packit Service 82fcde
Packit Service 82fcde
extern void *__pthread_getspecific (pthread_key_t __key);
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_once (pthread_once_t *__once_control,
Packit Service 82fcde
			   void (*__init_routine) (void));
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_atfork (void (*__prepare) (void),
Packit Service 82fcde
			     void (*__parent) (void),
Packit Service 82fcde
			     void (*__child) (void));
Packit Service 82fcde
Packit Service 82fcde
extern int __pthread_setcancelstate (int state, int *oldstate);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Make the pthread functions weak so that we can elide them from
Packit Service 82fcde
   single-threaded processes.  */
Packit Service 82fcde
#ifndef __NO_WEAK_PTHREAD_ALIASES
Packit Service 82fcde
# ifdef weak_extern
Packit Service 82fcde
weak_extern (__pthread_mutex_init)
Packit Service 82fcde
weak_extern (__pthread_mutex_destroy)
Packit Service 82fcde
weak_extern (__pthread_mutex_lock)
Packit Service 82fcde
weak_extern (__pthread_mutex_trylock)
Packit Service 82fcde
weak_extern (__pthread_mutex_unlock)
Packit Service 82fcde
weak_extern (__pthread_mutexattr_init)
Packit Service 82fcde
weak_extern (__pthread_mutexattr_destroy)
Packit Service 82fcde
weak_extern (__pthread_mutexattr_settype)
Packit Service 82fcde
weak_extern (__pthread_rwlock_init)
Packit Service 82fcde
weak_extern (__pthread_rwlock_destroy)
Packit Service 82fcde
weak_extern (__pthread_rwlock_rdlock)
Packit Service 82fcde
weak_extern (__pthread_rwlock_tryrdlock)
Packit Service 82fcde
weak_extern (__pthread_rwlock_wrlock)
Packit Service 82fcde
weak_extern (__pthread_rwlock_trywrlock)
Packit Service 82fcde
weak_extern (__pthread_rwlock_unlock)
Packit Service 82fcde
weak_extern (__pthread_key_create)
Packit Service 82fcde
weak_extern (__pthread_setspecific)
Packit Service 82fcde
weak_extern (__pthread_getspecific)
Packit Service 82fcde
weak_extern (__pthread_once)
Packit Service 82fcde
weak_extern (__pthread_initialize)
Packit Service 82fcde
weak_extern (__pthread_atfork)
Packit Service 82fcde
weak_extern (__pthread_setcancelstate)
Packit Service 82fcde
weak_extern (_pthread_cleanup_push_defer)
Packit Service 82fcde
weak_extern (_pthread_cleanup_pop_restore)
Packit Service 82fcde
# else
Packit Service 82fcde
#  pragma weak __pthread_mutex_init
Packit Service 82fcde
#  pragma weak __pthread_mutex_destroy
Packit Service 82fcde
#  pragma weak __pthread_mutex_lock
Packit Service 82fcde
#  pragma weak __pthread_mutex_trylock
Packit Service 82fcde
#  pragma weak __pthread_mutex_unlock
Packit Service 82fcde
#  pragma weak __pthread_mutexattr_init
Packit Service 82fcde
#  pragma weak __pthread_mutexattr_destroy
Packit Service 82fcde
#  pragma weak __pthread_mutexattr_settype
Packit Service 82fcde
#  pragma weak __pthread_rwlock_destroy
Packit Service 82fcde
#  pragma weak __pthread_rwlock_rdlock
Packit Service 82fcde
#  pragma weak __pthread_rwlock_tryrdlock
Packit Service 82fcde
#  pragma weak __pthread_rwlock_wrlock
Packit Service 82fcde
#  pragma weak __pthread_rwlock_trywrlock
Packit Service 82fcde
#  pragma weak __pthread_rwlock_unlock
Packit Service 82fcde
#  pragma weak __pthread_key_create
Packit Service 82fcde
#  pragma weak __pthread_setspecific
Packit Service 82fcde
#  pragma weak __pthread_getspecific
Packit Service 82fcde
#  pragma weak __pthread_once
Packit Service 82fcde
#  pragma weak __pthread_initialize
Packit Service 82fcde
#  pragma weak __pthread_atfork
Packit Service 82fcde
#  pragma weak __pthread_setcancelstate
Packit Service 82fcde
#  pragma weak _pthread_cleanup_push_defer
Packit Service 82fcde
#  pragma weak _pthread_cleanup_pop_restore
Packit Service 82fcde
# endif
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#endif	/* libc-lockP.h */