Blame sysdeps/htl/pt-key.h

Packit Service 82fcde
/* pthread_key internal declatations for the Hurd version.
Packit Service 82fcde
   Copyright (C) 2002-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
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the 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;  if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <pthread.h>
Packit Service 82fcde
#include <libc-lockP.h>
Packit Service 82fcde
#include <pthreadP.h>
Packit Service 82fcde
Packit Service 82fcde
#define PTHREAD_KEY_MEMBERS \
Packit Service 82fcde
  void **thread_specifics;		/* This is only resized by the thread, and always growing */ \
Packit Service 82fcde
  unsigned thread_specifics_size;	/* Number of entries in thread_specifics */
Packit Service 82fcde
Packit Service 82fcde
#define PTHREAD_KEY_INVALID (void *) (-1)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* __PTHREAD_KEY_DESTRUCTORS is an array of destructors with
Packit Service 82fcde
   __PTHREAD_KEY_SIZE elements.  If an element with index less than
Packit Service 82fcde
   __PTHREAD_KEY_COUNT is invalid, it shall contain the value
Packit Service 82fcde
   PTHREAD_KEY_INVALID which shall be distinct from NULL.
Packit Service 82fcde
Packit Service 82fcde
   Normally, we just add new keys to the end of the array and realloc
Packit Service 82fcde
   it as necessary.  The pthread_key_create routine may decide to
Packit Service 82fcde
   rescan the array if __PTHREAD_KEY_FREE is large.  */
Packit Service 82fcde
extern void (**__pthread_key_destructors) (void *arg);
Packit Service 82fcde
extern int __pthread_key_size;
Packit Service 82fcde
extern int __pthread_key_count;
Packit Service 82fcde
/* Number of invalid elements in the array.  Does not include elements
Packit Service 82fcde
   for which memory has been allocated but which have not yet been
Packit Service 82fcde
   used (i.e. those elements with indexes greater than
Packit Service 82fcde
   __PTHREAD_KEY_COUNT).  */
Packit Service 82fcde
extern int __pthread_key_invalid_count;
Packit Service 82fcde
Packit Service 82fcde
/* Protects the above variables.  This must be a recursive lock: the
Packit Service 82fcde
   destructors may call pthread_key_delete.  */
Packit Service 82fcde
extern pthread_mutex_t __pthread_key_lock;
Packit Service 82fcde

Packit Service 82fcde
#include <assert.h>
Packit Service 82fcde
Packit Service 82fcde
static inline void
Packit Service 82fcde
__pthread_key_lock_ready (void)
Packit Service 82fcde
{
Packit Service 82fcde
  static pthread_once_t o = PTHREAD_ONCE_INIT;
Packit Service 82fcde
Packit Service 82fcde
  void do_init (void)
Packit Service 82fcde
  {
Packit Service 82fcde
    int err;
Packit Service 82fcde
    pthread_mutexattr_t attr;
Packit Service 82fcde
Packit Service 82fcde
    err = __pthread_mutexattr_init (&attr);
Packit Service 82fcde
    assert_perror (err);
Packit Service 82fcde
Packit Service 82fcde
    err = __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
Packit Service 82fcde
    assert_perror (err);
Packit Service 82fcde
Packit Service 82fcde
    err = _pthread_mutex_init (&__pthread_key_lock, &attr);
Packit Service 82fcde
    assert_perror (err);
Packit Service 82fcde
Packit Service 82fcde
    err = __pthread_mutexattr_destroy (&attr);
Packit Service 82fcde
    assert_perror (err);
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  __pthread_once (&o, do_init);
Packit Service 82fcde
}