pthread_types.h revision 1.8
1/*	$NetBSD: pthread_types.h,v 1.8 2007/09/07 14:09:28 ad Exp $	*/
2
3/*-
4 * Copyright (c) 2001 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 * 3. All advertising materials mentioning features or use of this software
19 *    must display the following acknowledgement:
20 *        This product includes software developed by the NetBSD
21 *        Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 *    contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#ifndef _LIB_PTHREAD_TYPES_H
40#define _LIB_PTHREAD_TYPES_H
41
42/*
43 * We use the "pthread_spin_t" name internally; "pthread_spinlock_t" is the
44 * POSIX spinlock object.
45 */
46typedef __cpu_simple_lock_t	pthread_spin_t;
47
48/*
49 * Copied from PTQ_HEAD in pthread_queue.h
50 */
51#define _PTQ_HEAD(name, type)	       				\
52struct name {								\
53	struct type *ptqh_first;/* first element */			\
54	struct type **ptqh_last;/* addr of last next element */		\
55}
56
57_PTQ_HEAD(pthread_queue_struct_t, __pthread_st);
58typedef struct pthread_queue_struct_t pthread_queue_t;
59
60struct	__pthread_st;
61struct	__pthread_attr_st;
62struct	__pthread_mutex_st;
63struct	__pthread_mutexattr_st;
64struct	__pthread_cond_st;
65struct	__pthread_condattr_st;
66struct	__pthread_spin_st;
67struct	__pthread_rwlock_st;
68struct	__pthread_rwlockattr_st;
69struct	__pthread_barrier_st;
70struct	__pthread_barrierattr_st;
71
72typedef struct __pthread_st *pthread_t;
73typedef struct __pthread_attr_st pthread_attr_t;
74typedef struct __pthread_mutex_st pthread_mutex_t;
75typedef struct __pthread_mutexattr_st pthread_mutexattr_t;
76typedef struct __pthread_cond_st pthread_cond_t;
77typedef struct __pthread_condattr_st pthread_condattr_t;
78typedef struct __pthread_once_st pthread_once_t;
79typedef struct __pthread_spinlock_st pthread_spinlock_t;
80typedef struct __pthread_rwlock_st pthread_rwlock_t;
81typedef struct __pthread_rwlockattr_st pthread_rwlockattr_t;
82typedef struct __pthread_barrier_st pthread_barrier_t;
83typedef struct __pthread_barrierattr_st pthread_barrierattr_t;
84typedef int pthread_key_t;
85
86struct	__pthread_attr_st {
87	unsigned int	pta_magic;
88
89	int	pta_flags;
90	void	*pta_private;
91};
92
93/*
94 * ptm_lock will never be spun on: it's locked with
95 * pthread__simple_lock_try() or not at all.
96 */
97struct	__pthread_mutex_st {
98	unsigned int	ptm_magic;
99	pthread_spin_t	ptm_lock;
100	pthread_spin_t	ptm_interlock;
101	volatile pthread_t ptm_owner;
102	pthread_queue_t	ptm_blocked;
103	void		*ptm_private;
104};
105
106#define	_PT_MUTEX_MAGIC	0x33330003
107#define	_PT_MUTEX_DEAD	0xDEAD0003
108
109#define _PTHREAD_MUTEX_INITIALIZER { _PT_MUTEX_MAGIC, 			\
110				    __SIMPLELOCK_UNLOCKED,		\
111				    __SIMPLELOCK_UNLOCKED,		\
112				    NULL,				\
113				    {NULL, NULL},			\
114				    NULL				\
115				  }
116
117
118struct	__pthread_mutexattr_st {
119	unsigned int	ptma_magic;
120	void	*ptma_private;
121};
122
123#define _PT_MUTEXATTR_MAGIC	0x44440004
124#define _PT_MUTEXATTR_DEAD	0xDEAD0004
125
126
127struct	__pthread_cond_st {
128	unsigned int	ptc_magic;
129
130	/* Protects the queue of waiters */
131	pthread_spin_t	ptc_lock;
132	pthread_queue_t	ptc_waiters;
133
134	pthread_mutex_t	*ptc_mutex;	/* Current mutex */
135	void	*ptc_private;
136};
137
138#define	_PT_COND_MAGIC	0x55550005
139#define	_PT_COND_DEAD	0xDEAD0005
140
141#define _PTHREAD_COND_INITIALIZER { _PT_COND_MAGIC,			\
142				   __SIMPLELOCK_UNLOCKED,		\
143				   {NULL, NULL},			\
144				   NULL,				\
145				   NULL  				\
146				 }
147
148struct	__pthread_condattr_st {
149	unsigned int	ptca_magic;
150	void	*ptca_private;
151};
152
153#define	_PT_CONDATTR_MAGIC	0x66660006
154#define	_PT_CONDATTR_DEAD	0xDEAD0006
155
156struct	__pthread_once_st {
157	pthread_mutex_t	pto_mutex;
158	int	pto_done;
159};
160
161#define _PTHREAD_ONCE_INIT	{ PTHREAD_MUTEX_INITIALIZER, 0 }
162
163struct	__pthread_spinlock_st {
164	unsigned int	pts_magic;
165	pthread_spin_t	pts_spin;
166	int		pts_flags;
167};
168
169#define	_PT_SPINLOCK_MAGIC	0x77770007
170#define	_PT_SPINLOCK_DEAD	0xDEAD0007
171#define _PT_SPINLOCK_PSHARED	0x00000001
172
173/* PTHREAD_SPINLOCK_INITIALIZER is an extension not specified by POSIX. */
174#define _PTHREAD_SPINLOCK_INITIALIZER { _PT_SPINLOCK_MAGIC,		\
175				       __SIMPLELOCK_UNLOCKED,		\
176				       0				\
177				     }
178
179struct	__pthread_rwlock_st {
180	unsigned int	ptr_magic;
181
182	/* Protects data below */
183	pthread_spin_t	ptr_interlock;
184
185	pthread_queue_t	ptr_rblocked;
186	pthread_queue_t	ptr_wblocked;
187	unsigned int	ptr_nreaders;
188	volatile pthread_t ptr_writer;
189	void	*ptr_private;
190};
191
192#define	_PT_RWLOCK_MAGIC	0x99990009
193#define	_PT_RWLOCK_DEAD		0xDEAD0009
194
195#define _PTHREAD_RWLOCK_INITIALIZER { _PT_RWLOCK_MAGIC,			\
196				     __SIMPLELOCK_UNLOCKED,		\
197				     {NULL, NULL},			\
198				     {NULL, NULL},			\
199				     0,					\
200				     NULL,				\
201				     NULL,				\
202				   }
203
204struct	__pthread_rwlockattr_st {
205	unsigned int	ptra_magic;
206	void *ptra_private;
207};
208
209#define _PT_RWLOCKATTR_MAGIC	0x99990909
210#define _PT_RWLOCKATTR_DEAD	0xDEAD0909
211
212struct	__pthread_barrier_st {
213	unsigned int	ptb_magic;
214
215	/* Protects data below */
216	pthread_spin_t	ptb_lock;
217
218	pthread_queue_t	ptb_waiters;
219	unsigned int	ptb_initcount;
220	unsigned int	ptb_curcount;
221	unsigned int	ptb_generation;
222
223	void		*ptb_private;
224};
225
226#define	_PT_BARRIER_MAGIC	0x88880008
227#define	_PT_BARRIER_DEAD	0xDEAD0008
228
229struct	__pthread_barrierattr_st {
230	unsigned int	ptba_magic;
231	void		*ptba_private;
232};
233
234#define	_PT_BARRIERATTR_MAGIC	0x88880808
235#define	_PT_BARRIERATTR_DEAD	0xDEAD0808
236
237#endif	/* _LIB_PTHREAD_TYPES_H */
238