Esempio n. 1
0
///////////////////////////////////////////////////////////////////////////////
// ResMapAllocate
// 
// Description:
//  Locates a free resource Number
// 
// Inputs:
//	pResMap		- pointer to resource map to iterate through
//	pNumber		- where to store allocated resource number
// 
// Outputs:
//	*pNumber	- resource allocated
// 
// Returns:
//	FSUCCESS - *pNumber is Resource number (now marked as allocated)
//	FINSUFFICIENT_RESOURCES  - no free resources
//	FINSUFFICIENT_MEMORY  - unable to grow map
// 
///////////////////////////////////////////////////////////////////////////////
FSTATUS 
ResMapAllocate(
	IN	RESOURCE_MAP* const	pResMap,
	OUT uint32				*pNumber )
{
	uint32 Size;
	uint32 Number;
	FSTATUS Status;

	ASSERT(pResMap);

	// no use doing all this searching if no resources available
	if (! ResMapAvailable(pResMap))
		return FINSUFFICIENT_RESOURCES;

	Size = BitVectorGetSize(&pResMap->m_ResList);
	// search from m_NextFree to end of present size
	Number = BitVectorFindFromIndex(&pResMap->m_ResList, FALSE, pResMap->m_NextFree);
	if (Number < Size)
	{
		Status = BitVectorSet(&pResMap->m_ResList, Number, 1);
		if (Status != FSUCCESS)
		{
			return Status;
		}
		goto found;
	}
	// search from start of list
	if (pResMap->m_FirstFree < pResMap->m_NextFree)
	{
		// search from m_FirstFree to m_NextFree
		Number = BitVectorFindRange(&pResMap->m_ResList, FALSE, pResMap->m_FirstFree, pResMap->m_NextFree);
		if (Number == pResMap->m_NextFree) Number = Size;
	} else {
		// expand to grow list
		Number = Size;
	}
	Status = BitVectorSet(&pResMap->m_ResList, Number, 1);
	if (Status != FSUCCESS)
	{
		return Status;
	}
	pResMap->m_FirstFree = Number+1;
found:
	pResMap->m_NextFree = Number+1;
	++(pResMap->m_NumAllocated);
	*pNumber = Number;
	return FSUCCESS;
}
Esempio n. 2
0
void removeListDuplicates(LinkedListNode *node) {

    BitVector *bv = BitVectorNew(255);
    LinkedListNode *previous = node;

    while (node != NULL) {
        if (BitVectorGet(bv, node->val)) {
            previous->next = node->next;
        } else {
            BitVectorSet(bv, node->val);
            previous = node;
        }
        node = node->next;
    }
}
Esempio n. 3
0
///////////////////////////////////////////////////////////////////////////////
// ResMapFree
// 
// Description:
//	This function sets the given resource number to be free.
//	should not be used to free reserved entries
// 
// Inputs:
//	pResMap		- Pointer to resource map.
//	Number		- Number of resource to free
// 
// Outputs:
//	None.
// 
// Returns:
//	FSUCCESS
//	FINVALID_STATE - resource was already free
// 
///////////////////////////////////////////////////////////////////////////////
FSTATUS 
ResMapFree(
	IN	RESOURCE_MAP* const	pResMap, 
	IN	const uint32	Number)
{
	FSTATUS Status;

	if (Number >= BitVectorGetSize(&pResMap->m_ResList)
		|| BitVectorGet(&pResMap->m_ResList, Number) == 0)
	{
		return FINVALID_STATE;
	}
	DEBUG_ASSERT(pResMap->m_NumAllocated);

	Status = BitVectorSet(&pResMap->m_ResList, Number, 0);
	ASSERT(Status == FSUCCESS);
	if (Number < pResMap->m_FirstFree)
		pResMap->m_FirstFree = Number;
	--(pResMap->m_NumAllocated);
	return Status;
}
Esempio n. 4
0
///////////////////////////////////////////////////////////////////////////////
// ResMapReserve
// 
// Description:
//  Reserves a specific resource number
// 
// Inputs:
//	pResMap		- pointer to resource map to iterate through
//	Number		- resource number to reserve
// 
// Outputs:
// 
// Returns:
//	FSUCCESS - Number now marked as allocated
//	FINSUFFICIENT_RESOURCES  - Number already allocated
//	FINSUFFICIENT_MEMORY  - unable to grow map
// 
///////////////////////////////////////////////////////////////////////////////
FSTATUS 
ResMapReserve(
	IN	RESOURCE_MAP* const	pResMap,
	IN	uint32				Number )
{
	FSTATUS Status;

	// check Number is not already allocated or reserved
	if (BitVectorGetSize(&pResMap->m_ResList) > Number)
	{
		if (BitVectorGet(&pResMap->m_ResList, Number))
		{
			return FINSUFFICIENT_RESOURCES;
		}
	}
	Status = BitVectorSet(&pResMap->m_ResList, Number, 1);
	if (Status == FSUCCESS)
	{
		// Leave FirstFree and NextFree alone, won't hurt much
		++(pResMap->m_NumReserved);
	}
	return Status;
}