|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 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: #ifdef KERNEL ! 65: ! 66: #include <kern/simple_lock.h> ! 67: #include <kern/simple_lock_types.h> ! 68: ! 69: #if defined(simple_lock_init) ! 70: #undef simple_lock_init ! 71: #endif ! 72: #define simple_lock_init(l) usimple_lock_init((l),0) ! 73: ! 74: #else /* KERNEL */ ! 75: ! 76: #ifndef _MACHINE_SIMPLE_LOCK_DATA_ ! 77: #define _MACHINE_SIMPLE_LOCK_DATA_ ! 78: ! 79: #include <mach/boolean.h> ! 80: ! 81: #if defined(__ppc__) ! 82: struct slock{ ! 83: volatile unsigned int lock_data[10]; ! 84: }; ! 85: #else ! 86: struct slock{ ! 87: volatile unsigned int lock_data[9]; ! 88: }; ! 89: #endif ! 90: typedef struct slock simple_lock_data_t; ! 91: typedef struct slock *simple_lock_t; ! 92: #define decl_simple_lock_data(class,name) \ ! 93: class simple_lock_data_t name; ! 94: ! 95: #endif /* _MACHINE_SIMPLE_LOCK_DATA_ */ ! 96: ! 97: #endif /* KERNEL */ ! 98: /* ! 99: * The general lock structure. Provides for multiple shared locks, ! 100: * upgrading from shared to exclusive, and sleeping until the lock ! 101: * can be gained. The simple locks are defined in <machine/param.h>. ! 102: */ ! 103: struct lock__bsd__ { ! 104: simple_lock_data_t ! 105: lk_interlock; /* lock on remaining fields */ ! 106: u_int lk_flags; /* see below */ ! 107: int lk_sharecount; /* # of accepted shared locks */ ! 108: int lk_waitcount; /* # of processes sleeping for lock */ ! 109: short lk_exclusivecount; /* # of recursive exclusive locks */ ! 110: short lk_prio; /* priority at which to sleep */ ! 111: char *lk_wmesg; /* resource sleeping (for tsleep) */ ! 112: int lk_timo; /* maximum sleep time (for tsleep) */ ! 113: pid_t lk_lockholder; /* pid of exclusive lock holder */ ! 114: void *lk_lockthread; /* thread which acquired excl lock */ ! 115: }; ! 116: /* ! 117: * Lock request types: ! 118: * LK_SHARED - get one of many possible shared locks. If a process ! 119: * holding an exclusive lock requests a shared lock, the exclusive ! 120: * lock(s) will be downgraded to shared locks. ! 121: * LK_EXCLUSIVE - stop further shared locks, when they are cleared, ! 122: * grant a pending upgrade if it exists, then grant an exclusive ! 123: * lock. Only one exclusive lock may exist at a time, except that ! 124: * a process holding an exclusive lock may get additional exclusive ! 125: * locks if it explicitly sets the LK_CANRECURSE flag in the lock ! 126: * request, or if the LK_CANRECUSE flag was set when the lock was ! 127: * initialized. ! 128: * LK_UPGRADE - the process must hold a shared lock that it wants to ! 129: * have upgraded to an exclusive lock. Other processes may get ! 130: * exclusive access to the resource between the time that the upgrade ! 131: * is requested and the time that it is granted. ! 132: * LK_EXCLUPGRADE - the process must hold a shared lock that it wants to ! 133: * have upgraded to an exclusive lock. If the request succeeds, no ! 134: * other processes will have gotten exclusive access to the resource ! 135: * between the time that the upgrade is requested and the time that ! 136: * it is granted. However, if another process has already requested ! 137: * an upgrade, the request will fail (see error returns below). ! 138: * LK_DOWNGRADE - the process must hold an exclusive lock that it wants ! 139: * to have downgraded to a shared lock. If the process holds multiple ! 140: * (recursive) exclusive locks, they will all be downgraded to shared ! 141: * locks. ! 142: * LK_RELEASE - release one instance of a lock. ! 143: * LK_DRAIN - wait for all activity on the lock to end, then mark it ! 144: * decommissioned. This feature is used before freeing a lock that ! 145: * is part of a piece of memory that is about to be freed. ! 146: * ! 147: * These are flags that are passed to the lockmgr routine. ! 148: */ ! 149: #define LK_TYPE_MASK 0x0000000f /* type of lock sought */ ! 150: #define LK_SHARED 0x00000001 /* shared lock */ ! 151: #define LK_EXCLUSIVE 0x00000002 /* exclusive lock */ ! 152: #define LK_UPGRADE 0x00000003 /* shared-to-exclusive upgrade */ ! 153: #define LK_EXCLUPGRADE 0x00000004 /* first shared-to-exclusive upgrade */ ! 154: #define LK_DOWNGRADE 0x00000005 /* exclusive-to-shared downgrade */ ! 155: #define LK_RELEASE 0x00000006 /* release any type of lock */ ! 156: #define LK_DRAIN 0x00000007 /* wait for all lock activity to end */ ! 157: /* ! 158: * External lock flags. ! 159: * ! 160: * The first three flags may be set in lock_init to set their mode permanently, ! 161: * or passed in as arguments to the lock manager. The LK_REENABLE flag may be ! 162: * set only at the release of a lock obtained by drain. ! 163: */ ! 164: #define LK_EXTFLG_MASK 0x00000070 /* mask of external flags */ ! 165: #define LK_NOWAIT 0x00000010 /* do not sleep to await lock */ ! 166: #define LK_SLEEPFAIL 0x00000020 /* sleep, then return failure */ ! 167: #define LK_CANRECURSE 0x00000040 /* allow recursive exclusive lock */ ! 168: #define LK_REENABLE 0x00000080 /* lock is be reenabled after drain */ ! 169: /* ! 170: * Internal lock flags. ! 171: * ! 172: * These flags are used internally to the lock manager. ! 173: */ ! 174: #define LK_WANT_UPGRADE 0x00000100 /* waiting for share-to-excl upgrade */ ! 175: #define LK_WANT_EXCL 0x00000200 /* exclusive lock sought */ ! 176: #define LK_HAVE_EXCL 0x00000400 /* exclusive lock obtained */ ! 177: #define LK_WAITDRAIN 0x00000800 /* process waiting for lock to drain */ ! 178: #define LK_DRAINING 0x00004000 /* lock is being drained */ ! 179: #define LK_DRAINED 0x00008000 /* lock has been decommissioned */ ! 180: /* ! 181: * Control flags ! 182: * ! 183: * Non-persistent external flags. ! 184: */ ! 185: #define LK_INTERLOCK 0x00010000 /* unlock passed simple lock after ! 186: getting lk_interlock */ ! 187: #define LK_RETRY 0x00020000 /* vn_lock: retry until locked */ ! 188: ! 189: /* ! 190: * Lock return status. ! 191: * ! 192: * Successfully obtained locks return 0. Locks will always succeed ! 193: * unless one of the following is true: ! 194: * LK_FORCEUPGRADE is requested and some other process has already ! 195: * requested a lock upgrade (returns EBUSY). ! 196: * LK_WAIT is set and a sleep would be required (returns EBUSY). ! 197: * LK_SLEEPFAIL is set and a sleep was done (returns ENOLCK). ! 198: * PCATCH is set in lock priority and a signal arrives (returns ! 199: * either EINTR or ERESTART if system calls is to be restarted). ! 200: * Non-null lock timeout and timeout expires (returns EWOULDBLOCK). ! 201: * A failed lock attempt always returns a non-zero error value. No lock ! 202: * is held after an error return (in particular, a failed LK_UPGRADE ! 203: * or LK_FORCEUPGRADE will have released its shared access lock). ! 204: */ ! 205: ! 206: /* ! 207: * Indicator that no process holds exclusive lock ! 208: */ ! 209: #define LK_KERNPROC ((pid_t) -2) ! 210: #define LK_NOPROC ((pid_t) -1) ! 211: ! 212: struct proc; ! 213: ! 214: void lockinit __P((struct lock__bsd__ *, int prio, char *wmesg, int timo, ! 215: int flags)); ! 216: int lockmgr __P((struct lock__bsd__ *, u_int flags, ! 217: simple_lock_t, struct proc *p)); ! 218: int lockstatus __P((struct lock__bsd__ *)); ! 219: ! 220: #endif /* _SYS_LOCK_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.