Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++ 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_
|