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: #include "ckdbm.h" michael@0: michael@0: static void michael@0: nss_dbm_mdFindObjects_Final michael@0: ( michael@0: NSSCKMDFindObjects *mdFindObjects, michael@0: NSSCKFWFindObjects *fwFindObjects, michael@0: NSSCKMDSession *mdSession, michael@0: NSSCKFWSession *fwSession, michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance michael@0: ) michael@0: { michael@0: nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc; michael@0: michael@0: /* Locks might have system resources associated */ michael@0: (void)NSSCKFWMutex_Destroy(find->list_lock); michael@0: (void)NSSArena_Destroy(find->arena); michael@0: } michael@0: michael@0: michael@0: static NSSCKMDObject * michael@0: nss_dbm_mdFindObjects_Next michael@0: ( michael@0: NSSCKMDFindObjects *mdFindObjects, michael@0: NSSCKFWFindObjects *fwFindObjects, michael@0: NSSCKMDSession *mdSession, michael@0: NSSCKFWSession *fwSession, michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance, michael@0: NSSArena *arena, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc; michael@0: struct nss_dbm_dbt_node *node; michael@0: nss_dbm_object_t *object; michael@0: NSSCKMDObject *rv; michael@0: michael@0: while(1) { michael@0: /* Lock */ michael@0: { michael@0: *pError = NSSCKFWMutex_Lock(find->list_lock); michael@0: if( CKR_OK != *pError ) { michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: michael@0: node = find->found; michael@0: if( (struct nss_dbm_dbt_node *)NULL != node ) { michael@0: find->found = node->next; michael@0: } michael@0: michael@0: *pError = NSSCKFWMutex_Unlock(find->list_lock); michael@0: if( CKR_OK != *pError ) { michael@0: /* screwed now */ michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: } michael@0: michael@0: if( (struct nss_dbm_dbt_node *)NULL == node ) { michael@0: break; michael@0: } michael@0: michael@0: if( nss_dbm_db_object_still_exists(node->dbt) ) { michael@0: break; michael@0: } michael@0: } michael@0: michael@0: if( (struct nss_dbm_dbt_node *)NULL == node ) { michael@0: *pError = CKR_OK; michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: michael@0: object = nss_ZNEW(arena, nss_dbm_object_t); michael@0: if( (nss_dbm_object_t *)NULL == object ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: michael@0: object->arena = arena; michael@0: object->handle = nss_ZNEW(arena, nss_dbm_dbt_t); michael@0: if( (nss_dbm_dbt_t *)NULL == object->handle ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: michael@0: object->handle->my_db = node->dbt->my_db; michael@0: object->handle->dbt.size = node->dbt->dbt.size; michael@0: object->handle->dbt.data = nss_ZAlloc(arena, node->dbt->dbt.size); michael@0: if( (void *)NULL == object->handle->dbt.data ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: michael@0: (void)memcpy(object->handle->dbt.data, node->dbt->dbt.data, node->dbt->dbt.size); michael@0: michael@0: rv = nss_dbm_mdObject_factory(object, pError); michael@0: if( (NSSCKMDObject *)NULL == rv ) { michael@0: return (NSSCKMDObject *)NULL; michael@0: } michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: NSS_IMPLEMENT NSSCKMDFindObjects * michael@0: nss_dbm_mdFindObjects_factory michael@0: ( michael@0: nss_dbm_find_t *find, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: NSSCKMDFindObjects *rv; michael@0: michael@0: rv = nss_ZNEW(find->arena, NSSCKMDFindObjects); michael@0: if( (NSSCKMDFindObjects *)NULL == rv ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: return (NSSCKMDFindObjects *)NULL; michael@0: } michael@0: michael@0: rv->etc = (void *)find; michael@0: rv->Final = nss_dbm_mdFindObjects_Final; michael@0: rv->Next = nss_dbm_mdFindObjects_Next; michael@0: michael@0: return rv; michael@0: }