]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/cddl/contrib/opensolaris/uts/common/sys/synch.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / cddl / contrib / opensolaris / uts / common / sys / synch.h
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 */