windows-nt/Source/XPSP1/NT/base/ntos/inc/intrlk.h
2020-09-26 16:20:57 +08:00

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_