| Index: mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.c
|
| ===================================================================
|
| --- mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.c (revision 191424)
|
| +++ mozilla/security/nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.c (working copy)
|
| @@ -1,383 +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/. */
|
| -/*
|
| - * pkix_pl_hashtable.c
|
| - *
|
| - * Hashtable Object Functions
|
| - *
|
| - */
|
| -
|
| -#include "pkix_pl_hashtable.h"
|
| -
|
| -/* --Private-Structure-------------------------------------------- */
|
| -
|
| -struct PKIX_PL_HashTableStruct {
|
| - pkix_pl_PrimHashTable *primHash;
|
| - PKIX_PL_Mutex *tableLock;
|
| - PKIX_UInt32 maxEntriesPerBucket;
|
| -};
|
| -
|
| -/* --Private-Functions-------------------------------------------- */
|
| -
|
| -#define PKIX_MUTEX_UNLOCK(mutex) \
|
| - do { \
|
| - if (mutex && lockedMutex == (PKIX_PL_Mutex *)(mutex)) { \
|
| - pkixTempResult = \
|
| - PKIX_PL_Mutex_Unlock((mutex), plContext); \
|
| - PORT_Assert(pkixTempResult == NULL); \
|
| - if (pkixTempResult) { \
|
| - PKIX_DoAddError(&stdVars, pkixTempResult, plContext); \
|
| - pkixTempResult = NULL; \
|
| - } \
|
| - lockedMutex = NULL; \
|
| - } else { \
|
| - PORT_Assert(lockedMutex == NULL); \
|
| - }\
|
| - } while (0)
|
| -
|
| -
|
| -#define PKIX_MUTEX_LOCK(mutex) \
|
| - do { \
|
| - if (mutex){ \
|
| - PORT_Assert(lockedMutex == NULL); \
|
| - PKIX_CHECK(PKIX_PL_Mutex_Lock((mutex), plContext), \
|
| - PKIX_MUTEXLOCKFAILED); \
|
| - lockedMutex = (mutex); \
|
| - } \
|
| - } while (0)
|
| -
|
| -/*
|
| - * FUNCTION: pkix_pl_HashTable_Destroy
|
| - * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h)
|
| - */
|
| -static PKIX_Error *
|
| -pkix_pl_HashTable_Destroy(
|
| - PKIX_PL_Object *object,
|
| - void *plContext)
|
| -{
|
| - PKIX_PL_HashTable *ht = NULL;
|
| - pkix_pl_HT_Elem *item = NULL;
|
| - PKIX_UInt32 i;
|
| -
|
| - PKIX_ENTER(HASHTABLE, "pkix_pl_HashTable_Destroy");
|
| - PKIX_NULLCHECK_ONE(object);
|
| -
|
| - PKIX_CHECK(pkix_CheckType(object, PKIX_HASHTABLE_TYPE, plContext),
|
| - PKIX_OBJECTNOTHASHTABLE);
|
| -
|
| - ht = (PKIX_PL_HashTable*) object;
|
| -
|
| - /* DecRef every object in the primitive hash table */
|
| - for (i = 0; i < ht->primHash->size; i++) {
|
| - for (item = ht->primHash->buckets[i];
|
| - item != NULL;
|
| - item = item->next) {
|
| - PKIX_DECREF(item->key);
|
| - PKIX_DECREF(item->value);
|
| - }
|
| - }
|
| -
|
| - PKIX_CHECK(pkix_pl_PrimHashTable_Destroy(ht->primHash, plContext),
|
| - PKIX_PRIMHASHTABLEDESTROYFAILED);
|
| -
|
| - PKIX_DECREF(ht->tableLock);
|
| -
|
| -cleanup:
|
| -
|
| - PKIX_RETURN(HASHTABLE);
|
| -}
|
| -
|
| -/*
|
| - * FUNCTION: pkix_pl_HashTable_RegisterSelf
|
| - * DESCRIPTION:
|
| - * Registers PKIX_HASHTABLE_TYPE and its related functions with systemClasses[]
|
| - * THREAD SAFETY:
|
| - * Not Thread Safe - for performance and complexity reasons
|
| - *
|
| - * Since this function is only called by PKIX_PL_Initialize, which should
|
| - * only be called once, it is acceptable that this function is not
|
| - * thread-safe.
|
| - */
|
| -PKIX_Error *
|
| -pkix_pl_HashTable_RegisterSelf(
|
| - void *plContext)
|
| -{
|
| -
|
| - extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
|
| - pkix_ClassTable_Entry entry;
|
| -
|
| - PKIX_ENTER(HASHTABLE, "pkix_pl_HashTable_RegisterSelf");
|
| -
|
| - entry.description = "HashTable";
|
| - entry.objCounter = 0;
|
| - entry.typeObjectSize = sizeof(PKIX_PL_HashTable);
|
| - entry.destructor = pkix_pl_HashTable_Destroy;
|
| - entry.equalsFunction = NULL;
|
| - entry.hashcodeFunction = NULL;
|
| - entry.toStringFunction = NULL;
|
| - entry.comparator = NULL;
|
| - entry.duplicateFunction = NULL;
|
| -
|
| - systemClasses[PKIX_HASHTABLE_TYPE] = entry;
|
| -
|
| - PKIX_RETURN(HASHTABLE);
|
| -}
|
| -
|
| -/* --Public-Functions------------------------------------------------------- */
|
| -
|
| -/*
|
| - * FUNCTION: PKIX_PL_HashTable_Create (see comments in pkix_pl_system.h)
|
| - */
|
| -PKIX_Error *
|
| -PKIX_PL_HashTable_Create(
|
| - PKIX_UInt32 numBuckets,
|
| - PKIX_UInt32 maxEntriesPerBucket,
|
| - PKIX_PL_HashTable **pResult,
|
| - void *plContext)
|
| -{
|
| - PKIX_PL_HashTable *hashTable = NULL;
|
| -
|
| - PKIX_ENTER(HASHTABLE, "PKIX_PL_HashTable_Create");
|
| - PKIX_NULLCHECK_ONE(pResult);
|
| -
|
| - if (numBuckets == 0) {
|
| - PKIX_ERROR(PKIX_NUMBUCKETSEQUALSZERO);
|
| - }
|
| -
|
| - /* Allocate a new hashtable */
|
| - PKIX_CHECK(PKIX_PL_Object_Alloc
|
| - (PKIX_HASHTABLE_TYPE,
|
| - sizeof (PKIX_PL_HashTable),
|
| - (PKIX_PL_Object **)&hashTable,
|
| - plContext),
|
| - PKIX_COULDNOTCREATEHASHTABLEOBJECT);
|
| -
|
| - /* Create the underlying primitive hash table type */
|
| - PKIX_CHECK(pkix_pl_PrimHashTable_Create
|
| - (numBuckets, &hashTable->primHash, plContext),
|
| - PKIX_PRIMHASHTABLECREATEFAILED);
|
| -
|
| - /* Create a lock for this table */
|
| - PKIX_CHECK(PKIX_PL_Mutex_Create(&hashTable->tableLock, plContext),
|
| - PKIX_ERRORCREATINGTABLELOCK);
|
| -
|
| - hashTable->maxEntriesPerBucket = maxEntriesPerBucket;
|
| -
|
| - *pResult = hashTable;
|
| -
|
| -cleanup:
|
| -
|
| - if (PKIX_ERROR_RECEIVED){
|
| - PKIX_DECREF(hashTable);
|
| - }
|
| -
|
| - PKIX_RETURN(HASHTABLE);
|
| -}
|
| -
|
| -/*
|
| - * FUNCTION: PKIX_PL_HashTable_Add (see comments in pkix_pl_system.h)
|
| - */
|
| -PKIX_Error *
|
| -PKIX_PL_HashTable_Add(
|
| - PKIX_PL_HashTable *ht,
|
| - PKIX_PL_Object *key,
|
| - PKIX_PL_Object *value,
|
| - void *plContext)
|
| -{
|
| - PKIX_PL_Mutex *lockedMutex = NULL;
|
| - PKIX_PL_Object *deletedKey = NULL;
|
| - PKIX_PL_Object *deletedValue = NULL;
|
| - PKIX_UInt32 hashCode;
|
| - PKIX_PL_EqualsCallback keyComp;
|
| - PKIX_UInt32 bucketSize = 0;
|
| -
|
| - PKIX_ENTER(HASHTABLE, "PKIX_PL_HashTable_Add");
|
| -
|
| -#if !defined(PKIX_OBJECT_LEAK_TEST)
|
| - PKIX_NULLCHECK_THREE(ht, key, value);
|
| -#else
|
| - PKIX_NULLCHECK_TWO(key, value);
|
| -
|
| - if (ht == NULL) {
|
| - PKIX_RETURN(HASHTABLE);
|
| - }
|
| -#endif
|
| - /* Insert into primitive hashtable */
|
| -
|
| - PKIX_CHECK(PKIX_PL_Object_Hashcode(key, &hashCode, plContext),
|
| - PKIX_OBJECTHASHCODEFAILED);
|
| -
|
| - PKIX_CHECK(pkix_pl_Object_RetrieveEqualsCallback
|
| - (key, &keyComp, plContext),
|
| - PKIX_OBJECTRETRIEVEEQUALSCALLBACKFAILED);
|
| -
|
| - PKIX_MUTEX_LOCK(ht->tableLock);
|
| -
|
| - PKIX_CHECK(pkix_pl_PrimHashTable_GetBucketSize
|
| - (ht->primHash,
|
| - hashCode,
|
| - &bucketSize,
|
| - plContext),
|
| - PKIX_PRIMHASHTABLEGETBUCKETSIZEFAILED);
|
| -
|
| - if (ht->maxEntriesPerBucket != 0 &&
|
| - bucketSize >= ht->maxEntriesPerBucket) {
|
| - /* drop the last one in the bucket */
|
| - PKIX_CHECK(pkix_pl_PrimHashTable_RemoveFIFO
|
| - (ht->primHash,
|
| - hashCode,
|
| - (void **) &deletedKey,
|
| - (void **) &deletedValue,
|
| - plContext),
|
| - PKIX_PRIMHASHTABLEGETBUCKETSIZEFAILED);
|
| - PKIX_DECREF(deletedKey);
|
| - PKIX_DECREF(deletedValue);
|
| - }
|
| -
|
| - PKIX_CHECK(pkix_pl_PrimHashTable_Add
|
| - (ht->primHash,
|
| - (void *)key,
|
| - (void *)value,
|
| - hashCode,
|
| - keyComp,
|
| - plContext),
|
| - PKIX_PRIMHASHTABLEADDFAILED);
|
| -
|
| - PKIX_INCREF(key);
|
| - PKIX_INCREF(value);
|
| - PKIX_MUTEX_UNLOCK(ht->tableLock);
|
| -
|
| - /*
|
| - * we don't call PKIX_PL_InvalidateCache here b/c we have
|
| - * not implemented toString or hashcode for this Object
|
| - */
|
| -
|
| -cleanup:
|
| -
|
| - PKIX_MUTEX_UNLOCK(ht->tableLock);
|
| -
|
| - PKIX_RETURN(HASHTABLE);
|
| -}
|
| -
|
| -/*
|
| - * FUNCTION: PKIX_PL_HashTable_Remove (see comments in pkix_pl_system.h)
|
| - */
|
| -PKIX_Error *
|
| -PKIX_PL_HashTable_Remove(
|
| - PKIX_PL_HashTable *ht,
|
| - PKIX_PL_Object *key,
|
| - void *plContext)
|
| -{
|
| - PKIX_PL_Mutex *lockedMutex = NULL;
|
| - PKIX_PL_Object *origKey = NULL;
|
| - PKIX_PL_Object *value = NULL;
|
| - PKIX_UInt32 hashCode;
|
| - PKIX_PL_EqualsCallback keyComp;
|
| -
|
| - PKIX_ENTER(HASHTABLE, "PKIX_PL_HashTable_Remove");
|
| -
|
| -#if !defined(PKIX_OBJECT_LEAK_TEST)
|
| - PKIX_NULLCHECK_TWO(ht, key);
|
| -#else
|
| - PKIX_NULLCHECK_ONE(key);
|
| -
|
| - if (ht == NULL) {
|
| - PKIX_RETURN(HASHTABLE);
|
| - }
|
| -#endif
|
| -
|
| - PKIX_CHECK(PKIX_PL_Object_Hashcode(key, &hashCode, plContext),
|
| - PKIX_OBJECTHASHCODEFAILED);
|
| -
|
| - PKIX_CHECK(pkix_pl_Object_RetrieveEqualsCallback
|
| - (key, &keyComp, plContext),
|
| - PKIX_OBJECTRETRIEVEEQUALSCALLBACKFAILED);
|
| -
|
| - PKIX_MUTEX_LOCK(ht->tableLock);
|
| -
|
| - /* Remove from primitive hashtable */
|
| - PKIX_CHECK(pkix_pl_PrimHashTable_Remove
|
| - (ht->primHash,
|
| - (void *)key,
|
| - hashCode,
|
| - keyComp,
|
| - (void **)&origKey,
|
| - (void **)&value,
|
| - plContext),
|
| - PKIX_PRIMHASHTABLEREMOVEFAILED);
|
| -
|
| - PKIX_MUTEX_UNLOCK(ht->tableLock);
|
| -
|
| - PKIX_DECREF(origKey);
|
| - PKIX_DECREF(value);
|
| -
|
| - /*
|
| - * we don't call PKIX_PL_InvalidateCache here b/c we have
|
| - * not implemented toString or hashcode for this Object
|
| - */
|
| -
|
| -cleanup:
|
| -
|
| - PKIX_MUTEX_UNLOCK(ht->tableLock);
|
| -
|
| - PKIX_RETURN(HASHTABLE);
|
| -}
|
| -
|
| -/*
|
| - * FUNCTION: PKIX_PL_HashTable_Lookup (see comments in pkix_pl_system.h)
|
| - */
|
| -PKIX_Error *
|
| -PKIX_PL_HashTable_Lookup(
|
| - PKIX_PL_HashTable *ht,
|
| - PKIX_PL_Object *key,
|
| - PKIX_PL_Object **pResult,
|
| - void *plContext)
|
| -{
|
| - PKIX_PL_Mutex *lockedMutex = NULL;
|
| - PKIX_UInt32 hashCode;
|
| - PKIX_PL_EqualsCallback keyComp;
|
| - PKIX_PL_Object *result = NULL;
|
| -
|
| - PKIX_ENTER(HASHTABLE, "PKIX_PL_HashTable_Lookup");
|
| -
|
| -#if !defined(PKIX_OBJECT_LEAK_TEST)
|
| - PKIX_NULLCHECK_THREE(ht, key, pResult);
|
| -#else
|
| - PKIX_NULLCHECK_TWO(key, pResult);
|
| -
|
| - if (ht == NULL) {
|
| - PKIX_RETURN(HASHTABLE);
|
| - }
|
| -#endif
|
| -
|
| - PKIX_CHECK(PKIX_PL_Object_Hashcode(key, &hashCode, plContext),
|
| - PKIX_OBJECTHASHCODEFAILED);
|
| -
|
| - PKIX_CHECK(pkix_pl_Object_RetrieveEqualsCallback
|
| - (key, &keyComp, plContext),
|
| - PKIX_OBJECTRETRIEVEEQUALSCALLBACKFAILED);
|
| -
|
| - PKIX_MUTEX_LOCK(ht->tableLock);
|
| -
|
| - /* Lookup in primitive hashtable */
|
| - PKIX_CHECK(pkix_pl_PrimHashTable_Lookup
|
| - (ht->primHash,
|
| - (void *)key,
|
| - hashCode,
|
| - keyComp,
|
| - (void **)&result,
|
| - plContext),
|
| - PKIX_PRIMHASHTABLELOOKUPFAILED);
|
| -
|
| - PKIX_INCREF(result);
|
| - PKIX_MUTEX_UNLOCK(ht->tableLock);
|
| -
|
| - *pResult = result;
|
| -
|
| -cleanup:
|
| -
|
| - PKIX_MUTEX_UNLOCK(ht->tableLock);
|
| -
|
| - PKIX_RETURN(HASHTABLE);
|
| -}
|
|
|