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; }
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; }
DWORD CMclMailbox::PostAlertable( const void *lpMsg, const CMclWaitableCollection & rCollection, DWORD dwTimeout) { CMclWaitableCollection cCollection; cCollection.AddObject(*m_cFreeCountSemaphoreAPtr); 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( GetTailPtr(), lpMsg, m_pHdr->cbMsgSize); IncrementTail(); 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_cPendingCountSemaphoreAPtr->Release(1); } } return dwStatus; }
BOOL CMclMailbox::PostAlertable( const void *lpMsg, CMclEvent *pInterrupt, DWORD dwTimeout) { BOOL bStatus = FALSE; DWORD dwStatus = pInterrupt->WaitForTwo( *m_cFreeCountSemaphoreAPtr, FALSE, dwTimeout); if (CMclWaitSucceeded( dwStatus, 2) && (CMclWaitSucceededIndex(dwStatus) == 1)) { dwStatus = m_cGuardMutexAPtr->Wait(dwTimeout); if (CMclWaitSucceeded(dwStatus, 1) || CMclWaitAbandoned(dwStatus, 1)) { CopyMemory( GetTailPtr(), lpMsg, m_pHdr->cbMsgSize); IncrementTail(); 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_cPendingCountSemaphoreAPtr->Release(1); } } return bStatus; }
void OffsetAddToTail( GenLinkedOffsetList *pList, void *elem) /* Add a linked list element to the tail of the list. */ { if ( pList->Tail) { AssignOffsetLink( GetTailPtr( pList), elem, pList->LinkOffset); } else pList->Head = (size_t) elem - (size_t) pList; AssignOffsetLink( elem, NULL, pList->LinkOffset); pList->Tail = (size_t) elem - (size_t) pList; }
BOOL CMclMailbox::Post( const void *lpMsg, DWORD dwTimeout) { DWORD dwStatus = m_cFreeCountSemaphoreAPtr->Wait(dwTimeout); if (CMclWaitSucceeded(dwStatus, 1)) { dwStatus = m_cGuardMutexAPtr->Wait(dwTimeout); if (CMclWaitSucceeded(dwStatus, 1) || CMclWaitAbandoned(dwStatus, 1)) { CopyMemory( GetTailPtr(), lpMsg, m_pHdr->cbMsgSize); IncrementTail(); 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_cPendingCountSemaphoreAPtr->Release(1); } } return (CMclWaitSucceeded(dwStatus, 1)); }