Blame sysdeps/nptl/internaltypes.h

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
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
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
#ifndef _INTERNALTYPES_H
Packit Service 82fcde
#define _INTERNALTYPES_H	1
Packit Service 82fcde
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#include <atomic.h>
Packit Service 82fcde
#include <endian.h>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
struct pthread_attr
Packit Service 82fcde
{
Packit Service 82fcde
  /* Scheduler parameters and priority.  */
Packit Service 82fcde
  struct sched_param schedparam;
Packit Service 82fcde
  int schedpolicy;
Packit Service 82fcde
  /* Various flags like detachstate, scope, etc.  */
Packit Service 82fcde
  int flags;
Packit Service 82fcde
  /* Size of guard area.  */
Packit Service 82fcde
  size_t guardsize;
Packit Service 82fcde
  /* Stack handling.  */
Packit Service 82fcde
  void *stackaddr;
Packit Service 82fcde
  size_t stacksize;
Packit Service 82fcde
  /* Affinity map.  */
Packit Service 82fcde
  cpu_set_t *cpuset;
Packit Service 82fcde
  size_t cpusetsize;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
#define ATTR_FLAG_DETACHSTATE		0x0001
Packit Service 82fcde
#define ATTR_FLAG_NOTINHERITSCHED	0x0002
Packit Service 82fcde
#define ATTR_FLAG_SCOPEPROCESS		0x0004
Packit Service 82fcde
#define ATTR_FLAG_STACKADDR		0x0008
Packit Service 82fcde
#define ATTR_FLAG_OLDATTR		0x0010
Packit Service 82fcde
#define ATTR_FLAG_SCHED_SET		0x0020
Packit Service 82fcde
#define ATTR_FLAG_POLICY_SET		0x0040
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Mutex attribute data structure.  */
Packit Service 82fcde
struct pthread_mutexattr
Packit Service 82fcde
{
Packit Service 82fcde
  /* Identifier for the kind of mutex.
Packit Service 82fcde
Packit Service 82fcde
     Bit 31 is set if the mutex is to be shared between processes.
Packit Service 82fcde
Packit Service 82fcde
     Bit 0 to 30 contain one of the PTHREAD_MUTEX_ values to identify
Packit Service 82fcde
     the type of the mutex.  */
Packit Service 82fcde
  int mutexkind;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Conditional variable attribute data structure.  */
Packit Service 82fcde
struct pthread_condattr
Packit Service 82fcde
{
Packit Service 82fcde
  /* Combination of values:
Packit Service 82fcde
Packit Service 82fcde
     Bit 0                : flag whether conditional variable will be
Packit Service 82fcde
                            sharable between processes.
Packit Service 82fcde
     Bit 1-COND_CLOCK_BITS: Clock ID.  COND_CLOCK_BITS is the number of bits
Packit Service 82fcde
                            needed to represent the ID of the clock.  */
Packit Service 82fcde
  int value;
Packit Service 82fcde
};
Packit Service 82fcde
#define COND_CLOCK_BITS	1
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Read-write lock variable attribute data structure.  */
Packit Service 82fcde
struct pthread_rwlockattr
Packit Service 82fcde
{
Packit Service 82fcde
  int lockkind;
Packit Service 82fcde
  int pshared;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Barrier data structure.  See pthread_barrier_wait for a description
Packit Service 82fcde
   of how these fields are used.  */
Packit Service 82fcde
struct pthread_barrier
Packit Service 82fcde
{
Packit Service 82fcde
  unsigned int in;
Packit Service 82fcde
  unsigned int current_round;
Packit Service 82fcde
  unsigned int count;
Packit Service 82fcde
  int shared;
Packit Service 82fcde
  unsigned int out;
Packit Service 82fcde
};
Packit Service 82fcde
/* See pthread_barrier_wait for a description.  */
Packit Service 82fcde
#define BARRIER_IN_THRESHOLD (UINT_MAX/2)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Barrier variable attribute data structure.  */
Packit Service 82fcde
struct pthread_barrierattr
Packit Service 82fcde
{
Packit Service 82fcde
  int pshared;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Thread-local data handling.  */
Packit Service 82fcde
struct pthread_key_struct
Packit Service 82fcde
{
Packit Service 82fcde
  /* Sequence numbers.  Even numbers indicated vacant entries.  Note
Packit Service 82fcde
     that zero is even.  We use uintptr_t to not require padding on
Packit Service 82fcde
     32- and 64-bit machines.  On 64-bit machines it helps to avoid
Packit Service 82fcde
     wrapping, too.  */
Packit Service 82fcde
  uintptr_t seq;
Packit Service 82fcde
Packit Service 82fcde
  /* Destructor for the data.  */
Packit Service 82fcde
  void (*destr) (void *);
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/* Check whether an entry is unused.  */
Packit Service 82fcde
#define KEY_UNUSED(p) (((p) & 1) == 0)
Packit Service 82fcde
/* Check whether a key is usable.  We cannot reuse an allocated key if
Packit Service 82fcde
   the sequence counter would overflow after the next destroy call.
Packit Service 82fcde
   This would mean that we potentially free memory for a key with the
Packit Service 82fcde
   same sequence.  This is *very* unlikely to happen, A program would
Packit Service 82fcde
   have to create and destroy a key 2^31 times (on 32-bit platforms,
Packit Service 82fcde
   on 64-bit platforms that would be 2^63).  If it should happen we
Packit Service 82fcde
   simply don't use this specific key anymore.  */
Packit Service 82fcde
#define KEY_USABLE(p) (((uintptr_t) (p)) < ((uintptr_t) ((p) + 2)))
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Handling of read-write lock data.  */
Packit Service 82fcde
// XXX For now there is only one flag.  Maybe more in future.
Packit Service 82fcde
#define RWLOCK_RECURSIVE(rwlock) ((rwlock)->__data.__flags != 0)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Semaphore variable structure.  */
Packit Service 82fcde
struct new_sem
Packit Service 82fcde
{
Packit Service 82fcde
#if __HAVE_64B_ATOMICS
Packit Service 82fcde
  /* The data field holds both value (in the least-significant 32 bits) and
Packit Service 82fcde
     nwaiters.  */
Packit Service 82fcde
# if __BYTE_ORDER == __LITTLE_ENDIAN
Packit Service 82fcde
#  define SEM_VALUE_OFFSET 0
Packit Service 82fcde
# elif __BYTE_ORDER == __BIG_ENDIAN
Packit Service 82fcde
#  define SEM_VALUE_OFFSET 1
Packit Service 82fcde
# else
Packit Service 82fcde
# error Unsupported byte order.
Packit Service 82fcde
# endif
Packit Service 82fcde
# define SEM_NWAITERS_SHIFT 32
Packit Service 82fcde
# define SEM_VALUE_MASK (~(unsigned int)0)
Packit Service 82fcde
  uint64_t data;
Packit Service 82fcde
  int private;
Packit Service 82fcde
  int pad;
Packit Service 82fcde
#else
Packit Service 82fcde
# define SEM_VALUE_SHIFT 1
Packit Service 82fcde
# define SEM_NWAITERS_MASK ((unsigned int)1)
Packit Service 82fcde
  unsigned int value;
Packit Service 82fcde
  int private;
Packit Service 82fcde
  int pad;
Packit Service 82fcde
  unsigned int nwaiters;
Packit Service 82fcde
#endif
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
struct old_sem
Packit Service 82fcde
{
Packit Service 82fcde
  unsigned int value;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Compatibility type for old conditional variable interfaces.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  pthread_cond_t *cond;
Packit Service 82fcde
} pthread_cond_2_0_t;
Packit Service 82fcde
Packit Service 82fcde
#endif	/* internaltypes.h */