pthread_types.h revision 1.10
1/*	$NetBSD: pthread_types.h,v 1.10 2008/04/28 20:23:02 martin 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 * ptm_lock will never be spun on: it's locked with
88 * pthread__simple_lock_try() or not at all.
89 */
90struct	__pthread_mutex_st {
91	unsigned int	ptm_magic;
92	unsigned int	ptm_errorcheck;
93	unsigned int	ptm_recursed;
94	pthread_t * volatile ptm_waiters;
95	volatile pthread_t ptm_owner;
96};
97
98#define	_PT_MUTEX_MAGIC	0x33330003
99#define	_PT_MUTEX_DEAD	0xDEAD0003
100
101#define _PTHREAD_MUTEX_INITIALIZER { _PT_MUTEX_MAGIC, 0, 0, NULL, NULL }
102
103struct	__pthread_mutexattr_st {
104	unsigned int	ptma_magic;
105	void	*ptma_private;
106};
107
108#define _PT_MUTEXATTR_MAGIC	0x44440004
109#define _PT_MUTEXATTR_DEAD	0xDEAD0004
110
111
112struct	__pthread_cond_st {
113	unsigned int	ptc_magic;
114
115	/* Protects the queue of waiters */
116	pthread_spin_t	ptc_lock;
117	pthread_queue_t	ptc_waiters;
118
119	pthread_mutex_t	*ptc_mutex;	/* Current mutex */
120	void	*ptc_private;
121};
122
123#define	_PT_COND_MAGIC	0x55550005
124#define	_PT_COND_DEAD	0xDEAD0005
125
126#define _PTHREAD_COND_INITIALIZER { _PT_COND_MAGIC,			\
127				   __SIMPLELOCK_UNLOCKED,		\
128				   {NULL, NULL},			\
129				   NULL,				\
130				   NULL  				\
131				 }
132
133struct	__pthread_condattr_st {
134	unsigned int	ptca_magic;
135	void	*ptca_private;
136};
137
138#define	_PT_CONDATTR_MAGIC	0x66660006
139#define	_PT_CONDATTR_DEAD	0xDEAD0006
140
141struct	__pthread_once_st {
142	pthread_mutex_t	pto_mutex;
143	int	pto_done;
144};
145
146#define _PTHREAD_ONCE_INIT	{ PTHREAD_MUTEX_INITIALIZER, 0 }
147
148struct	__pthread_spinlock_st {
149	unsigned int	pts_magic;
150	pthread_spin_t	pts_spin;
151	int		pts_flags;
152};
153
154#define	_PT_SPINLOCK_MAGIC	0x77770007
155#define	_PT_SPINLOCK_DEAD	0xDEAD0007
156#define _PT_SPINLOCK_PSHARED	0x00000001
157
158/* PTHREAD_SPINLOCK_INITIALIZER is an extension not specified by POSIX. */
159#define _PTHREAD_SPINLOCK_INITIALIZER { _PT_SPINLOCK_MAGIC,		\
160				       __SIMPLELOCK_UNLOCKED,		\
161				       0				\
162				     }
163
164struct	__pthread_rwlock_st {
165	unsigned int	ptr_magic;
166
167	/* Protects data below */
168	pthread_spin_t	ptr_interlock;
169
170	pthread_queue_t	ptr_rblocked;
171	pthread_queue_t	ptr_wblocked;
172	unsigned int	ptr_nreaders;
173	volatile pthread_t ptr_owner;
174	void	*ptr_private;
175};
176
177#define	_PT_RWLOCK_MAGIC	0x99990009
178#define	_PT_RWLOCK_DEAD		0xDEAD0009
179
180#define _PTHREAD_RWLOCK_INITIALIZER { _PT_RWLOCK_MAGIC,			\
181				     __SIMPLELOCK_UNLOCKED,		\
182				     {NULL, NULL},			\
183				     {NULL, NULL},			\
184				     0,					\
185				     NULL,				\
186				     NULL,				\
187				   }
188
189struct	__pthread_rwlockattr_st {
190	unsigned int	ptra_magic;
191	void *ptra_private;
192};
193
194#define _PT_RWLOCKATTR_MAGIC	0x99990909
195#define _PT_RWLOCKATTR_DEAD	0xDEAD0909
196
197struct	__pthread_barrier_st {
198	unsigned int	ptb_magic;
199
200	/* Protects data below */
201	pthread_spin_t	ptb_lock;
202
203	pthread_queue_t	ptb_waiters;
204	unsigned int	ptb_initcount;
205	unsigned int	ptb_curcount;
206	unsigned int	ptb_generation;
207
208	void		*ptb_private;
209};
210
211#define	_PT_BARRIER_MAGIC	0x88880008
212#define	_PT_BARRIER_DEAD	0xDEAD0008
213
214struct	__pthread_barrierattr_st {
215	unsigned int	ptba_magic;
216	void		*ptba_private;
217};
218
219#define	_PT_BARRIERATTR_MAGIC	0x88880808
220#define	_PT_BARRIERATTR_DEAD	0xDEAD0808
221
222#endif	/* _LIB_PTHREAD_TYPES_H */
223