mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			180 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, see
 | 
						|
   <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
#ifndef _INTERNALTYPES_H
 | 
						|
#define _INTERNALTYPES_H	1
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
#include <atomic.h>
 | 
						|
#include <endian.h>
 | 
						|
 | 
						|
 | 
						|
struct pthread_attr
 | 
						|
{
 | 
						|
  /* Scheduler parameters and priority.  */
 | 
						|
  struct sched_param schedparam;
 | 
						|
  int schedpolicy;
 | 
						|
  /* Various flags like detachstate, scope, etc.  */
 | 
						|
  int flags;
 | 
						|
  /* Size of guard area.  */
 | 
						|
  size_t guardsize;
 | 
						|
  /* Stack handling.  */
 | 
						|
  void *stackaddr;
 | 
						|
  size_t stacksize;
 | 
						|
  /* Affinity map.  */
 | 
						|
  cpu_set_t *cpuset;
 | 
						|
  size_t cpusetsize;
 | 
						|
};
 | 
						|
 | 
						|
#define ATTR_FLAG_DETACHSTATE		0x0001
 | 
						|
#define ATTR_FLAG_NOTINHERITSCHED	0x0002
 | 
						|
#define ATTR_FLAG_SCOPEPROCESS		0x0004
 | 
						|
#define ATTR_FLAG_STACKADDR		0x0008
 | 
						|
#define ATTR_FLAG_OLDATTR		0x0010
 | 
						|
#define ATTR_FLAG_SCHED_SET		0x0020
 | 
						|
#define ATTR_FLAG_POLICY_SET		0x0040
 | 
						|
 | 
						|
 | 
						|
/* Mutex attribute data structure.  */
 | 
						|
struct pthread_mutexattr
 | 
						|
{
 | 
						|
  /* Identifier for the kind of mutex.
 | 
						|
 | 
						|
     Bit 31 is set if the mutex is to be shared between processes.
 | 
						|
 | 
						|
     Bit 0 to 30 contain one of the PTHREAD_MUTEX_ values to identify
 | 
						|
     the type of the mutex.  */
 | 
						|
  int mutexkind;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Conditional variable attribute data structure.  */
 | 
						|
struct pthread_condattr
 | 
						|
{
 | 
						|
  /* Combination of values:
 | 
						|
 | 
						|
     Bit 0                : flag whether conditional variable will be
 | 
						|
                            sharable between processes.
 | 
						|
     Bit 1-COND_CLOCK_BITS: Clock ID.  COND_CLOCK_BITS is the number of bits
 | 
						|
                            needed to represent the ID of the clock.  */
 | 
						|
  int value;
 | 
						|
};
 | 
						|
#define COND_CLOCK_BITS	1
 | 
						|
 | 
						|
 | 
						|
/* Read-write lock variable attribute data structure.  */
 | 
						|
struct pthread_rwlockattr
 | 
						|
{
 | 
						|
  int lockkind;
 | 
						|
  int pshared;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Barrier data structure.  See pthread_barrier_wait for a description
 | 
						|
   of how these fields are used.  */
 | 
						|
struct pthread_barrier
 | 
						|
{
 | 
						|
  unsigned int in;
 | 
						|
  unsigned int current_round;
 | 
						|
  unsigned int count;
 | 
						|
  int shared;
 | 
						|
  unsigned int out;
 | 
						|
};
 | 
						|
/* See pthread_barrier_wait for a description.  */
 | 
						|
#define BARRIER_IN_THRESHOLD (UINT_MAX/2)
 | 
						|
 | 
						|
 | 
						|
/* Barrier variable attribute data structure.  */
 | 
						|
struct pthread_barrierattr
 | 
						|
{
 | 
						|
  int pshared;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Thread-local data handling.  */
 | 
						|
struct pthread_key_struct
 | 
						|
{
 | 
						|
  /* Sequence numbers.  Even numbers indicated vacant entries.  Note
 | 
						|
     that zero is even.  We use uintptr_t to not require padding on
 | 
						|
     32- and 64-bit machines.  On 64-bit machines it helps to avoid
 | 
						|
     wrapping, too.  */
 | 
						|
  uintptr_t seq;
 | 
						|
 | 
						|
  /* Destructor for the data.  */
 | 
						|
  void (*destr) (void *);
 | 
						|
};
 | 
						|
 | 
						|
/* Check whether an entry is unused.  */
 | 
						|
#define KEY_UNUSED(p) (((p) & 1) == 0)
 | 
						|
/* Check whether a key is usable.  We cannot reuse an allocated key if
 | 
						|
   the sequence counter would overflow after the next destroy call.
 | 
						|
   This would mean that we potentially free memory for a key with the
 | 
						|
   same sequence.  This is *very* unlikely to happen, A program would
 | 
						|
   have to create and destroy a key 2^31 times (on 32-bit platforms,
 | 
						|
   on 64-bit platforms that would be 2^63).  If it should happen we
 | 
						|
   simply don't use this specific key anymore.  */
 | 
						|
#define KEY_USABLE(p) (((uintptr_t) (p)) < ((uintptr_t) ((p) + 2)))
 | 
						|
 | 
						|
 | 
						|
/* Handling of read-write lock data.  */
 | 
						|
// XXX For now there is only one flag.  Maybe more in future.
 | 
						|
#define RWLOCK_RECURSIVE(rwlock) ((rwlock)->__data.__flags != 0)
 | 
						|
 | 
						|
 | 
						|
/* Semaphore variable structure.  */
 | 
						|
struct new_sem
 | 
						|
{
 | 
						|
#if __HAVE_64B_ATOMICS
 | 
						|
  /* The data field holds both value (in the least-significant 32 bytes) and
 | 
						|
     nwaiters.  */
 | 
						|
# if __BYTE_ORDER == __LITTLE_ENDIAN
 | 
						|
#  define SEM_VALUE_OFFSET 0
 | 
						|
# elif __BYTE_ORDER == __BIG_ENDIAN
 | 
						|
#  define SEM_VALUE_OFFSET 1
 | 
						|
# else
 | 
						|
# error Unsupported byte order.
 | 
						|
# endif
 | 
						|
# define SEM_NWAITERS_SHIFT 32
 | 
						|
# define SEM_VALUE_MASK (~(unsigned int)0)
 | 
						|
  uint64_t data;
 | 
						|
  int private;
 | 
						|
  int pad;
 | 
						|
#else
 | 
						|
# define SEM_VALUE_SHIFT 1
 | 
						|
# define SEM_NWAITERS_MASK ((unsigned int)1)
 | 
						|
  unsigned int value;
 | 
						|
  int private;
 | 
						|
  int pad;
 | 
						|
  unsigned int nwaiters;
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
struct old_sem
 | 
						|
{
 | 
						|
  unsigned int value;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Compatibility type for old conditional variable interfaces.  */
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
  pthread_cond_t *cond;
 | 
						|
} pthread_cond_2_0_t;
 | 
						|
 | 
						|
#endif	/* internaltypes.h */
 |