|
|
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: /* ! 23: * @OSF_COPYRIGHT@ ! 24: * ! 25: */ ! 26: /* ! 27: * HISTORY ! 28: * ! 29: * Revision 1.1.1.1 1998/09/22 21:05:30 wsanchez ! 30: * Import of Mac OS X kernel (~semeria) ! 31: * ! 32: * Revision 1.1.1.1 1998/03/07 02:25:45 wsanchez ! 33: * Import of OSF Mach kernel (~mburg) ! 34: * ! 35: * Revision 1.1.4.1 1995/06/13 18:20:29 sjs ! 36: * Merged from flipc_shared. ! 37: * [95/06/07 sjs] ! 38: * ! 39: * Revision 1.1.2.3 1995/03/09 19:42:30 rwd ! 40: * Move yield function out of macro and prototype. ! 41: * [1995/03/09 19:36:25 rwd] ! 42: * ! 43: * Revision 1.1.2.2 1995/02/21 17:23:11 randys ! 44: * Re-indented code to four space indentation ! 45: * [1995/02/21 16:25:39 randys] ! 46: * ! 47: * Revision 1.1.2.1 1994/12/20 19:02:06 randys ! 48: * Moved definition of flipc_simple_lock to flipc_cb.h ! 49: * [1994/12/20 17:34:44 randys] ! 50: * ! 51: * Separated the lock macros out into machine dependent and independent files; ! 52: * this is the machine independent file. ! 53: * [1994/12/20 16:43:38 randys] ! 54: * ! 55: * $EndLog$ ! 56: */ ! 57: ! 58: /* ! 59: * mach/flipc_locks.h ! 60: * ! 61: * The machine independent part of the flipc_simple_locks definitions. ! 62: * Most of the locks definitions is in flipc_dep.h, but what isn't ! 63: * dependent on the platform being used is here. ! 64: */ ! 65: ! 66: /* ! 67: * Note that the locks defined in this file and in flipc_dep.h are only ! 68: * for use by user level code. The reason why this file is visible to ! 69: * the kernel is that the kernel section of flipc needs to initialize ! 70: * these locks. ! 71: */ ! 72: ! 73: #ifndef _MACH_FLIPC_LOCKS_H_ ! 74: #define _MACH_FLIPC_LOCKS_H_ ! 75: ! 76: /* Get the simple lock type. */ ! 77: #include <mach/flipc_cb.h> ! 78: ! 79: /* ! 80: * Lock function prototypes. This needs to be before any lock definitions ! 81: * that happen to be macros. ! 82: */ ! 83: ! 84: /* Initializes lock. Always a macro (so that kernel code can use it without ! 85: library assistance). */ ! 86: void flipc_simple_lock_init(flipc_simple_lock *lock); ! 87: ! 88: /* Returns 1 if lock gained, 0 otherwise. */ ! 89: int flipc_simple_lock_try(flipc_simple_lock *lock); ! 90: ! 91: /* Returns 1 if lock is locked, 0 otherwise. */ ! 92: int flipc_simple_lock_locked(flipc_simple_lock *lock); ! 93: ! 94: /* Releases the lock. */ ! 95: void flipc_simple_lock_release(flipc_simple_lock *lock); ! 96: ! 97: /* Take the lock. */ ! 98: void flipc_simple_lock_acquire(flipc_simple_lock *lock); ! 99: ! 100: /* Take two locks. Does not hold one while spinning on the ! 101: other. */ ! 102: void flipc_simple_lock_acquire_2(flipc_simple_lock *lock1, ! 103: flipc_simple_lock *lock2); ! 104: ! 105: /* Get the machine dependent stuff. The things that need to be ! 106: * defined in a machine dependent fashion are: ! 107: * ! 108: * flipc_simple_lock_init (must be a macro) ! 109: * flipc_simple_lock_try ! 110: * flipc_simple_lock_locked ! 111: * flipc_simple_lock_release ! 112: * ! 113: * These last three don't necessarily have to be macros, but if they ! 114: * aren't definitions must be included in the machine dependent ! 115: * part of the user level library code. ! 116: */ ! 117: #include <mach/machine/flipc_dep.h> ! 118: ! 119: /* ! 120: * Set at flipc initialization time to thread_yield argument to ! 121: * FLIPC_domain_init ! 122: */ ! 123: ! 124: extern void (*flipc_simple_lock_yield_fn)(void); ! 125: ! 126: /* ! 127: * Machine independent definitions; defined in terms of above routines. ! 128: */ ! 129: ! 130: /* Take the lock. Assumes an external define saying how long to ! 131: spin, and an external function to call when we've spun too long. */ ! 132: #define flipc_simple_lock_acquire(lock) \ ! 133: do { \ ! 134: int __spin_count = 0; \ ! 135: \ ! 136: while (flipc_simple_lock_locked(lock) \ ! 137: || !flipc_simple_lock_try(lock)) \ ! 138: if (++__spin_count > LOCK_SPIN_LIMIT) { \ ! 139: (*flipc_simple_lock_yield_fn)(); \ ! 140: __spin_count = 0; \ ! 141: } \ ! 142: } while (0) ! 143: ! 144: /* Take two locks. Hold neither while spinning on the other. */ ! 145: #define flipc_simple_lock_acquire_2(lock1, lock2) \ ! 146: do { \ ! 147: int __spin_count = 0; \ ! 148: \ ! 149: while (1) { \ ! 150: while (flipc_simple_lock_locked(lock1) \ ! 151: || !flipc_simple_lock_try(lock1)) \ ! 152: if (++__spin_count > LOCK_SPIN_LIMIT) { \ ! 153: (*flipc_simple_lock_yield_fn)(); \ ! 154: __spin_count = 0; \ ! 155: } \ ! 156: \ ! 157: if (flipc_simple_lock_try(lock2)) \ ! 158: break; \ ! 159: flipc_simple_lock_release(lock1); \ ! 160: \ ! 161: while (flipc_simple_lock_locked(lock2) \ ! 162: || !flipc_simple_lock_try(lock2)) \ ! 163: if (++__spin_count > LOCK_SPIN_LIMIT) { \ ! 164: (*flipc_simple_lock_yield_fn)(); \ ! 165: __spin_count = 0; \ ! 166: } \ ! 167: \ ! 168: if (flipc_simple_lock_try(lock1)) \ ! 169: break; \ ! 170: flipc_simple_lock_release(lock2); \ ! 171: } \ ! 172: } while (0) ! 173: ! 174: #endif /* _MACH_FLIPC_LOCKS_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.