]> git.saurik.com Git - apple/xnu.git/blame_incremental - bsd/sys/lock.h
xnu-792.10.96.tar.gz
[apple/xnu.git] / bsd / sys / lock.h
... / ...
CommitLineData
1/*
2 * Copyright (c) 2000-2005 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/* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
23/*
24 * Copyright (c) 1995
25 * The Regents of the University of California. All rights reserved.
26 *
27 * This code contains ideas from software contributed to Berkeley by
28 * Avadis Tevanian, Jr., Michael Wayne Young, and the Mach Operating
29 * System project at Carnegie-Mellon University.
30 *
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
33 * are met:
34 * 1. Redistributions of source code must retain the above copyright
35 * notice, this list of conditions and the following disclaimer.
36 * 2. Redistributions in binary form must reproduce the above copyright
37 * notice, this list of conditions and the following disclaimer in the
38 * documentation and/or other materials provided with the distribution.
39 * 3. All advertising materials mentioning features or use of this software
40 * must display the following acknowledgement:
41 * This product includes software developed by the University of
42 * California, Berkeley and its contributors.
43 * 4. Neither the name of the University nor the names of its contributors
44 * may be used to endorse or promote products derived from this software
45 * without specific prior written permission.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
48 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57 * SUCH DAMAGE.
58 *
59 * @(#)lock.h 8.12 (Berkeley) 5/19/95
60 */
61
62#ifndef _SYS_LOCK_H_
63#define _SYS_LOCK_H_
64
65#include <sys/appleapiopts.h>
66#include <sys/types.h>
67#include <sys/cdefs.h>
68
69#ifdef KERNEL
70
71#include <kern/locks.h>
72
73#endif /* KERNEL */
74
75#ifdef BSD_KERNEL_PRIVATE
76/*
77 * The general lock structure. Provides for multiple shared locks,
78 * upgrading from shared to exclusive, and sleeping until the lock
79 * can be gained. The simple locks are defined in <machine/param.h>.
80 */
81struct lock__bsd__ {
82 void * lk_interlock[10]; /* lock on remaining fields */
83 u_int lk_flags; /* see below */
84 int lk_sharecount; /* # of accepted shared locks */
85 int lk_waitcount; /* # of processes sleeping for lock */
86 short lk_exclusivecount; /* # of recursive exclusive locks */
87 short lk_prio; /* priority at which to sleep */
88 const char *lk_wmesg; /* resource sleeping (for tsleep) */
89 int lk_timo; /* maximum sleep time (for tsleep) */
90 pid_t lk_lockholder; /* pid of exclusive lock holder */
91 void *lk_lockthread; /* thread which acquired excl lock */
92};
93
94// LP64todo - should this move?
95
96/* LP64 version of lock__bsd__. all pointers
97 * grow when we're dealing with a 64-bit process.
98 * WARNING - keep in sync with lock__bsd__
99 */
100
101struct user_lock__bsd__ {
102 user_addr_t lk_interlock[10]; /* lock on remaining fields */
103 u_int lk_flags; /* see below */
104 int lk_sharecount; /* # of accepted shared locks */
105 int lk_waitcount; /* # of processes sleeping for lock */
106 short lk_exclusivecount; /* # of recursive exclusive locks */
107 short lk_prio; /* priority at which to sleep */
108 user_addr_t lk_wmesg; /* resource sleeping (for tsleep) */
109 int lk_timo; /* maximum sleep time (for tsleep) */
110 pid_t lk_lockholder; /* pid of exclusive lock holder */
111 user_addr_t lk_lockthread; /* thread which acquired excl lock */
112};
113
114/*
115 * Lock request types:
116 * LK_SHARED - get one of many possible shared locks. If a process
117 * holding an exclusive lock requests a shared lock, the exclusive
118 * lock(s) will be downgraded to shared locks.
119 * LK_EXCLUSIVE - stop further shared locks, when they are cleared,
120 * grant a pending upgrade if it exists, then grant an exclusive
121 * lock. Only one exclusive lock may exist at a time, except that
122 * a process holding an exclusive lock may get additional exclusive
123 * locks if it explicitly sets the LK_CANRECURSE flag in the lock
124 * request, or if the LK_CANRECUSE flag was set when the lock was
125 * initialized.
126 * LK_UPGRADE - the process must hold a shared lock that it wants to
127 * have upgraded to an exclusive lock. Other processes may get
128 * exclusive access to the resource between the time that the upgrade
129 * is requested and the time that it is granted.
130 * LK_EXCLUPGRADE - the process must hold a shared lock that it wants to
131 * have upgraded to an exclusive lock. If the request succeeds, no
132 * other processes will have gotten exclusive access to the resource
133 * between the time that the upgrade is requested and the time that
134 * it is granted. However, if another process has already requested
135 * an upgrade, the request will fail (see error returns below).
136 * LK_DOWNGRADE - the process must hold an exclusive lock that it wants
137 * to have downgraded to a shared lock. If the process holds multiple
138 * (recursive) exclusive locks, they will all be downgraded to shared
139 * locks.
140 * LK_RELEASE - release one instance of a lock.
141 * LK_DRAIN - wait for all activity on the lock to end, then mark it
142 * decommissioned. This feature is used before freeing a lock that
143 * is part of a piece of memory that is about to be freed.
144 *
145 * These are flags that are passed to the lockmgr routine.
146 */
147#define LK_TYPE_MASK 0x0000000f /* type of lock sought */
148#define LK_SHARED 0x00000001 /* shared lock */
149#define LK_EXCLUSIVE 0x00000002 /* exclusive lock */
150#define LK_UPGRADE 0x00000003 /* shared-to-exclusive upgrade */
151#define LK_EXCLUPGRADE 0x00000004 /* first shared-to-exclusive upgrade */
152#define LK_DOWNGRADE 0x00000005 /* exclusive-to-shared downgrade */
153#define LK_RELEASE 0x00000006 /* release any type of lock */
154#define LK_DRAIN 0x00000007 /* wait for all lock activity to end */
155/*
156 * External lock flags.
157 *
158 * The first three flags may be set in lock_init to set their mode permanently,
159 * or passed in as arguments to the lock manager. The LK_REENABLE flag may be
160 * set only at the release of a lock obtained by drain.
161 */
162#define LK_EXTFLG_MASK 0x00000070 /* mask of external flags */
163#define LK_NOWAIT 0x00000010 /* do not sleep to await lock */
164#define LK_SLEEPFAIL 0x00000020 /* sleep, then return failure */
165#define LK_CANRECURSE 0x00000040 /* allow recursive exclusive lock */
166#define LK_REENABLE 0x00000080 /* lock is be reenabled after drain */
167/*
168 * Internal lock flags.
169 *
170 * These flags are used internally to the lock manager.
171 */
172#define LK_WANT_UPGRADE 0x00000100 /* waiting for share-to-excl upgrade */
173#define LK_WANT_EXCL 0x00000200 /* exclusive lock sought */
174#define LK_HAVE_EXCL 0x00000400 /* exclusive lock obtained */
175#define LK_WAITDRAIN 0x00000800 /* process waiting for lock to drain */
176#define LK_DRAINING 0x00004000 /* lock is being drained */
177#define LK_DRAINED 0x00008000 /* lock has been decommissioned */
178/*
179 * Control flags
180 *
181 * Non-persistent external flags.
182 */
183#define LK_INTERLOCK 0x00010000 /* unlock passed simple lock after
184 getting lk_interlock */
185#define LK_RETRY 0x00020000 /* vn_lock: retry until locked */
186
187/*
188 * Lock return status.
189 *
190 * Successfully obtained locks return 0. Locks will always succeed
191 * unless one of the following is true:
192 * LK_FORCEUPGRADE is requested and some other process has already
193 * requested a lock upgrade (returns EBUSY).
194 * LK_WAIT is set and a sleep would be required (returns EBUSY).
195 * LK_SLEEPFAIL is set and a sleep was done (returns ENOLCK).
196 * PCATCH is set in lock priority and a signal arrives (returns
197 * either EINTR or ERESTART if system calls is to be restarted).
198 * Non-null lock timeout and timeout expires (returns EWOULDBLOCK).
199 * A failed lock attempt always returns a non-zero error value. No lock
200 * is held after an error return (in particular, a failed LK_UPGRADE
201 * or LK_FORCEUPGRADE will have released its shared access lock).
202 */
203
204/*
205 * Indicator that no process holds exclusive lock
206 */
207#define LK_KERNPROC ((pid_t) -2)
208#define LK_NOPROC ((pid_t) -1)
209
210struct proc;
211
212void lockinit(struct lock__bsd__ *, int prio, const char *wmesg, int timo,
213 int flags);
214int lockmgr(struct lock__bsd__ *, u_int flags,
215 void *, struct proc *p);
216int lockstatus(struct lock__bsd__ *);
217
218#endif /* BSD_KERNEL_PRIVATE */
219
220#endif /* _SYS_LOCK_H_ */