text: /* Common threading primitives definitions for both POSIX and C11.
     Copyright (C) 2017-2021 Free Software Foundation, Inc.
     This file is part of the GNU C Library.
  
     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
     <https://www.gnu.org/licenses/>.  */
  
  #ifndef _THREAD_SHARED_TYPES_H
  #define _THREAD_SHARED_TYPES_H 1
  
  /* Arch-specific definitions.  Each architecture must define the following
     macros to define the expected sizes of pthread data types:
  
     __SIZEOF_PTHREAD_ATTR_T        - size of pthread_attr_t.
     __SIZEOF_PTHREAD_MUTEX_T       - size of pthread_mutex_t.
     __SIZEOF_PTHREAD_MUTEXATTR_T   - size of pthread_mutexattr_t.
     __SIZEOF_PTHREAD_COND_T        - size of pthread_cond_t.
     __SIZEOF_PTHREAD_CONDATTR_T    - size of pthread_condattr_t.
     __SIZEOF_PTHREAD_RWLOCK_T      - size of pthread_rwlock_t.
     __SIZEOF_PTHREAD_RWLOCKATTR_T  - size of pthread_rwlockattr_t.
     __SIZEOF_PTHREAD_BARRIER_T     - size of pthread_barrier_t.
     __SIZEOF_PTHREAD_BARRIERATTR_T - size of pthread_barrierattr_t.
  
     The additional macro defines any constraint for the lock alignment
     inside the thread structures:
  
     __LOCK_ALIGNMENT - for internal lock/futex usage.
  
     Same idea but for the once locking primitive:
  
     __ONCE_ALIGNMENT - for pthread_once_t/once_flag definition.  */
  
  #include <bits/pthreadtypes-arch.h>
  
  
  /* Common definition of pthread_mutex_t. */
  
  typedef struct __pthread_internal_list
  {
    struct __pthread_internal_list *__prev;
    struct __pthread_internal_list *__next;
  } __pthread_list_t;
  
  typedef struct __pthread_internal_slist
  {
    struct __pthread_internal_slist *__next;
  } __pthread_slist_t;
  
  /* Arch-specific mutex definitions.  A generic implementation is provided
     by sysdeps/nptl/bits/struct_mutex.h.  If required, an architecture
     can override it by defining:
  
     1. struct __pthread_mutex_s (used on both pthread_mutex_t and mtx_t
        definition).  It should contains at least the internal members
        defined in the generic version.
  
     2. __LOCK_ALIGNMENT for any extra attribute for internal lock used with
        atomic operations.
  
     3. The macro __PTHREAD_MUTEX_INITIALIZER used for static initialization.
        It should initialize the mutex internal flag.  */
  
  #include <bits/struct_mutex.h>
  
  /* Arch-sepecific read-write lock definitions.  A generic implementation is
     provided by struct_rwlock.h.  If required, an architecture can override it
     by defining:
  
     1. struct __pthread_rwlock_arch_t (used on pthread_rwlock_t definition).
        It should contain at least the internal members defined in the
        generic version.
  
     2. The macro __PTHREAD_RWLOCK_INITIALIZER used for static initialization.
        It should initialize the rwlock internal type.  */
  
  #include <bits/struct_rwlock.h>
  
  
  /* Common definition of pthread_cond_t. */
  
  struct __pthread_cond_s
  {
    __extension__ union
    {
      __extension__ unsigned long long int __wseq;
      struct
      {
        unsigned int __low;
        unsigned int __high;
      } __wseq32;
    };
    __extension__ union
    {
      __extension__ unsigned long long int __g1_start;
      struct
      {
        unsigned int __low;
        unsigned int __high;
      } __g1_start32;
    };
    unsigned int __g_refs[2] __LOCK_ALIGNMENT;
    unsigned int __g_size[2];
    unsigned int __g1_orig_size;
    unsigned int __wrefs;
    unsigned int __g_signals[2];
  };
  
  typedef unsigned int __tss_t;
  typedef unsigned long int __thrd_t;
  
  typedef struct
  {
    int __data __ONCE_ALIGNMENT;
  } __once_flag;
  
  #define __ONCE_FLAG_INIT { 0 }
  
  #endif /* _THREAD_SHARED_TYPES_H  */
  