xref: /illumos-gate/usr/src/uts/common/sys/synch.h (revision 2a8d6eba033e4713ab12b61178f0513f1f075482)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_SYNCH_H
28 #define	_SYS_SYNCH_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifndef _ASM
33 #include <sys/types.h>
34 #include <sys/int_types.h>
35 #endif /* _ASM */
36 
37 #ifdef	__cplusplus
38 extern "C" {
39 #endif
40 
41 #ifndef _ASM
42 /*
43  * Thread and LWP mutexes have the same type
44  * definitions.
45  *
46  * NOTE:
47  *
48  * POSIX requires that <pthread.h> define the structures pthread_mutex_t
49  * and pthread_cond_t.  Although these structures are identical to mutex_t
50  * (lwp_mutex_t) and cond_t (lwp_cond_t), defined here, a typedef of these
51  * types would require including <synch.h> in <pthread.h>, pulling in
52  * non-posix symbols/constants, violating POSIX namespace restrictions.  Hence,
53  * pthread_mutex_t/pthread_cond_t have been redefined (in <sys/types.h>).
54  * Any modifications done to mutex_t/lwp_mutex_t or cond_t/lwp_cond_t must
55  * also be done to pthread_mutex_t/pthread_cond_t.
56  */
57 typedef struct _lwp_mutex {
58 	struct {
59 		uint16_t	flag1;
60 		uint8_t		flag2;
61 		uint8_t		ceiling;
62 		union {
63 			uint16_t bcptype;
64 			struct {
65 				uint8_t	count_type1;
66 				uint8_t	count_type2;
67 			} mtype_rcount;
68 		} mbcp_type_un;
69 		uint16_t	magic;
70 	} flags;
71 	union {
72 		struct {
73 			uint8_t	pad[8];
74 		} lock64;
75 		struct {
76 			uint32_t ownerpid;
77 			uint32_t lockword;
78 		} lock32;
79 		upad64_t owner64;
80 	} lock;
81 	upad64_t data;
82 } lwp_mutex_t;
83 
84 /*
85  * Thread and LWP condition variables have the same
86  * type definition.
87  * NOTE:
88  * The layout of the following structure should be kept in sync with the
89  * layout of pthread_cond_t in sys/types.h. See NOTE above for lwp_mutex_t.
90  */
91 typedef struct _lwp_cond {
92 	struct {
93 		uint8_t		flag[4];
94 		uint16_t 	type;
95 		uint16_t 	magic;
96 	} flags;
97 	upad64_t data;
98 } lwp_cond_t;
99 
100 /*
101  * LWP semaphores
102  */
103 typedef struct _lwp_sema {
104 	uint32_t	count;		/* semaphore count */
105 	uint16_t 	type;
106 	uint16_t 	magic;
107 	uint8_t		flags[8];	/* last byte reserved for waiters */
108 	upad64_t	data;		/* optional data */
109 } lwp_sema_t;
110 
111 /*
112  * Thread and LWP rwlocks have the same type definition.
113  * NOTE: The layout of this structure should be kept in sync with the layout
114  * of the correponding structure of pthread_rwlock_t in sys/types.h.
115  * Also, because we have to deal with C++, there is an identical structure
116  * for rwlock_t in head/sync.h that we cannot change.
117  */
118 typedef struct _lwp_rwlock {
119 	int32_t		readers;	/* rwstate word */
120 	uint16_t	type;
121 	uint16_t	magic;
122 	lwp_mutex_t	mutex;		/* used with process-shared rwlocks */
123 	lwp_cond_t	readercv;	/* used only to indicate ownership */
124 	lwp_cond_t	writercv;	/* used only to indicate ownership */
125 } lwp_rwlock_t;
126 
127 #endif /* _ASM */
128 /*
129  * Definitions of synchronization types.
130  */
131 #define	USYNC_THREAD	0x00		/* private to a process */
132 #define	USYNC_PROCESS	0x01		/* shared by processes */
133 
134 /* Keep the following values in sync with pthread.h */
135 #define	LOCK_NORMAL		0x00		/* same as USYNC_THREAD */
136 #define	LOCK_SHARED		0x01		/* same as USYNC_PROCESS */
137 #define	LOCK_ERRORCHECK		0x02		/* error check lock */
138 #define	LOCK_RECURSIVE		0x04		/* recursive lock */
139 #define	LOCK_PRIO_INHERIT	0x10		/* priority inheritance lock */
140 #define	LOCK_PRIO_PROTECT	0x20		/* priority ceiling lock */
141 #define	LOCK_ROBUST		0x40		/* robust lock */
142 
143 /*
144  * USYNC_PROCESS_ROBUST is a deprecated historical type.  It is mapped
145  * into (USYNC_PROCESS | LOCK_ROBUST) by mutex_init().  Application code
146  * should be revised to use (USYNC_PROCESS | LOCK_ROBUST) rather than this.
147  */
148 #define	USYNC_PROCESS_ROBUST	0x08
149 
150 /*
151  * lwp_mutex_t flags
152  */
153 #define	LOCK_OWNERDEAD		0x1
154 #define	LOCK_NOTRECOVERABLE	0x2
155 #define	LOCK_INITED		0x4
156 #define	LOCK_UNMAPPED		0x8
157 
158 #ifdef	__cplusplus
159 }
160 #endif
161 
162 #endif /* _SYS_SYNCH_H */
163