Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
resource.c
Abstract:
Generic resource management routines for the Cluster Network driver.
Author:
Mike Massa (mikemas) February 12, 1997
Revision History:
Who When What -------- -------- ---------------------------------------------- mikemas 02-12-97 created
Notes:
--*/
#include "precomp.h"
#pragma hdrstop
PCN_RESOURCE CnAllocateResource( IN PCN_RESOURCE_POOL Pool ) /*++
Routine Description:
Allocates a resource from a resource pool.
Arguments:
Pool - A pointer to the pool from which to allocate a resource.
Return Value:
A pointer to the allocated resource if successful. NULL if unsuccessful.
--*/ { PCN_RESOURCE resource; PSINGLE_LIST_ENTRY entry = ExInterlockedPopEntrySList( &(Pool->ResourceList), &(Pool->ResourceListLock) );
if (entry != NULL) { resource = CONTAINING_RECORD(entry, CN_RESOURCE, Linkage); } else { resource = (*(Pool->CreateRoutine))(Pool->CreateContext);
if (resource != NULL) { CN_INIT_SIGNATURE(resource, CN_RESOURCE_SIG); resource->Pool = Pool; } }
return(resource);
} // CnAllocateResource
VOID CnFreeResource( PCN_RESOURCE Resource ) /*++
Routine Description:
Frees a resource back to a resource pool.
Arguments:
Resource - A pointer to the resource to free.
Return Value:
None.
--*/ { PCN_RESOURCE_POOL pool = Resource->Pool;
if (ExQueryDepthSList(&(pool->ResourceList)) < pool->Depth) { ExInterlockedPushEntrySList( &(pool->ResourceList), &(Resource->Linkage), &(pool->ResourceListLock) ); } else { (*(pool->DeleteRoutine))(Resource); }
return;
} // CnpFreeResource
VOID CnDrainResourcePool( PCN_RESOURCE_POOL Pool ) /*++
Routine Description:
Frees all cached resources in a resource pool in preparation for the pool to be destroyed. This routine does not free the memory containing the pool.
Arguments:
Pool - A pointer to the pool to drain.
Return Value:
None.
--*/ { PSINGLE_LIST_ENTRY entry; PCN_RESOURCE resource;
while ( (entry = ExInterlockedPopEntrySList( &(Pool->ResourceList), &(Pool->ResourceListLock) ) ) != NULL ) { resource = CONTAINING_RECORD(entry, CN_RESOURCE, Linkage);
(*(Pool->DeleteRoutine))(resource); }
return;
} // CnDrainResourcePool
|