コード例 #1
0
Log::~Log()
{
	if( gs_Log == this ) LogSetDefault(nullptr);

	TimerDestroy(timer);
	MutexDestroy(mutex);
}
コード例 #2
0
ファイル: subscribe.c プロジェクト: 01org/opa-ff
// reaper callback
static void
ReapTrapReference(LIST_ITEM *pItem)
{
	// Reaper uses QListObj, so we must use PARENT_STRUCT
	TRAP_REFERENCE *pTrapReference = PARENT_STRUCT(pItem, TRAP_REFERENCE, ListItem);
	TimerDestroy(&pTrapReference->Timer);
	MemoryDeallocate(pTrapReference);
}
コード例 #3
0
ファイル: common.c プロジェクト: BhaaLseN/sneek
void udelay(int us)
{
	u8 heap[0x10];
	u32 msg;
	s32 mqueue = -1;
	s32 timer = -1;

	mqueue = mqueue_create(heap, 1);
	if(mqueue < 0)
		goto out;
	timer = TimerCreate(us, 0, mqueue, 0xbabababa);
	if(timer < 0)
		goto out;
	mqueue_recv(mqueue, &msg, 0);
	
out:
	if(timer > 0)
		TimerDestroy(timer);
	if(mqueue > 0)
		mqueue_destroy(mqueue);
}
コード例 #4
0
ファイル: subscribe.c プロジェクト: 01org/opa-ff
void
SubscribeTerminate()
{
	LIST_ITEM *pTrapReferenceListItem;

	_DBG_ENTER_LVL(_DBG_LVL_FUNC_TRACE, SubscribeTerminate);

	SpinLockAcquire(&SubscribedTrapsListLock);
	SubscribeInitialized = 0;
	SpinLockRelease(&SubscribedTrapsListLock);

	iba_sd_deregister(SdClientHandle);

	/* no more SD callbacks will occur now, so OPQUEUED is not important */
	SpinLockAcquire(&SubscribedTrapsListLock);
	while ( NULL != (pTrapReferenceListItem = QListRemoveHead(&SubscribedTrapsList)))
	{
		TRAP_REFERENCE *pTrapReference = (TRAP_REFERENCE *)QListObj(pTrapReferenceListItem);

		ASSERT(pTrapReference != NULL);
		TimerStop(&pTrapReference->Timer);
		// release lock so TimerDestroy can wait for callback
		SpinLockRelease(&SubscribedTrapsListLock);
		TimerDestroy(&pTrapReference->Timer);

		MemoryDeallocate(pTrapReference);

		SpinLockAcquire(&SubscribedTrapsListLock);
	}
	SpinLockRelease(&SubscribedTrapsListLock);

	QListDestroy(&SubscribedTrapsList);
	SpinLockDestroy(&SubscribedTrapsListLock);

	_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );
}
コード例 #5
0
ファイル: multicast.c プロジェクト: 01org/opa-ff
static
FSTATUS
IncrementMcGroupUsageCount(CLIENT_HANDLE       SdClientHandle,
                           void                *pContext,
                           SD_MULTICAST_CALLBACK *pMulticastCallback,
                           uint16              McFlags,
                           uint64              ComponentMask,
                           IB_MCMEMBER_RECORD  *pMcMemberRecord,
                           MC_GROUP_ID         *pMcGroupId)
{
	MC_CLIENT *pMcClientTemp;
	MC_CLIENT *pMcClient = NULL;
	MC_GROUP  *pMcGroupTemp;
	MC_GROUP  *pMcGroup = NULL;
	boolean   StartTrapNotification;

	_DBG_ENTER_LVL(_DBG_LVL_FUNC_TRACE, IncrementMcGroupUsageCount);
	
	/* Allocate Everything up front to avoid locking issues */
	pMcClientTemp = (MC_CLIENT *)MemoryAllocate2AndClear(sizeof(MC_CLIENT), IBA_MEM_FLAG_NONE, SUBNET_DRIVER_TAG);
	if (pMcClientTemp == NULL)
	{
		_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );
		return FINSUFFICIENT_MEMORY;
	}
	
	pMcClientTemp->SdClientHandle = SdClientHandle;
	pMcClientTemp->pContext = pContext;
	pMcClientTemp->McFlags = McFlags;
	pMcClientTemp->pMulticastCallback = pMulticastCallback;

	pMcGroupTemp = (MC_GROUP*)MemoryAllocate2AndClear(sizeof(MC_GROUP), IBA_MEM_FLAG_SHORT_DURATION, SUBNET_DRIVER_TAG);
	if (pMcGroupTemp == NULL)
	{
		_DBG_ERROR(("IncrementMcGroupUsageCount MemoryAllocateError\n"));
		MemoryDeallocate(pMcClientTemp);
		_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );
		return FINSUFFICIENT_MEMORY;
	}
	
	SpinLockAcquire(&MulticastLock);

	pMcClient = FindMcClient(SdClientHandle, pMcGroupId);
	if (pMcClient == NULL) 
	{
		pMcClient= pMcClientTemp;
		pMcClientTemp = NULL;
	}
	else 
	{
		_DBG_ERROR(("IncrementMcGroupUsageCount Client already exists.\n"));
		/*SpinLockRelease(&MulticastLock);
		MemoryDeallocate(pMcGroupTemp);
		MemoryDeallocate(pMcClient);
		_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );
		return FDUPLICATE;*/
		// continue anyway
	}
	
	StartTrapNotification = QListIsEmpty(&MasterMcGroupList);
	
	pMcGroup = FindMcGroup(pMcGroupId);
	if (pMcGroup == NULL)
	{
		// didn't find Mcgroup in list, let us add one
		pMcGroupTemp->McGroupState = MC_GROUP_STATE_REQUEST_JOIN;
		pMcGroupTemp->ComponentMask = ComponentMask;
		pMcGroupTemp->McMemberRecord = *pMcMemberRecord;
		pMcGroupTemp->McGroupId = *pMcGroupId;
		QListInit(&pMcGroupTemp->McClientList);
		QListSetObj(&pMcGroupTemp->ListItem, pMcGroupTemp);

		pMcGroup = pMcGroupTemp;
		pMcGroupTemp = NULL;

		QListInsertTail(&MasterMcGroupList, &pMcGroup->ListItem);

		TimerInitState(&pMcGroup->Timer);
		TimerInit(&pMcGroup->Timer, IssueSubnetDriverCall, pMcGroup );
	}
	else
	{
		// group already exists - check state
		if ( (pMcGroup->McGroupState != MC_GROUP_STATE_REQUEST_JOIN) &&
		     (pMcGroup->McGroupState != MC_GROUP_STATE_AVAILABLE) )
		{
			if (pMcGroup->McGroupState == MC_GROUP_STATE_JOIN_FAILED)
			{
				_DBG_ERROR(("Prior attempt to join Multicast Group failed\n"));
			}
			else
			{
				_DBG_ERROR(("IncrementMcGroupUsageCount McGroup invalid state:%d.\n",
				pMcGroup->McGroupState));
			}
			SpinLockRelease(&MulticastLock);
			MemoryDeallocate(pMcGroupTemp);
			if(pMcClientTemp)
				MemoryDeallocate(pMcClientTemp);
			_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );
			return FDUPLICATE;
		}
	}

	pMcClient->pMcGroup = pMcGroup;
	
	QListSetObj(&pMcClient->ListItem, pMcClient);
	QListInsertTail(&MasterMcClientList, &pMcClient->ListItem);
	
	QListSetObj(&pMcClient->McGroupListItem, pMcClient);
	QListInsertTail(&pMcGroup->McClientList, &pMcClient->McGroupListItem);
	
	if (pMcGroupTemp == NULL)
	{
		/* First client joining the group - Get The Process Started */
		_DBG_INFO(("new mcgroup - queuing join\n"));
		QueueSubnetDriverCall(pMcGroup, MC_GROUP_STATE_REQUEST_JOIN);
	}
	else
	{
		_DBG_INFO(("existing mcgroup - checking flags %d\n",
			pMcGroup->McGroupState));
		if ((McJoinFlagsAdjusted(pMcGroup, pMcMemberRecord) == TRUE) && 
		    (pMcGroup->McGroupState == MC_GROUP_STATE_AVAILABLE)) // TODO: Check Concurrency Here
			/* we had already joined and the flags changes - so rejoin */
		{
			_DBG_INFO(("flags changed after we joined - rejoining \n"));
			QueueSubnetDriverCall(pMcGroup, MC_GROUP_STATE_REQUEST_JOIN);
		}
		else if (pMcGroup->McGroupState == MC_GROUP_STATE_AVAILABLE) 
		{
			// we already had joined but we got a new client - issue callbacks
			_DBG_INFO(("someone joined when state is available - issuing callbacks \n"));
			CallMcClients(pMcGroup, FSUCCESS, MC_GROUP_STATE_AVAILABLE);
		}
		// NOTE if state is JOIN, then when that completes all clients
		// including new one will be notified via callback
	}

	if (MaintenanceTimerActivated == FALSE)
	{
		MaintenanceTimerActivated = TRUE;
		TimerStart(&MaintenanceTimer, 5000);
	}
	
	SpinLockRelease(&MulticastLock);
	
	if (StartTrapNotification)
	{
		McSubscribeForTraps();
	}

	if (pMcGroupTemp)
	{
		TimerDestroy(&pMcGroupTemp->Timer);
		QListDestroy(&pMcGroupTemp->McClientList);
		MemoryDeallocate(pMcGroupTemp);
	}

	if (pMcClientTemp)
	{
		MemoryDeallocate(pMcClientTemp);
	}

	_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );

	return FSUCCESS;
}
コード例 #6
0
ファイル: multicast.c プロジェクト: 01org/opa-ff
FSTATUS
MulticastTerminate(void)
{
	FSTATUS       Status;
	CLIENT_HANDLE McSdHandleTemp;
	LIST_ITEM     *pListItem;

	_DBG_ENTER_LVL(_DBG_LVL_FUNC_TRACE, MulticastTerminate);
	
	/* Just in case maintenance routine is running */
	SpinLockAcquire(&MulticastLock);
	McSdHandleTemp = McSdHandle;
	McSdHandle = NULL;
	SpinLockRelease(&MulticastLock);
		
	if (McSdHandleTemp == NULL)
	{
		_DBG_ERROR(("Multicast Module Not A Registered Subnet Driver "
		            "Client Process.\n"));
		Status = FINVALID_STATE;
		goto exit;
	}

	if (MaintenanceTimerActivated == TRUE)
	{
		TimerStop(&MaintenanceTimer);
		MaintenanceTimerActivated = FALSE;
	}
	
	Status = iba_sd_deregister(McSdHandleTemp);
	if (Status != FSUCCESS) {
		_DBG_ERROR(("Cannot Deregister With "
		            "Subnet Data Interface.\n"));
	}

	for (pListItem = QListRemoveHead(&MasterMcGroupList);
	     pListItem != NULL;
	     pListItem = QListRemoveHead(&MasterMcGroupList))
	{
		MC_GROUP *pMcGroup = (MC_GROUP *)QListObj(pListItem);
		
		ASSERT(pMcGroup != NULL);
		
		TimerStop(&pMcGroup->Timer);
		TimerDestroy(&pMcGroup->Timer);
		QListDestroy(&pMcGroup->McClientList);
		MemoryDeallocate(pMcGroup);
	}
	
	for (pListItem = QListRemoveHead(&MasterMcClientList);
	     pListItem != NULL;
	     pListItem = QListRemoveHead(&MasterMcClientList))
	{
		MC_CLIENT *pMcClient = (MC_CLIENT *)QListObj(pListItem);
		
		ASSERT(pMcClient != NULL);
		
		MemoryDeallocate(pMcClient);
	}
	
	QListDestroy(&MasterMcGroupList);
	QListDestroy(&MasterMcClientList);
	TimerDestroy(&MaintenanceTimer);
	SpinLockDestroy(&MulticastLock);

exit:
	_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );
	
	return Status;
}
コード例 #7
0
ファイル: multicast.c プロジェクト: 01org/opa-ff
static
void
McMaintenance(void *pContext)
{
	LIST_ITEM *pListItem;
	
	_DBG_ENTER_LVL(_DBG_LVL_FUNC_TRACE, McMaintenance);
	
	if (McSdHandle != NULL)
	{
		SpinLockAcquire(&MulticastLock);

		if (TimerCallbackStopped(&MaintenanceTimer))
		{
			// stale timer callback
			SpinLockRelease(&MulticastLock);
			goto done;
		}

		// Loop Through MasterMcClientList

		pListItem = QListHead(&MasterMcClientList);

		while(pListItem != NULL)
		{
			MC_CLIENT *pMcClient = (MC_CLIENT *)QListObj(pListItem);

			ASSERT(pMcClient != NULL);

			pListItem = QListNext(&MasterMcClientList, pListItem);

			if ((pMcClient->McClientDelete == TRUE) && 
				(pMcClient->McClientInUse == 0))
			{
				QListRemoveItem(&MasterMcClientList, &pMcClient->ListItem);
				SpinLockRelease(&MulticastLock);
				MemoryDeallocate(pMcClient);
				if (McSdHandle == NULL)
				{
					break;
				}
				SpinLockAcquire(&MulticastLock);
			}
		}
	}

	if (McSdHandle != NULL)
	{
		// Loop Through MasterMcGroupList

		pListItem = QListHead(&MasterMcGroupList);

		while(pListItem != NULL)
		{
			MC_GROUP *pMcGroup = (MC_GROUP *)QListObj(pListItem);

			ASSERT(pMcGroup != NULL);

			pListItem = QListNext(&MasterMcGroupList, pListItem);

			if ((pMcGroup->McGroupDelete == TRUE) && 
				(pMcGroup->McGroupInUse == 0))
			{
				TimerDestroy(&pMcGroup->Timer);
				QListDestroy(&pMcGroup->McClientList);
				QListRemoveItem(&MasterMcGroupList, &pMcGroup->ListItem);
				SpinLockRelease(&MulticastLock);
				MemoryDeallocate(pMcGroup);
				if (McSdHandle == NULL)
				{
					break;
				}
				SpinLockAcquire(&MulticastLock);
			}
		}
	}

	if (McSdHandle != NULL)
	{
		if (!QListIsEmpty(&MasterMcGroupList) ||
			!QListIsEmpty(&MasterMcClientList))
		{
			/* Only Start It If There Is A Possibility Of Something To Do */
			TimerStart(&MaintenanceTimer, 5000);
			SpinLockRelease(&MulticastLock);
		}
		else
		{
			McUnsubscribeForTraps();
			MaintenanceTimerActivated = FALSE;
			SpinLockRelease(&MulticastLock);
		}
	}
	
done:
	_DBG_LEAVE_LVL( _DBG_LVL_FUNC_TRACE );
}