|
|
1.1 ! root 1: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ! 2: /* ! 3: * The contents of this file are subject to the Mozilla Public ! 4: * License Version 1.1 (the "License"); you may not use this file ! 5: * except in compliance with the License. You may obtain a copy of ! 6: * the License at http://www.mozilla.org/MPL/ ! 7: * ! 8: * Software distributed under the License is distributed on an "AS ! 9: * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ! 10: * implied. See the License for the specific language governing ! 11: * rights and limitations under the License. ! 12: * ! 13: * The Original Code is the Netscape Portable Runtime (NSPR). ! 14: * ! 15: * The Initial Developer of the Original Code is Netscape ! 16: * Communications Corporation. Portions created by Netscape are ! 17: * Copyright (C) 1998-2000 Netscape Communications Corporation. All ! 18: * Rights Reserved. ! 19: * ! 20: * Contributor(s): ! 21: * ! 22: * Alternatively, the contents of this file may be used under the ! 23: * terms of the GNU General Public License Version 2 or later (the ! 24: * "GPL"), in which case the provisions of the GPL are applicable ! 25: * instead of those above. If you wish to allow use of your ! 26: * version of this file only under the terms of the GPL and not to ! 27: * allow others to use your version of this file under the MPL, ! 28: * indicate your decision by deleting the provisions above and ! 29: * replace them with the notice and other provisions requiored by ! 30: * the GPL. If you do not delete the provisions above, a recipient ! 31: * may use your version of this file under either the MPL or the ! 32: * GPL. ! 33: */ ! 34: ! 35: #ifndef prolock_h___ ! 36: #define prolock_h___ ! 37: ! 38: #include "prtypes.h" ! 39: ! 40: PR_BEGIN_EXTERN_C ! 41: ! 42: /* ! 43: ** A locking mechanism, built on the existing PRLock definiion, ! 44: ** is provided that will permit applications to define a Lock ! 45: ** Hierarchy (or Lock Ordering) schema. An application designed ! 46: ** using the Ordered Lock functions will terminate with a ! 47: ** diagnostic message when a lock inversion condition is ! 48: ** detected. ! 49: ** ! 50: ** The lock ordering detection is complile-time enabled only. in ! 51: ** optimized builds of NSPR, the Ordered Lock functions map ! 52: ** directly to PRLock functions, providing no lock order ! 53: ** detection. ! 54: ** ! 55: ** The Ordered Lock Facility is compiled in when DEBUG is defined at ! 56: ** compile time. Ordered Lock can be forced on in optimized builds by ! 57: ** defining FORCE_NSPR_ORDERED_LOCK at compile time. Both the ! 58: ** application using Ordered Lock and NSPR must be compiled with the ! 59: ** facility enabled to achieve the desired results. ! 60: ** ! 61: ** Application designers should use the macro interfaces to the Ordered ! 62: ** Lock facility to ensure that it is compiled out in optimized builds. ! 63: ** ! 64: ** Application designers are responsible for defining their own ! 65: ** lock hierarchy. ! 66: ** ! 67: ** Ordered Lock is thread-safe and SMP safe. ! 68: ** ! 69: ** See Also: prlock.h ! 70: ** ! 71: ** /lth. 10-Jun-1998. ! 72: ** ! 73: */ ! 74: ! 75: /* ! 76: ** Opaque type for ordered lock. ! 77: ** ... Don't even think of looking in here. ! 78: ** ! 79: */ ! 80: ! 81: #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) ! 82: typedef void * PROrderedLock; ! 83: #else ! 84: /* ! 85: ** Map PROrderedLock and methods onto PRLock when ordered locking ! 86: ** is not compiled in. ! 87: ** ! 88: */ ! 89: #include "prlock.h" ! 90: ! 91: typedef PRLock PROrderedLock; ! 92: #endif ! 93: ! 94: /* ----------------------------------------------------------------------- ! 95: ** FUNCTION: PR_CreateOrderedLock() -- Create an Ordered Lock ! 96: ** ! 97: ** DESCRIPTION: PR_CreateOrderedLock() creates an ordered lock. ! 98: ** ! 99: ** INPUTS: ! 100: ** order: user defined order of this lock. ! 101: ** name: name of the lock. For debugging purposes. ! 102: ** ! 103: ** OUTPUTS: returned ! 104: ** ! 105: ** RETURNS: PR_OrderedLock pointer ! 106: ** ! 107: ** RESTRICTIONS: ! 108: ** ! 109: */ ! 110: #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) ! 111: #define PR_CREATE_ORDERED_LOCK(order,name)\ ! 112: PR_CreateOrderedLock((order),(name)) ! 113: #else ! 114: #define PR_CREATE_ORDERED_LOCK(order) PR_NewLock() ! 115: #endif ! 116: ! 117: NSPR_API(PROrderedLock *) ! 118: PR_CreateOrderedLock( ! 119: PRInt32 order, ! 120: const char *name ! 121: ); ! 122: ! 123: /* ----------------------------------------------------------------------- ! 124: ** FUNCTION: PR_DestroyOrderedLock() -- Destroy an Ordered Lock ! 125: ** ! 126: ** DESCRIPTION: PR_DestroyOrderedLock() destroys the ordered lock ! 127: ** referenced by lock. ! 128: ** ! 129: ** INPUTS: lock: pointer to a PROrderedLock ! 130: ** ! 131: ** OUTPUTS: the lock is destroyed ! 132: ** ! 133: ** RETURNS: void ! 134: ** ! 135: ** RESTRICTIONS: ! 136: ** ! 137: */ ! 138: #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) ! 139: #define PR_DESTROY_ORDERED_LOCK(lock) PR_DestroyOrderedLock((lock)) ! 140: #else ! 141: #define PR_DESTROY_ORDERED_LOCK(lock) PR_DestroyLock((lock)) ! 142: #endif ! 143: ! 144: NSPR_API(void) ! 145: PR_DestroyOrderedLock( ! 146: PROrderedLock *lock ! 147: ); ! 148: ! 149: /* ----------------------------------------------------------------------- ! 150: ** FUNCTION: PR_LockOrderedLock() -- Lock an ordered lock ! 151: ** ! 152: ** DESCRIPTION: PR_LockOrderedLock() locks the ordered lock ! 153: ** referenced by lock. If the order of lock is less than or equal ! 154: ** to the order of the highest lock held by the locking thread, ! 155: ** the function asserts. ! 156: ** ! 157: ** INPUTS: lock: a pointer to a PROrderedLock ! 158: ** ! 159: ** OUTPUTS: The lock is held or the fucntion asserts. ! 160: ** ! 161: ** RETURNS: void ! 162: ** ! 163: ** RESTRICTIONS: ! 164: ** ! 165: */ ! 166: #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) ! 167: #define PR_LOCK_ORDERED_LOCK(lock) PR_LockOrderedLock((lock)) ! 168: #else ! 169: #define PR_LOCK_ORDERED_LOCK(lock) PR_Lock((lock)) ! 170: #endif ! 171: ! 172: NSPR_API(void) ! 173: PR_LockOrderedLock( ! 174: PROrderedLock *lock ! 175: ); ! 176: ! 177: /* ----------------------------------------------------------------------- ! 178: ** FUNCTION: PR_UnlockOrderedLock() -- unlock and Ordered Lock ! 179: ** ! 180: ** DESCRIPTION: PR_UnlockOrderedLock() unlocks the lock referenced ! 181: ** by lock. ! 182: ** ! 183: ** INPUTS: lock: a pointer to a PROrderedLock ! 184: ** ! 185: ** OUTPUTS: the lock is unlocked ! 186: ** ! 187: ** RETURNS: ! 188: ** PR_SUCCESS ! 189: ** PR_FAILURE ! 190: ** ! 191: ** RESTRICTIONS: ! 192: ** ! 193: */ ! 194: #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) ! 195: #define PR_UNLOCK_ORDERED_LOCK(lock) PR_UnlockOrderedLock((lock)) ! 196: #else ! 197: #define PR_UNLOCK_ORDERED_LOCK(lock) PR_Unlock((lock)) ! 198: #endif ! 199: ! 200: NSPR_API(PRStatus) ! 201: PR_UnlockOrderedLock( ! 202: PROrderedLock *lock ! 203: ); ! 204: ! 205: PR_END_EXTERN_C ! 206: ! 207: #endif /* prolock_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.