Index: mozilla/security/nss/lib/base/tracker.c |
=================================================================== |
--- mozilla/security/nss/lib/base/tracker.c (revision 191424) |
+++ mozilla/security/nss/lib/base/tracker.c (working copy) |
@@ -1,415 +0,0 @@ |
-/* 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/. */ |
- |
-#ifdef DEBUG |
-static const char CVS_ID[] = "@(#) $RCSfile: tracker.c,v $ $Revision: 1.8 $ $Date: 2012/04/25 14:49:26 $"; |
-#endif /* DEBUG */ |
- |
-/* |
- * tracker.c |
- * |
- * This file contains the code used by the pointer-tracking calls used |
- * in the debug builds to catch bad pointers. The entire contents are |
- * only available in debug builds (both internal and external builds). |
- */ |
- |
-#ifndef BASE_H |
-#include "base.h" |
-#endif /* BASE_H */ |
- |
-#ifdef DEBUG |
-/* |
- * identity_hash |
- * |
- * This static callback is a PLHashFunction as defined in plhash.h |
- * It merely returns the value of the object pointer as its hash. |
- * There are no possible errors. |
- */ |
- |
-static PLHashNumber PR_CALLBACK |
-identity_hash |
-( |
- const void *key |
-) |
-{ |
- return (PLHashNumber)key; |
-} |
- |
-/* |
- * trackerOnceFunc |
- * |
- * This function is called once, using the nssCallOnce function above. |
- * It creates a new pointer tracker object; initialising its hash |
- * table and protective lock. |
- */ |
- |
-static PRStatus |
-trackerOnceFunc |
-( |
- void *arg |
-) |
-{ |
- nssPointerTracker *tracker = (nssPointerTracker *)arg; |
- |
- tracker->lock = PZ_NewLock(nssILockOther); |
- if( (PZLock *)NULL == tracker->lock ) { |
- return PR_FAILURE; |
- } |
- |
- tracker->table = PL_NewHashTable(0, |
- identity_hash, |
- PL_CompareValues, |
- PL_CompareValues, |
- (PLHashAllocOps *)NULL, |
- (void *)NULL); |
- if( (PLHashTable *)NULL == tracker->table ) { |
- PZ_DestroyLock(tracker->lock); |
- tracker->lock = (PZLock *)NULL; |
- return PR_FAILURE; |
- } |
- |
- return PR_SUCCESS; |
-} |
- |
-/* |
- * nssPointerTracker_initialize |
- * |
- * This method is only present in debug builds. |
- * |
- * This routine initializes an nssPointerTracker object. Note that |
- * the object must have been declared *static* to guarantee that it |
- * is in a zeroed state initially. This routine is idempotent, and |
- * may even be safely called by multiple threads simultaneously with |
- * the same argument. This routine returns a PRStatus value; if |
- * successful, it will return PR_SUCCESS. On failure it will set an |
- * error on the error stack and return PR_FAILURE. |
- * |
- * The error may be one of the following values: |
- * NSS_ERROR_NO_MEMORY |
- * |
- * Return value: |
- * PR_SUCCESS |
- * PR_FAILURE |
- */ |
- |
-NSS_IMPLEMENT PRStatus |
-nssPointerTracker_initialize |
-( |
- nssPointerTracker *tracker |
-) |
-{ |
- PRStatus rv = PR_CallOnceWithArg(&tracker->once, trackerOnceFunc, tracker); |
- if( PR_SUCCESS != rv ) { |
- nss_SetError(NSS_ERROR_NO_MEMORY); |
- } |
- |
- return rv; |
-} |
- |
-#ifdef DONT_DESTROY_EMPTY_TABLES |
-/* See same #ifdef below */ |
-/* |
- * count_entries |
- * |
- * This static routine is a PLHashEnumerator, as defined in plhash.h. |
- * It merely causes the enumeration function to count the number of |
- * entries. |
- */ |
- |
-static PRIntn PR_CALLBACK |
-count_entries |
-( |
- PLHashEntry *he, |
- PRIntn index, |
- void *arg |
-) |
-{ |
- return HT_ENUMERATE_NEXT; |
-} |
-#endif /* DONT_DESTROY_EMPTY_TABLES */ |
- |
-/* |
- * zero_once |
- * |
- * This is a guaranteed zeroed once block. It's used to help clear |
- * the tracker. |
- */ |
- |
-static const PRCallOnceType zero_once; |
- |
-/* |
- * nssPointerTracker_finalize |
- * |
- * This method is only present in debug builds. |
- * |
- * This routine returns the nssPointerTracker object to the pre- |
- * initialized state, releasing all resources used by the object. |
- * It will *NOT* destroy the objects being tracked by the pointer |
- * (should any remain), and therefore cannot be used to "sweep up" |
- * remaining objects. This routine returns a PRStatus value; if |
- * successful, it will return PR_SUCCES. On failure it will set an |
- * error on the error stack and return PR_FAILURE. If any objects |
- * remain in the tracker when it is finalized, that will be treated |
- * as an error. |
- * |
- * The error may be one of the following values: |
- * NSS_ERROR_INVALID_POINTER |
- * NSS_ERROR_TRACKER_NOT_INITIALIZED |
- * NSS_ERROR_TRACKER_NOT_EMPTY |
- * |
- * Return value: |
- * PR_SUCCESS |
- * PR_FAILURE |
- */ |
- |
-NSS_IMPLEMENT PRStatus |
-nssPointerTracker_finalize |
-( |
- nssPointerTracker *tracker |
-) |
-{ |
- PZLock *lock; |
- |
- if( (nssPointerTracker *)NULL == tracker ) { |
- nss_SetError(NSS_ERROR_INVALID_POINTER); |
- return PR_FAILURE; |
- } |
- |
- if( (PZLock *)NULL == tracker->lock ) { |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
- lock = tracker->lock; |
- PZ_Lock(lock); |
- |
- if( (PLHashTable *)NULL == tracker->table ) { |
- PZ_Unlock(lock); |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
-#ifdef DONT_DESTROY_EMPTY_TABLES |
- /* |
- * I changed my mind; I think we don't want this after all. |
- * Comments? |
- */ |
- count = PL_HashTableEnumerateEntries(tracker->table, |
- count_entries, |
- (void *)NULL); |
- |
- if( 0 != count ) { |
- PZ_Unlock(lock); |
- nss_SetError(NSS_ERROR_TRACKER_NOT_EMPTY); |
- return PR_FAILURE; |
- } |
-#endif /* DONT_DESTROY_EMPTY_TABLES */ |
- |
- PL_HashTableDestroy(tracker->table); |
- /* memset(tracker, 0, sizeof(nssPointerTracker)); */ |
- tracker->once = zero_once; |
- tracker->lock = (PZLock *)NULL; |
- tracker->table = (PLHashTable *)NULL; |
- |
- PZ_Unlock(lock); |
- PZ_DestroyLock(lock); |
- |
- return PR_SUCCESS; |
-} |
- |
-/* |
- * nssPointerTracker_add |
- * |
- * This method is only present in debug builds. |
- * |
- * This routine adds the specified pointer to the nssPointerTracker |
- * object. It should be called in constructor objects to register |
- * new valid objects. The nssPointerTracker is threadsafe, but this |
- * call is not idempotent. This routine returns a PRStatus value; |
- * if successful it will return PR_SUCCESS. On failure it will set |
- * an error on the error stack and return PR_FAILURE. |
- * |
- * The error may be one of the following values: |
- * NSS_ERROR_INVALID_POINTER |
- * NSS_ERROR_NO_MEMORY |
- * NSS_ERROR_TRACKER_NOT_INITIALIZED |
- * NSS_ERROR_DUPLICATE_POINTER |
- * |
- * Return value: |
- * PR_SUCCESS |
- * PR_FAILURE |
- */ |
- |
-NSS_IMPLEMENT PRStatus |
-nssPointerTracker_add |
-( |
- nssPointerTracker *tracker, |
- const void *pointer |
-) |
-{ |
- void *check; |
- PLHashEntry *entry; |
- |
- if( (nssPointerTracker *)NULL == tracker ) { |
- nss_SetError(NSS_ERROR_INVALID_POINTER); |
- return PR_FAILURE; |
- } |
- |
- if( (PZLock *)NULL == tracker->lock ) { |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
- PZ_Lock(tracker->lock); |
- |
- if( (PLHashTable *)NULL == tracker->table ) { |
- PZ_Unlock(tracker->lock); |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
- check = PL_HashTableLookup(tracker->table, pointer); |
- if( (void *)NULL != check ) { |
- PZ_Unlock(tracker->lock); |
- nss_SetError(NSS_ERROR_DUPLICATE_POINTER); |
- return PR_FAILURE; |
- } |
- |
- entry = PL_HashTableAdd(tracker->table, pointer, (void *)pointer); |
- |
- PZ_Unlock(tracker->lock); |
- |
- if( (PLHashEntry *)NULL == entry ) { |
- nss_SetError(NSS_ERROR_NO_MEMORY); |
- return PR_FAILURE; |
- } |
- |
- return PR_SUCCESS; |
-} |
- |
-/* |
- * nssPointerTracker_remove |
- * |
- * This method is only present in debug builds. |
- * |
- * This routine removes the specified pointer from the |
- * nssPointerTracker object. It does not call any destructor for the |
- * object; rather, this should be called from the object's destructor. |
- * The nssPointerTracker is threadsafe, but this call is not |
- * idempotent. This routine returns a PRStatus value; if successful |
- * it will return PR_SUCCESS. On failure it will set an error on the |
- * error stack and return PR_FAILURE. |
- * |
- * The error may be one of the following values: |
- * NSS_ERROR_INVALID_POINTER |
- * NSS_ERROR_TRACKER_NOT_INITIALIZED |
- * NSS_ERROR_POINTER_NOT_REGISTERED |
- * |
- * Return value: |
- * PR_SUCCESS |
- * PR_FAILURE |
- */ |
- |
-NSS_IMPLEMENT PRStatus |
-nssPointerTracker_remove |
-( |
- nssPointerTracker *tracker, |
- const void *pointer |
-) |
-{ |
- PRBool registered; |
- |
- if( (nssPointerTracker *)NULL == tracker ) { |
- nss_SetError(NSS_ERROR_INVALID_POINTER); |
- return PR_FAILURE; |
- } |
- |
- if( (PZLock *)NULL == tracker->lock ) { |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
- PZ_Lock(tracker->lock); |
- |
- if( (PLHashTable *)NULL == tracker->table ) { |
- PZ_Unlock(tracker->lock); |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
- registered = PL_HashTableRemove(tracker->table, pointer); |
- PZ_Unlock(tracker->lock); |
- |
- if( !registered ) { |
- nss_SetError(NSS_ERROR_POINTER_NOT_REGISTERED); |
- return PR_FAILURE; |
- } |
- |
- return PR_SUCCESS; |
-} |
- |
-/* |
- * nssPointerTracker_verify |
- * |
- * This method is only present in debug builds. |
- * |
- * This routine verifies that the specified pointer has been registered |
- * with the nssPointerTracker object. The nssPointerTracker object is |
- * threadsafe, and this call may be safely called from multiple threads |
- * simultaneously with the same arguments. This routine returns a |
- * PRStatus value; if the pointer is registered this will return |
- * PR_SUCCESS. Otherwise it will set an error on the error stack and |
- * return PR_FAILURE. Although the error is suitable for leaving on |
- * the stack, callers may wish to augment the information available by |
- * placing a more type-specific error on the stack. |
- * |
- * The error may be one of the following values: |
- * NSS_ERROR_INVALID_POINTER |
- * NSS_ERROR_TRACKER_NOT_INITIALIZED |
- * NSS_ERROR_POINTER_NOT_REGISTERED |
- * |
- * Return value: |
- * PR_SUCCESS |
- * PR_FAILRUE |
- */ |
- |
-NSS_IMPLEMENT PRStatus |
-nssPointerTracker_verify |
-( |
- nssPointerTracker *tracker, |
- const void *pointer |
-) |
-{ |
- void *check; |
- |
- if( (nssPointerTracker *)NULL == tracker ) { |
- nss_SetError(NSS_ERROR_INVALID_POINTER); |
- return PR_FAILURE; |
- } |
- |
- if( (PZLock *)NULL == tracker->lock ) { |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
- PZ_Lock(tracker->lock); |
- |
- if( (PLHashTable *)NULL == tracker->table ) { |
- PZ_Unlock(tracker->lock); |
- nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); |
- return PR_FAILURE; |
- } |
- |
- check = PL_HashTableLookup(tracker->table, pointer); |
- PZ_Unlock(tracker->lock); |
- |
- if( (void *)NULL == check ) { |
- nss_SetError(NSS_ERROR_POINTER_NOT_REGISTERED); |
- return PR_FAILURE; |
- } |
- |
- return PR_SUCCESS; |
-} |
- |
-#endif /* DEBUG */ |