]> git.saurik.com Git - apple/xnu.git/blob - osfmk/i386/locks.h
c262da07c80a8f59d5952eadcb69d5f74d4f8b34
[apple/xnu.git] / osfmk / i386 / locks.h
1 /*
2 * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22
23 #ifndef _I386_LOCKS_H_
24 #define _I386_LOCKS_H_
25
26 #include <sys/appleapiopts.h>
27 #include <kern/kern_types.h>
28
29 #ifdef MACH_KERNEL_PRIVATE
30
31 #include <i386/hw_lock_types.h>
32
33 extern unsigned int LcksOpts;
34
35 #define enaLkDeb 0x00000001 /* Request debug in default attribute */
36 #define enaLkStat 0x00000002 /* Request statistic in default attribute */
37
38 #endif
39
40 #ifdef MACH_KERNEL_PRIVATE
41 typedef struct {
42 unsigned int lck_spin_data[10]; /* XXX - usimple_lock_data_t */
43 } lck_spin_t;
44
45 #define LCK_SPIN_TAG_DESTROYED 0x00002007 /* lock marked as Destroyed */
46
47 #else
48 #ifdef KERNEL_PRIVATE
49 typedef struct {
50 unsigned int opaque[10];
51 } lck_spin_t;
52 #else
53 typedef struct __lck_spin_t__ lck_spin_t;
54 #endif
55 #endif
56
57 #ifdef MACH_KERNEL_PRIVATE
58 typedef struct _lck_mtx_ {
59 union {
60 struct {
61 unsigned int lck_mtxd_ilk;
62 unsigned int lck_mtxd_locked;
63 unsigned short lck_mtxd_waiters;
64 unsigned short lck_mtxd_pri;
65 } lck_mtxd;
66 struct {
67 unsigned int lck_mtxi_tag;
68 struct _lck_mtx_ext_ *lck_mtxi_ptr;
69 unsigned int lck_mtxi_pad8;
70 } lck_mtxi;
71 } lck_mtx_sw;
72 } lck_mtx_t;
73
74 #define lck_mtx_ilk lck_mtx_sw.lck_mtxd.lck_mtxd_ilk
75 #define lck_mtx_locked lck_mtx_sw.lck_mtxd.lck_mtxd_locked
76 #define lck_mtx_waiters lck_mtx_sw.lck_mtxd.lck_mtxd_waiters
77 #define lck_mtx_pri lck_mtx_sw.lck_mtxd.lck_mtxd_pri
78
79 #define lck_mtx_tag lck_mtx_sw.lck_mtxi.lck_mtxi_tag
80 #define lck_mtx_ptr lck_mtx_sw.lck_mtxi.lck_mtxi_ptr
81
82 #define LCK_MTX_TAG_INDIRECT 0x00001007 /* lock marked as Indirect */
83 #define LCK_MTX_TAG_DESTROYED 0x00002007 /* lock marked as Destroyed */
84
85 /* Adaptive spin before blocking */
86 extern unsigned int MutexSpin;
87 extern void lck_mtx_lock_spin(lck_mtx_t *lck);
88
89 extern void lck_mtx_interlock_spin(lck_mtx_t *lck);
90
91 typedef struct {
92 unsigned int type;
93 vm_offset_t pc;
94 vm_offset_t thread;
95 } lck_mtx_deb_t;
96
97 #define MUTEX_TAG 0x4d4d
98
99 typedef struct {
100 unsigned int lck_mtx_stat_data;
101 } lck_mtx_stat_t;
102
103 typedef struct _lck_mtx_ext_ {
104 lck_mtx_t lck_mtx;
105 struct _lck_grp_ *lck_mtx_grp;
106 unsigned int lck_mtx_attr;
107 lck_mtx_deb_t lck_mtx_deb;
108 lck_mtx_stat_t lck_mtx_stat;
109 } lck_mtx_ext_t;
110
111 #define LCK_MTX_ATTR_DEBUG 0x1
112 #define LCK_MTX_ATTR_DEBUGb 0
113 #define LCK_MTX_ATTR_STAT 0x2
114 #define LCK_MTX_ATTR_STATb 1
115
116 #else
117 #ifdef KERNEL_PRIVATE
118 typedef struct {
119 unsigned int opaque[3];
120 } lck_mtx_t;
121 #else
122 typedef struct __lck_mtx_t__ lck_mtx_t;
123 #endif
124 #endif
125
126 #ifdef MACH_KERNEL_PRIVATE
127 typedef struct {
128 hw_lock_data_t interlock;
129 volatile unsigned int
130 read_count:16, /* No. of accepted readers */
131 want_upgrade:1, /* Read-to-write upgrade waiting */
132 want_write:1, /* Writer waiting or locked for write */
133 waiting:1, /* Someone is sleeping on lock */
134 can_sleep:1, /* Can attempts to lock go to sleep? */
135 read_priority:1;/* New read takes piority over write */
136 unsigned int lck_rw_tag;
137 } lck_rw_t;
138
139 #define LCK_RW_ATTR_DEBUG 0x1
140 #define LCK_RW_ATTR_DEBUGb 0
141 #define LCK_RW_ATTR_STAT 0x2
142 #define LCK_RW_ATTR_STATb 1
143 #define LCK_RW_ATTR_READ_PRI 0x3
144 #define LCK_RW_ATTR_READ_PRIb 2
145 #define LCK_RW_ATTR_DIS_THREAD 0x40000000
146 #define LCK_RW_ATTR_DIS_THREADb 30
147 #define LCK_RW_ATTR_DIS_MYLOCK 0x10000000
148 #define LCK_RW_ATTR_DIS_MYLOCKb 28
149
150 #define LCK_RW_TAG_DESTROYED 0x00002007 /* lock marked as Destroyed */
151
152 #else
153 #ifdef KERNEL_PRIVATE
154 typedef struct {
155 unsigned int opaque[3];
156 } lck_rw_t;
157 #else
158 typedef struct __lck_rw_t__ lck_rw_t;
159 #endif
160 #endif
161
162 #endif /* _I386_LOCKS_H_ */