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