static VOID SrvSession2Free( PLWIO_SRV_SESSION_2 pSession ) { LWIO_LOG_DEBUG("Freeing session [object:0x%x][uid:%u]", pSession, pSession->ullUid); if (pSession->pMutex) { pthread_rwlock_destroy(&pSession->mutex); pSession->pMutex = NULL; } if (pSession->pTreeCollection) { LwRtlRBTreeFree(pSession->pTreeCollection); } if (pSession->hFinderRepository) { SrvFinderCloseRepository(pSession->hFinderRepository); } SRV_SAFE_FREE_MEMORY(pSession->pwszClientPrincipalName); if (pSession->pIoSecurityContext) { IoSecurityDereferenceSecurityContext(&pSession->pIoSecurityContext); } SrvFreeMemory(pSession); }
NTSTATUS LwRtlRBTreeCreate( PFN_LWRTL_RB_TREE_COMPARE pfnRBTreeCompare, PFN_LWRTL_RB_TREE_FREE_KEY pfnRBTreeFreeKey, PFN_LWRTL_RB_TREE_FREE_DATA pfnRBTreeFreeData, PLWRTL_RB_TREE* ppRBTree ) { NTSTATUS ntStatus = 0; PLWRTL_RB_TREE pRBTree = NULL; PLWRTL_RB_TREE_NODE pSentinel = NULL; if (!pfnRBTreeCompare) { ntStatus = STATUS_INVALID_PARAMETER_1; BAIL_ON_NT_STATUS(ntStatus); } ntStatus = LW_RTL_ALLOCATE(&pRBTree, LWRTL_RB_TREE, sizeof(LWRTL_RB_TREE)); BAIL_ON_NT_STATUS(ntStatus); pRBTree->pfnCompare = pfnRBTreeCompare; pRBTree->pfnFreeKey = pfnRBTreeFreeKey; pRBTree->pfnFreeData = pfnRBTreeFreeData; ntStatus = LW_RTL_ALLOCATE( &pSentinel, LWRTL_RB_TREE_NODE, sizeof(LWRTL_RB_TREE_NODE)); BAIL_ON_NT_STATUS(ntStatus); RB_COLOR_BLACK(pSentinel); pRBTree->pRoot = pSentinel; pRBTree->pSentinel = pSentinel; *ppRBTree = pRBTree; cleanup: return ntStatus; error: if (pRBTree) { LwRtlRBTreeFree(pRBTree); } *ppRBTree = NULL; goto cleanup; }
static VOID SrvTree2Free( PLWIO_SRV_TREE_2 pTree ) { LWIO_LOG_DEBUG("Freeing tree [object:0x%x][tid:%u]", pTree, pTree->ulTid); // Cannot be in the parent since parent would have a reference. LWIO_ASSERT(!SrvTree2IsInParent_inlock(pTree)); if (pTree->pMutex) { pthread_rwlock_destroy(&pTree->mutex); pTree->pMutex = NULL; } if (pTree->pFileCollection) { LwRtlRBTreeFree(pTree->pFileCollection); } if (pTree->hFile) { IoCloseFile(pTree->hFile); } if (pTree->pShareInfo) { SrvShareReleaseInfo(pTree->pShareInfo); } if (pTree->resource.ulResourceId) { PSRV_RESOURCE pResource = NULL; SrvElementsUnregisterResource(pTree->resource.ulResourceId, &pResource); pTree->resource.ulResourceId = 0; } // Release parent at the end if (pTree->pSession) { SrvSession2Release(pTree->pSession); } SrvFreeMemory(pTree); }
static VOID SrvTreeFree( PLWIO_SRV_TREE pTree ) { LWIO_LOG_DEBUG("Freeing tree [object:0x%x][tid:%u]", pTree, pTree->tid); if (pTree->pMutex) { pthread_rwlock_destroy(&pTree->mutex); pTree->pMutex = NULL; } if (pTree->pFileCollection) { LwRtlRBTreeFree(pTree->pFileCollection); } if (pTree->pAsyncStateCollection) { LwRtlRBTreeFree(pTree->pAsyncStateCollection); } if (pTree->hFile) { IoCloseFile(pTree->hFile); } if (pTree->pShareInfo) { SrvShareReleaseInfo(pTree->pShareInfo); } SrvFreeMemory(pTree); }
VOID SrvElementsResourcesShutdown( VOID ) { if (gSrvElements.resources.pResources) { LwRtlRBTreeFree(gSrvElements.resources.pResources); gSrvElements.resources.pResources = NULL; } if (gSrvElements.resources.pMutex) { pthread_rwlock_destroy(&gSrvElements.resources.mutex); gSrvElements.resources.pMutex = NULL; } }
static VOID SrvFinderFreeRepository( IN PSRV_FINDER_REPOSITORY pFinderRepository ) { if (pFinderRepository->pSearchSpaceCollection) { LwRtlRBTreeFree(pFinderRepository->pSearchSpaceCollection); } if (pFinderRepository->pMutex) { pthread_mutex_destroy(&pFinderRepository->mutex); } SrvFreeMemory(pFinderRepository); }