hash.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 335 行

C
335
字号
/*  * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is the Netscape security libraries. *  * The Initial Developer of the Original Code is Netscape * Communications Corporation.  Portions created by Netscape are  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All * Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable  * instead of those above.  If you wish to allow use of your  * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL.  If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */#ifdef DEBUGstatic const char CVS_ID[] = "@(#) $RCSfile: hash.c,v $ $Revision: 1.1 $ $Date: 2000/03/31 19:43:15 $ $Name: NSS_3_1_1_RTM $";#endif /* DEBUG *//* * hash.c * * This is merely a couple wrappers around NSPR's PLHashTable, using * the identity hash and arena-aware allocators.  The reason I did * this is that hash tables are used in a few places throughout the * NSS Cryptoki Framework in a fairly stereotyped way, and this allows * me to pull the commonalities into one place.  Should we ever want * to change the implementation, it's all right here. */#ifndef CK_T#include "ck.h"#endif /* CK_T *//* * nssCKFWHash * *  nssCKFWHash_Create *  nssCKFWHash_Destroy *  nssCKFWHash_Add *  nssCKFWHash_Remove *  nssCKFWHash_Count *  nssCKFWHash_Exists *  nssCKFWHash_Lookup *  nssCKFWHash_Iterate */struct nssCKFWHashStr {  NSSCKFWMutex *mutex;  /*   * The invariant that mutex protects is:   *   The count accurately reflects the hashtable state.   */  PLHashTable *plHashTable;  CK_ULONG count;};static PLHashNumbernss_ckfw_identity_hash(  const void *key){  PRUint32 i = (PRUint32)key;  PR_ASSERT(sizeof(PLHashNumber) == sizeof(PRUint32));  return (PLHashNumber)i;}/* * nssCKFWHash_Create * */NSS_IMPLEMENT nssCKFWHash *nssCKFWHash_Create(  NSSCKFWInstance *fwInstance,  NSSArena *arena,  CK_RV *pError){  nssCKFWHash *rv;#ifdef NSSDEBUG  if( (CK_RV *)NULL == pError ) {    return (nssCKFWHash *)NULL;  }  if( PR_SUCCESS != nssArena_verifyPointer(arena) ) {    *pError = CKR_ARGUMENTS_BAD;    return (nssCKFWHash *)NULL;  }#endif /* NSSDEBUG */  rv = nss_ZNEW(arena, nssCKFWHash);  if( (nssCKFWHash *)NULL == rv ) {    *pError = CKR_HOST_MEMORY;    return (nssCKFWHash *)NULL;  }  rv->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError);  if( (NSSCKFWMutex *)NULL == rv->mutex ) {    if( CKR_OK == *pError ) {      *pError = CKR_GENERAL_ERROR;    }    return (nssCKFWHash *)NULL;  }  rv->plHashTable = PL_NewHashTable(0, nss_ckfw_identity_hash,     PL_CompareValues, PL_CompareValues, &nssArenaHashAllocOps, arena);  if( (PLHashTable *)NULL == rv->plHashTable ) {    (void)nssCKFWMutex_Destroy(rv->mutex);    (void)nss_ZFreeIf(rv);    *pError = CKR_HOST_MEMORY;    return (nssCKFWHash *)NULL;  }  rv->count = 0;  return rv;}/* * nssCKFWHash_Destroy * */NSS_IMPLEMENT voidnssCKFWHash_Destroy(  nssCKFWHash *hash){  (void)nssCKFWMutex_Destroy(hash->mutex);  PL_HashTableDestroy(hash->plHashTable);  (void)nss_ZFreeIf(hash);}/* * nssCKFWHash_Add * */NSS_IMPLEMENT CK_RVnssCKFWHash_Add(  nssCKFWHash *hash,  const void *key,  const void *value){  CK_RV error = CKR_OK;  PLHashEntry *he;  error = nssCKFWMutex_Lock(hash->mutex);  if( CKR_OK != error ) {    return error;  }    he = PL_HashTableAdd(hash->plHashTable, key, (void *)value);  if( (PLHashEntry *)NULL == he ) {    error = CKR_HOST_MEMORY;  } else {    hash->count++;  }  (void)nssCKFWMutex_Unlock(hash->mutex);  return error;}/* * nssCKFWHash_Remove * */NSS_IMPLEMENT voidnssCKFWHash_Remove(  nssCKFWHash *hash,  const void *it){  PRBool found;  if( CKR_OK != nssCKFWMutex_Lock(hash->mutex) ) {    return;  }  found = PL_HashTableRemove(hash->plHashTable, it);  if( found ) {    hash->count--;  }  (void)nssCKFWMutex_Unlock(hash->mutex);  return;}/* * nssCKFWHash_Count * */NSS_IMPLEMENT CK_ULONGnssCKFWHash_Count(  nssCKFWHash *hash){  CK_ULONG count;  if( CKR_OK != nssCKFWMutex_Lock(hash->mutex) ) {    return (CK_ULONG)0;  }  count = hash->count;  (void)nssCKFWMutex_Unlock(hash->mutex);  return count;}/* * nssCKFWHash_Exists * */NSS_IMPLEMENT CK_BBOOLnssCKFWHash_Exists(  nssCKFWHash *hash,  const void *it){  void *value;  if( CKR_OK != nssCKFWMutex_Lock(hash->mutex) ) {    return CK_FALSE;  }  value = PL_HashTableLookup(hash->plHashTable, it);  (void)nssCKFWMutex_Unlock(hash->mutex);  if( (void *)NULL == value ) {    return CK_FALSE;  } else {    return CK_TRUE;  }}/* * nssCKFWHash_Lookup * */NSS_IMPLEMENT void *nssCKFWHash_Lookup(  nssCKFWHash *hash,  const void *it){  void *rv;  if( CKR_OK != nssCKFWMutex_Lock(hash->mutex) ) {    return (void *)NULL;  }  rv = PL_HashTableLookup(hash->plHashTable, it);  (void)nssCKFWMutex_Unlock(hash->mutex);  return rv;}struct arg_str {  nssCKFWHashIterator fcn;  void *closure;};static PRIntnnss_ckfwhash_enumerator(  PLHashEntry *he,  PRIntn index,  void *arg){  struct arg_str *as = (struct arg_str *)arg;  as->fcn(he->key, he->value, as->closure);  return HT_ENUMERATE_NEXT;}/* * nssCKFWHash_Iterate * * NOTE that the iteration function will be called with the hashtable locked. */NSS_IMPLEMENT voidnssCKFWHash_Iterate(  nssCKFWHash *hash,  nssCKFWHashIterator fcn,  void *closure){  struct arg_str as;  as.fcn = fcn;  as.closure = closure;  if( CKR_OK != nssCKFWMutex_Lock(hash->mutex) ) {    return;  }  PL_HashTableEnumerateEntries(hash->plHashTable, nss_ckfwhash_enumerator, &as);  (void)nssCKFWMutex_Unlock(hash->mutex);  return;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?