|  | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ | 
|  | /* This Source Code Form is subject to the terms of the Mozilla Public | 
|  | * License, v. 2.0. If a copy of the MPL was not distributed with this | 
|  | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 
|  |  | 
|  | #ifndef prolock_h___ | 
|  | #define prolock_h___ | 
|  |  | 
|  | #include "prtypes.h" | 
|  |  | 
|  | PR_BEGIN_EXTERN_C | 
|  |  | 
|  | /* | 
|  | ** A locking mechanism, built on the existing PRLock definition, | 
|  | ** is provided that will permit applications to define a Lock | 
|  | ** Hierarchy (or Lock Ordering) schema. An application designed | 
|  | ** using the Ordered Lock functions will terminate with a | 
|  | ** diagnostic message when a lock inversion condition is | 
|  | ** detected. | 
|  | ** | 
|  | ** The lock ordering detection is compile-time enabled only. In | 
|  | ** optimized builds of NSPR, the Ordered Lock functions map | 
|  | ** directly to PRLock functions, providing no lock order | 
|  | ** detection. | 
|  | ** | 
|  | ** The Ordered Lock Facility is compiled in when DEBUG is defined at | 
|  | ** compile-time. Ordered Lock can be forced on in optimized builds by | 
|  | ** defining FORCE_NSPR_ORDERED_LOCK at compile-time. Both the | 
|  | ** application using Ordered Lock and NSPR must be compiled with the | 
|  | ** facility enabled to achieve the desired results. | 
|  | ** | 
|  | ** Application designers should use the macro interfaces to the Ordered | 
|  | ** Lock facility to ensure that it is compiled out in optimized builds. | 
|  | ** | 
|  | ** Application designers are responsible for defining their own | 
|  | ** lock hierarchy. | 
|  | ** | 
|  | ** Ordered Lock is thread-safe and SMP safe. | 
|  | ** | 
|  | ** See Also: prlock.h | 
|  | ** | 
|  | ** /lth. 10-Jun-1998. | 
|  | ** | 
|  | */ | 
|  |  | 
|  | /* | 
|  | ** Opaque type for ordered lock. | 
|  | ** ... Don't even think of looking in here. | 
|  | ** | 
|  | */ | 
|  |  | 
|  | #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) | 
|  | typedef void * PROrderedLock; | 
|  | #else | 
|  | /* | 
|  | ** Map PROrderedLock and methods onto PRLock when ordered locking | 
|  | ** is not compiled in. | 
|  | ** | 
|  | */ | 
|  | #include "prlock.h" | 
|  |  | 
|  | typedef PRLock PROrderedLock; | 
|  | #endif | 
|  |  | 
|  | /* ----------------------------------------------------------------------- | 
|  | ** FUNCTION: PR_CreateOrderedLock() -- Create an Ordered Lock | 
|  | ** | 
|  | ** DESCRIPTION: PR_CreateOrderedLock() creates an ordered lock. | 
|  | ** | 
|  | ** INPUTS: | 
|  | **  order: user defined order of this lock. | 
|  | **  name: name of the lock. For debugging purposes. | 
|  | ** | 
|  | ** OUTPUTS: returned | 
|  | ** | 
|  | ** RETURNS: PR_OrderedLock pointer | 
|  | ** | 
|  | ** RESTRICTIONS: | 
|  | ** | 
|  | */ | 
|  | #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) | 
|  | #define PR_CREATE_ORDERED_LOCK(order,name)\ | 
|  | PR_CreateOrderedLock((order),(name)) | 
|  | #else | 
|  | #define PR_CREATE_ORDERED_LOCK(order) PR_NewLock() | 
|  | #endif | 
|  |  | 
|  | NSPR_API(PROrderedLock *) | 
|  | PR_CreateOrderedLock( | 
|  | PRInt32 order, | 
|  | const char *name | 
|  | ); | 
|  |  | 
|  | /* ----------------------------------------------------------------------- | 
|  | ** FUNCTION: PR_DestroyOrderedLock() -- Destroy an Ordered Lock | 
|  | ** | 
|  | ** DESCRIPTION: PR_DestroyOrderedLock() destroys the ordered lock | 
|  | ** referenced by lock. | 
|  | ** | 
|  | ** INPUTS: lock: pointer to a PROrderedLock | 
|  | ** | 
|  | ** OUTPUTS: the lock is destroyed | 
|  | ** | 
|  | ** RETURNS: void | 
|  | ** | 
|  | ** RESTRICTIONS: | 
|  | ** | 
|  | */ | 
|  | #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) | 
|  | #define PR_DESTROY_ORDERED_LOCK(lock) PR_DestroyOrderedLock((lock)) | 
|  | #else | 
|  | #define PR_DESTROY_ORDERED_LOCK(lock) PR_DestroyLock((lock)) | 
|  | #endif | 
|  |  | 
|  | NSPR_API(void) | 
|  | PR_DestroyOrderedLock( | 
|  | PROrderedLock *lock | 
|  | ); | 
|  |  | 
|  | /* ----------------------------------------------------------------------- | 
|  | ** FUNCTION: PR_LockOrderedLock() -- Lock an ordered lock | 
|  | ** | 
|  | ** DESCRIPTION: PR_LockOrderedLock() locks the ordered lock | 
|  | ** referenced by lock. If the order of lock is less than or equal | 
|  | ** to the order of the highest lock held by the locking thread, | 
|  | ** the function asserts. | 
|  | ** | 
|  | ** INPUTS: lock: a pointer to a PROrderedLock | 
|  | ** | 
|  | ** OUTPUTS: The lock is held or the function asserts. | 
|  | ** | 
|  | ** RETURNS: void | 
|  | ** | 
|  | ** RESTRICTIONS: | 
|  | ** | 
|  | */ | 
|  | #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) | 
|  | #define PR_LOCK_ORDERED_LOCK(lock) PR_LockOrderedLock((lock)) | 
|  | #else | 
|  | #define PR_LOCK_ORDERED_LOCK(lock) PR_Lock((lock)) | 
|  | #endif | 
|  |  | 
|  | NSPR_API(void) | 
|  | PR_LockOrderedLock( | 
|  | PROrderedLock *lock | 
|  | ); | 
|  |  | 
|  | /* ----------------------------------------------------------------------- | 
|  | ** FUNCTION: PR_UnlockOrderedLock() -- unlock and Ordered Lock | 
|  | ** | 
|  | ** DESCRIPTION: PR_UnlockOrderedLock() unlocks the lock referenced | 
|  | ** by lock. | 
|  | ** | 
|  | ** INPUTS: lock: a pointer to a PROrderedLock | 
|  | ** | 
|  | ** OUTPUTS: the lock is unlocked | 
|  | ** | 
|  | ** RETURNS: | 
|  | **  PR_SUCCESS | 
|  | **  PR_FAILURE | 
|  | ** | 
|  | ** RESTRICTIONS: | 
|  | ** | 
|  | */ | 
|  | #if defined(DEBUG) || defined(FORCE_NSPR_ORDERED_LOCKS) | 
|  | #define PR_UNLOCK_ORDERED_LOCK(lock) PR_UnlockOrderedLock((lock)) | 
|  | #else | 
|  | #define PR_UNLOCK_ORDERED_LOCK(lock) PR_Unlock((lock)) | 
|  | #endif | 
|  |  | 
|  | NSPR_API(PRStatus) | 
|  | PR_UnlockOrderedLock( | 
|  | PROrderedLock *lock | 
|  | ); | 
|  |  | 
|  | PR_END_EXTERN_C | 
|  |  | 
|  | #endif /* prolock_h___ */ |