pthread_types.h revision 1.15
1/* $NetBSD: pthread_types.h,v 1.15 2015/06/26 10:05:17 pooka Exp $ */ 2 3/*- 4 * Copyright (c) 2001, 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Nathan J. Williams. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#ifndef _LIB_PTHREAD_TYPES_H 33#define _LIB_PTHREAD_TYPES_H 34 35/* 36 * We use the "pthread_spin_t" name internally; "pthread_spinlock_t" is the 37 * POSIX spinlock object. 38 */ 39typedef __cpu_simple_lock_t pthread_spin_t; 40 41/* 42 * Copied from PTQ_HEAD in pthread_queue.h 43 */ 44#define _PTQ_HEAD(name, type) \ 45struct name { \ 46 struct type *ptqh_first;/* first element */ \ 47 struct type **ptqh_last;/* addr of last next element */ \ 48} 49 50_PTQ_HEAD(pthread_queue_struct_t, __pthread_st); 51typedef struct pthread_queue_struct_t pthread_queue_t; 52 53struct __pthread_st; 54struct __pthread_attr_st; 55struct __pthread_mutex_st; 56struct __pthread_mutexattr_st; 57struct __pthread_cond_st; 58struct __pthread_condattr_st; 59struct __pthread_spin_st; 60struct __pthread_rwlock_st; 61struct __pthread_rwlockattr_st; 62struct __pthread_barrier_st; 63struct __pthread_barrierattr_st; 64 65typedef struct __pthread_st *pthread_t; 66typedef struct __pthread_attr_st pthread_attr_t; 67typedef struct __pthread_mutex_st pthread_mutex_t; 68typedef struct __pthread_mutexattr_st pthread_mutexattr_t; 69typedef struct __pthread_cond_st pthread_cond_t; 70typedef struct __pthread_condattr_st pthread_condattr_t; 71typedef struct __pthread_once_st pthread_once_t; 72typedef struct __pthread_spinlock_st pthread_spinlock_t; 73typedef struct __pthread_rwlock_st pthread_rwlock_t; 74typedef struct __pthread_rwlockattr_st pthread_rwlockattr_t; 75typedef struct __pthread_barrier_st pthread_barrier_t; 76typedef struct __pthread_barrierattr_st pthread_barrierattr_t; 77typedef int pthread_key_t; 78 79struct __pthread_attr_st { 80 unsigned int pta_magic; 81 82 int pta_flags; 83 void *pta_private; 84}; 85 86/* 87 * C++ (namely libc++) expects to be using PTHREAD_FOO_INITIALIZER as a 88 * member initializer. This does not work for volatile types. Since C++ 89 * does not touch the guts of those types, we redefine them as non-volatile 90 */ 91#ifdef __cplusplus 92# define __pthread_spin_t \ 93 struct { unsigned char _simplelock[sizeof(__cpu_simple_lock_t)]; } \ 94 __aligned(__alignof(__cpu_simple_lock_t)) 95# define __pthread_volatile 96#else /* __cplusplus */ 97# define __pthread_spin_t pthread_spin_t 98# define __pthread_volatile volatile 99#endif /* __cplusplus */ 100 101/* 102 * ptm_owner is the actual lock field which is locked via CAS operation. 103 * This structure's layout is designed to compatible with the previous 104 * version used in SA pthreads. 105 */ 106#ifdef __CPU_SIMPLE_LOCK_PAD 107/* 108 * If __SIMPLE_UNLOCKED != 0 and we have to pad, we have to worry about 109 * endianness. Currently that isn't an issue but put in a check in case 110 * something changes in the future. 111 */ 112#if __SIMPLELOCK_UNLOCKED != 0 113#error __CPU_SIMPLE_LOCK_PAD incompatible with __SIMPLELOCK_UNLOCKED == 0 114#endif 115#endif 116struct __pthread_mutex_st { 117 unsigned int ptm_magic; 118 __pthread_spin_t ptm_errorcheck; 119#ifdef __CPU_SIMPLE_LOCK_PAD 120 uint8_t ptm_pad1[3]; 121#endif 122 __pthread_spin_t ptm_interlock; /* unused - backwards compat */ 123#ifdef __CPU_SIMPLE_LOCK_PAD 124 uint8_t ptm_pad2[3]; 125#endif 126 __pthread_volatile pthread_t ptm_owner; 127 pthread_t * __pthread_volatile ptm_waiters; 128 unsigned int ptm_recursed; 129 void *ptm_spare2; /* unused - backwards compat */ 130}; 131 132#define _PT_MUTEX_MAGIC 0x33330003 133#define _PT_MUTEX_DEAD 0xDEAD0003 134 135#ifdef __CPU_SIMPLE_LOCK_PAD 136#define _PTHREAD_MUTEX_INITIALIZER { _PT_MUTEX_MAGIC, \ 137 __SIMPLELOCK_UNLOCKED, { 0, 0, 0 }, \ 138 __SIMPLELOCK_UNLOCKED, { 0, 0, 0 }, \ 139 NULL, NULL, 0, NULL \ 140 } 141#else 142#define _PTHREAD_MUTEX_INITIALIZER { _PT_MUTEX_MAGIC, \ 143 __SIMPLELOCK_UNLOCKED, \ 144 __SIMPLELOCK_UNLOCKED, \ 145 NULL, NULL, 0, NULL \ 146 } 147#endif /* __CPU_SIMPLE_LOCK_PAD */ 148 149 150struct __pthread_mutexattr_st { 151 unsigned int ptma_magic; 152 void *ptma_private; 153}; 154 155#define _PT_MUTEXATTR_MAGIC 0x44440004 156#define _PT_MUTEXATTR_DEAD 0xDEAD0004 157 158 159struct __pthread_cond_st { 160 unsigned int ptc_magic; 161 162 /* Protects the queue of waiters */ 163 __pthread_spin_t ptc_lock; 164 pthread_queue_t ptc_waiters; 165 166 pthread_mutex_t *ptc_mutex; /* Current mutex */ 167 void *ptc_private; 168}; 169 170#define _PT_COND_MAGIC 0x55550005 171#define _PT_COND_DEAD 0xDEAD0005 172 173#define _PTHREAD_COND_INITIALIZER { _PT_COND_MAGIC, \ 174 __SIMPLELOCK_UNLOCKED, \ 175 {NULL, NULL}, \ 176 NULL, \ 177 NULL \ 178 } 179 180struct __pthread_condattr_st { 181 unsigned int ptca_magic; 182 void *ptca_private; 183}; 184 185#define _PT_CONDATTR_MAGIC 0x66660006 186#define _PT_CONDATTR_DEAD 0xDEAD0006 187 188struct __pthread_once_st { 189 pthread_mutex_t pto_mutex; 190 int pto_done; 191}; 192 193#define _PTHREAD_ONCE_INIT { PTHREAD_MUTEX_INITIALIZER, 0 } 194 195struct __pthread_spinlock_st { 196 unsigned int pts_magic; 197 __pthread_spin_t pts_spin; 198 int pts_flags; 199}; 200 201#define _PT_SPINLOCK_MAGIC 0x77770007 202#define _PT_SPINLOCK_DEAD 0xDEAD0007 203#define _PT_SPINLOCK_PSHARED 0x00000001 204 205/* PTHREAD_SPINLOCK_INITIALIZER is an extension not specified by POSIX. */ 206#define _PTHREAD_SPINLOCK_INITIALIZER { _PT_SPINLOCK_MAGIC, \ 207 __SIMPLELOCK_UNLOCKED, \ 208 0 \ 209 } 210 211struct __pthread_rwlock_st { 212 unsigned int ptr_magic; 213 214 /* Protects data below */ 215 __pthread_spin_t ptr_interlock; 216 217 pthread_queue_t ptr_rblocked; 218 pthread_queue_t ptr_wblocked; 219 unsigned int ptr_nreaders; 220 __pthread_volatile pthread_t ptr_owner; 221 void *ptr_private; 222}; 223 224#define _PT_RWLOCK_MAGIC 0x99990009 225#define _PT_RWLOCK_DEAD 0xDEAD0009 226 227#define _PTHREAD_RWLOCK_INITIALIZER { _PT_RWLOCK_MAGIC, \ 228 __SIMPLELOCK_UNLOCKED, \ 229 {NULL, NULL}, \ 230 {NULL, NULL}, \ 231 0, \ 232 NULL, \ 233 NULL, \ 234 } 235 236struct __pthread_rwlockattr_st { 237 unsigned int ptra_magic; 238 void *ptra_private; 239}; 240 241#define _PT_RWLOCKATTR_MAGIC 0x99990909 242#define _PT_RWLOCKATTR_DEAD 0xDEAD0909 243 244struct __pthread_barrier_st { 245 unsigned int ptb_magic; 246 247 /* Protects data below */ 248 pthread_spin_t ptb_lock; 249 250 pthread_queue_t ptb_waiters; 251 unsigned int ptb_initcount; 252 unsigned int ptb_curcount; 253 unsigned int ptb_generation; 254 255 void *ptb_private; 256}; 257 258#define _PT_BARRIER_MAGIC 0x88880008 259#define _PT_BARRIER_DEAD 0xDEAD0008 260 261struct __pthread_barrierattr_st { 262 unsigned int ptba_magic; 263 void *ptba_private; 264}; 265 266#define _PT_BARRIERATTR_MAGIC 0x88880808 267#define _PT_BARRIERATTR_DEAD 0xDEAD0808 268 269#endif /* _LIB_PTHREAD_TYPES_H */ 270