michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* michael@0: ** File: prlock.h michael@0: ** Description: API to basic locking functions of NSPR. michael@0: ** michael@0: ** michael@0: ** NSPR provides basic locking mechanisms for thread synchronization. Locks michael@0: ** are lightweight resource contention controls that prevent multiple threads michael@0: ** from accessing something (code/data) simultaneously. michael@0: **/ michael@0: michael@0: #ifndef prlock_h___ michael@0: #define prlock_h___ michael@0: michael@0: #include "prtypes.h" michael@0: michael@0: PR_BEGIN_EXTERN_C michael@0: michael@0: /**********************************************************************/ michael@0: /************************* TYPES AND CONSTANTS ************************/ michael@0: /**********************************************************************/ michael@0: michael@0: /* michael@0: * PRLock -- michael@0: * michael@0: * NSPR represents the lock as an opaque entity to the client of the michael@0: * API. All routines operate on a pointer to this opaque entity. michael@0: */ michael@0: michael@0: typedef struct PRLock PRLock; michael@0: michael@0: /**********************************************************************/ michael@0: /****************************** FUNCTIONS *****************************/ michael@0: /**********************************************************************/ michael@0: michael@0: /*********************************************************************** michael@0: ** FUNCTION: PR_NewLock michael@0: ** DESCRIPTION: michael@0: ** Returns a pointer to a newly created opaque lock object. michael@0: ** INPUTS: void michael@0: ** OUTPUTS: void michael@0: ** RETURN: PRLock* michael@0: ** If the lock can not be created because of resource constraints, NULL michael@0: ** is returned. michael@0: ** michael@0: ***********************************************************************/ michael@0: NSPR_API(PRLock*) PR_NewLock(void); michael@0: michael@0: /*********************************************************************** michael@0: ** FUNCTION: PR_DestroyLock michael@0: ** DESCRIPTION: michael@0: ** Destroys a given opaque lock object. michael@0: ** INPUTS: PRLock *lock michael@0: ** Lock to be freed. michael@0: ** OUTPUTS: void michael@0: ** RETURN: None michael@0: ***********************************************************************/ michael@0: NSPR_API(void) PR_DestroyLock(PRLock *lock); michael@0: michael@0: /*********************************************************************** michael@0: ** FUNCTION: PR_Lock michael@0: ** DESCRIPTION: michael@0: ** Lock a lock. michael@0: ** INPUTS: PRLock *lock michael@0: ** Lock to locked. michael@0: ** OUTPUTS: void michael@0: ** RETURN: None michael@0: ***********************************************************************/ michael@0: NSPR_API(void) PR_Lock(PRLock *lock); michael@0: michael@0: /*********************************************************************** michael@0: ** FUNCTION: PR_Unlock michael@0: ** DESCRIPTION: michael@0: ** Unlock a lock. Unlocking an unlocked lock has undefined results. michael@0: ** INPUTS: PRLock *lock michael@0: ** Lock to unlocked. michael@0: ** OUTPUTS: void michael@0: ** RETURN: PR_STATUS michael@0: ** Returns PR_FAILURE if the caller does not own the lock. michael@0: ***********************************************************************/ michael@0: NSPR_API(PRStatus) PR_Unlock(PRLock *lock); michael@0: michael@0: /*********************************************************************** michael@0: ** MACRO: PR_ASSERT_CURRENT_THREAD_OWNS_LOCK michael@0: ** DESCRIPTION: michael@0: ** If the current thread owns |lock|, this assertion is guaranteed to michael@0: ** succeed. Otherwise, the behavior of this function is undefined. michael@0: ** INPUTS: PRLock *lock michael@0: ** Lock to assert ownership of. michael@0: ** OUTPUTS: void michael@0: ** RETURN: None michael@0: ***********************************************************************/ michael@0: #if defined(DEBUG) || defined(FORCE_PR_ASSERT) michael@0: #define PR_ASSERT_CURRENT_THREAD_OWNS_LOCK(/* PrLock* */ lock) \ michael@0: PR_AssertCurrentThreadOwnsLock(lock) michael@0: #else michael@0: #define PR_ASSERT_CURRENT_THREAD_OWNS_LOCK(/* PrLock* */ lock) michael@0: #endif michael@0: michael@0: /* Don't call this function directly. */ michael@0: NSPR_API(void) PR_AssertCurrentThreadOwnsLock(PRLock *lock); michael@0: michael@0: PR_END_EXTERN_C michael@0: michael@0: #endif /* prlock_h___ */