Esempio n. 1
0
int			OffsetReplaceElem( GenLinkedOffsetList *pList, void *elemInList, void *newElem)
/* Replace an element in the list with a new element, in the same position. */
{
void	*iElem, *lastElem;

	if ( elemInList == NULL || newElem == NULL)
		return 0;

	for ( iElem = GetHeadPtr( pList), lastElem = NULL; iElem; 
		  iElem = GetOffsetLink( pList, iElem))
	{
		if ( iElem == elemInList)
		{
			AssignOffsetLink( newElem, GetOffsetLink( pList, elemInList), pList->LinkOffset);
			if ( lastElem)		// somewhere past the head
			{
				AssignOffsetLink( lastElem, newElem, pList->LinkOffset);
			} 
			else				// at the head
			{
				pList->Head = (size_t) newElem - (size_t) pList;
			}
			if ( GetTailPtr( pList) == elemInList)
				pList->Tail = (size_t) newElem - (size_t) pList;
			return 1;
		}
		lastElem = iElem;
	}

	return 0;
}
Esempio n. 2
0
int		OffsetRemoveFromList( GenLinkedOffsetList *pList, void *elem)
/* Remove a linked list element from the list. Return 0 if it was not found. */
/* If the element is removed, its link will be set to NULL. */
{
void	*iElem, *lastElem;

	for ( iElem = GetHeadPtr( pList), lastElem = NULL; iElem; 
		  iElem = GetOffsetLink( pList, iElem))
	{
		if ( iElem == elem) {
			if ( lastElem) {		// somewhere past the head
				AssignOffsetLink( lastElem, GetOffsetLink( pList, elem), pList->LinkOffset);
			} else {				// at the head
				iElem = GetOffsetLink( pList, elem);
				pList->Head = iElem ? (size_t) iElem - (size_t) pList : 0;
			}
			if ( GetTailPtr( pList) == elem)
				pList->Tail = lastElem ? (size_t) lastElem - (size_t) pList : 0;
			AssignOffsetLink( elem, NULL, pList->LinkOffset);	// maybe catch a stale reference bug.
			return 1;
		}
		lastElem = iElem;
	}

	return 0;
}
Esempio n. 3
0
DWORD CMclMailbox::GetAlertable( void *lpMsg, const CMclWaitableCollection & rCollection, DWORD dwTimeout) {
    CMclWaitableCollection cCollection;

    cCollection.AddObject(*m_cPendingCountSemaphoreAPtr);
    cCollection.AddCollection(rCollection);
    int nObjects = cCollection.GetCount();

    DWORD dwStatus = cCollection.Wait( FALSE, dwTimeout);

    if (CMclWaitSucceeded( dwStatus, nObjects)
            && (CMclWaitSucceededIndex(dwStatus) == 0)) {
        dwStatus = m_cGuardMutexAPtr->Wait(dwTimeout);
        if (CMclWaitSucceeded(dwStatus, 1) || CMclWaitAbandoned(dwStatus, 1)) {
            CopyMemory( lpMsg, GetHeadPtr(), m_pHdr->cbMsgSize);
            IncrementHead();
            m_cGuardMutexAPtr->Release();
            dwStatus = WAIT_OBJECT_0;

            // Nov 7, 2001: only release semaphore if
            // we've actually place something in the mailbox.
            // Previously, the following line of code was outside
            // this if block.
            //
            // Thanks to Johan Vanslembrouck for finding and
            // reporting this bug.
            //
            m_cFreeCountSemaphoreAPtr->Release(1);
        }
    }

    return dwStatus;
}
Esempio n. 4
0
BOOL CMclMailbox::GetAlertable( void *lpMsg, CMclEvent *pInterrupt, DWORD dwTimeout) {
    BOOL bStatus = FALSE;
    DWORD dwStatus = pInterrupt->WaitForTwo( *m_cPendingCountSemaphoreAPtr, FALSE, dwTimeout);
    if (CMclWaitSucceeded( dwStatus, 2)
            && (CMclWaitSucceededIndex(dwStatus) == 1)) {
        dwStatus = m_cGuardMutexAPtr->Wait(dwTimeout);
        if (CMclWaitSucceeded(dwStatus, 1) || CMclWaitAbandoned(dwStatus, 1)) {
            CopyMemory( lpMsg, GetHeadPtr(), m_pHdr->cbMsgSize);
            IncrementHead();
            m_cGuardMutexAPtr->Release();
            bStatus = TRUE;

            // Nov 7, 2001: only release semaphore if
            // we've actually place something in the mailbox.
            // Previously, the following line of code was outside
            // this if block.
            //
            // Thanks to Johan Vanslembrouck for finding and
            // reporting this bug.
            //
            m_cFreeCountSemaphoreAPtr->Release(1);
        }
    }
    return bStatus;
}
Esempio n. 5
0
void		OffsetAddToHead( GenLinkedOffsetList *pList, void *elem)
/* Add a linked list element to the head of the list. */
{
	AssignOffsetLink( elem, GetHeadPtr( pList), pList->LinkOffset);
	if ( pList->Tail == 0) 
		pList->Tail = (size_t) elem - (size_t) pList;

	pList->Head = (size_t) elem - (size_t) pList;
}
Esempio n. 6
0
BOOL CMclMailbox::Get( void *lpMsg, DWORD dwTimeout) {
    DWORD dwStatus = m_cPendingCountSemaphoreAPtr->Wait(dwTimeout);
    if (CMclWaitSucceeded(dwStatus, 1)) {
        dwStatus = m_cGuardMutexAPtr->Wait(dwTimeout);
        if (CMclWaitSucceeded(dwStatus, 1) || CMclWaitAbandoned(dwStatus, 1)) {
            CopyMemory( lpMsg, GetHeadPtr(), m_pHdr->cbMsgSize);
            IncrementHead();
            m_cGuardMutexAPtr->Release();

            // Nov 7, 2001: only release semaphore if
            // we've actually place something in the mailbox.
            // Previously, the following line of code was outside
            // this if block.
            //
            // Thanks to Johan Vanslembrouck for finding and
            // reporting this bug.
            //
            m_cFreeCountSemaphoreAPtr->Release(1);
        }
    }

    return (CMclWaitSucceeded(dwStatus, 1));
}