blob: 44bf1e358dbdaaff26eec1b4e159a4155b0cecda [file] [log] [blame]
/* 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 */