1 /* $Id: list.c,v 1.2 2000/10/07 13:41:50 dwelch Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ex/list.c
6 * PURPOSE: Manages double linked lists, single linked lists and
8 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
16 #include <internal/debug.h>
18 /* FUNCTIONS *************************************************************/
22 ExInterlockedInsertHeadList (
24 PLIST_ENTRY ListEntry
,
28 * FUNCTION: Inserts an entry at the head of a doubly linked list
30 * ListHead = Points to the head of the list
31 * ListEntry = Points to the entry to be inserted
32 * Lock = Caller supplied spinlock used to synchronise access
33 * RETURNS: The previous head of the list
39 KeAcquireSpinLock(Lock
,&oldlvl
);
40 if (IsListEmpty(ListHead
))
46 Old
= ListHead
->Flink
;
48 InsertHeadList(ListHead
,ListEntry
);
49 KeReleaseSpinLock(Lock
,oldlvl
);
56 ExInterlockedInsertTailList (
58 PLIST_ENTRY ListEntry
,
65 KeAcquireSpinLock(Lock
,&oldlvl
);
66 if (IsListEmpty(ListHead
))
72 Old
= ListHead
->Blink
;
74 InsertTailList(ListHead
,ListEntry
);
75 KeReleaseSpinLock(Lock
,oldlvl
);
82 ExInterlockedRemoveHeadList (
87 * FUNCTION: Removes the head of a double linked list
90 * Lock = Lock for synchronizing access to the list
91 * RETURNS: The removed entry
97 KeAcquireSpinLock(Lock
,&oldlvl
);
98 if (IsListEmpty(Head
))
104 ret
= RemoveHeadList(Head
);
106 KeReleaseSpinLock(Lock
,oldlvl
);
111 ExInterlockedRemoveTailList (
116 * FUNCTION: Removes the tail of a double linked list
119 * Lock = Lock for synchronizing access to the list
120 * RETURNS: The removed entry
126 KeAcquireSpinLock(Lock
,&oldlvl
);
127 if (IsListEmpty(Head
))
133 ret
= RemoveTailList(Head
);
135 KeReleaseSpinLock(Lock
,oldlvl
);
142 ExInterlockedPopEntrySList (
143 PSLIST_HEADER ListHead
,
153 ExInterlockedPushEntrySList (
154 PSLIST_HEADER ListHead
,
155 PSINGLE_LIST_ENTRY ListEntry
,
165 ExInterlockedPopEntryList (
166 PSINGLE_LIST_ENTRY ListHead
,
170 PSINGLE_LIST_ENTRY ret
;
173 KeAcquireSpinLock(Lock
,&oldlvl
);
174 ret
= PopEntryList(ListHead
);
175 KeReleaseSpinLock(Lock
,oldlvl
);
182 ExInterlockedPushEntryList (
183 PSINGLE_LIST_ENTRY ListHead
,
184 PSINGLE_LIST_ENTRY ListEntry
,
189 PSINGLE_LIST_ENTRY ret
;
191 KeAcquireSpinLock(Lock
,&oldlvl
);
193 PushEntryList(ListHead
,ListEntry
);
194 KeReleaseSpinLock(Lock
,oldlvl
);