153 lines
3.3 KiB
C
153 lines
3.3 KiB
C
/*++ BUILD Version: 0001 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
intrlk.h
|
|
|
|
Abstract:
|
|
|
|
This module contains platform independent interlocked functions.
|
|
|
|
Author:
|
|
|
|
David N. Cutler (davec) 15-Feb-2001
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _INTRLK_
|
|
#define _INTRLK_
|
|
|
|
//
|
|
// The following functions implement interlocked singly linked lists.
|
|
//
|
|
// WARNING: These lists can only be used when it is known that the ABA
|
|
// removal problem cannot occur. If the ABA problem can occur,
|
|
// then SLIST's should be used.
|
|
//
|
|
|
|
FORCEINLINE
|
|
PSINGLE_LIST_ENTRY
|
|
InterlockedPopEntrySingleList (
|
|
IN PSINGLE_LIST_ENTRY ListHead
|
|
)
|
|
|
|
/*
|
|
|
|
Routine Description:
|
|
|
|
This function pops an entry from the front of a singly linked list.
|
|
|
|
Arguments:
|
|
|
|
ListHead - Supplies a pointer to the listhead of a singly linked list.
|
|
|
|
Return Value:
|
|
|
|
If the list is empty, then NULL is returned. Otherwise, the address of the
|
|
first entry removed from the list is returned as the function
|
|
value.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
PSINGLE_LIST_ENTRY FirstEntry;
|
|
PSINGLE_LIST_ENTRY NextEntry;
|
|
|
|
FirstEntry = ListHead->Next;
|
|
do {
|
|
if (FirstEntry == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
NextEntry = FirstEntry;
|
|
FirstEntry =
|
|
(PSINGLE_LIST_ENTRY)InterlockedCompareExchangePointer((PVOID *)ListHead,
|
|
FirstEntry->Next,
|
|
FirstEntry);
|
|
|
|
} while (FirstEntry != NextEntry);
|
|
return FirstEntry;
|
|
}
|
|
|
|
FORCEINLINE
|
|
PSINGLE_LIST_ENTRY
|
|
InterlockedPushEntrySingleList (
|
|
IN PSINGLE_LIST_ENTRY ListHead,
|
|
IN PSINGLE_LIST_ENTRY Entry
|
|
)
|
|
|
|
/*
|
|
|
|
Routine Description:
|
|
|
|
This function pushes an entry onto the front of a singly linked list.
|
|
|
|
Arguments:
|
|
|
|
ListHead - Supplies a pointer to the listhead of a singly linked list.
|
|
|
|
Entry - Supplies a pointer to a single list entry.
|
|
|
|
Return Value:
|
|
|
|
The previous contents of the listhead are returned as the function value.
|
|
If NULL is returned, then the list transitioned for an empty to a non
|
|
empty state.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
PSINGLE_LIST_ENTRY FirstEntry;
|
|
PSINGLE_LIST_ENTRY NextEntry;
|
|
|
|
FirstEntry = ListHead->Next;
|
|
do {
|
|
Entry->Next = FirstEntry;
|
|
NextEntry = FirstEntry;
|
|
FirstEntry =
|
|
(PSINGLE_LIST_ENTRY)InterlockedCompareExchangePointer((PVOID *)ListHead,
|
|
Entry,
|
|
FirstEntry);
|
|
|
|
} while (FirstEntry != NextEntry);
|
|
return FirstEntry;
|
|
}
|
|
|
|
FORCEINLINE
|
|
PSINGLE_LIST_ENTRY
|
|
InterlockedFlushSingleList (
|
|
IN PSINGLE_LIST_ENTRY ListHead
|
|
)
|
|
|
|
/*
|
|
|
|
Routine Description:
|
|
|
|
This function pops the entire list from the front of a singly linked list.
|
|
|
|
Arguments:
|
|
|
|
ListHead - Supplies a pointer to the listhead of a singly linked list.
|
|
|
|
Return Value:
|
|
|
|
If the list is empty, then NULL is returned. Otherwise, the address of the
|
|
first entry removed from the list is returned as the function
|
|
value.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
return (PSINGLE_LIST_ENTRY)InterlockedExchangePointer((PVOID *)ListHead,
|
|
NULL);
|
|
}
|
|
|
|
#endif // _INTRLK_
|