-/* $Id: rtl.h,v 1.34 2000/05/13 01:44:53 ekohl Exp $
+/* $Id: rtl.h,v 1.35 2000/06/18 15:20:10 ekohl Exp $
*
*/
* RootDirectory = Where the object should be placed or NULL
* SecurityDescriptor = Ignored
*/
-
#define InitializeObjectAttributes(p,n,a,r,s) \
{ \
(p)->Length = sizeof(OBJECT_ATTRIBUTES); \
(p)->SecurityQualityOfService = NULL; \
}
-VOID
-InitializeListHead (
- PLIST_ENTRY ListHead
- );
-VOID
-InsertHeadList (
- PLIST_ENTRY ListHead,
- PLIST_ENTRY Entry
- );
+/*
+ * VOID
+ * InitializeListHead (
+ * PLIST_ENTRY ListHead
+ * );
+ *
+ * FUNCTION: Initializes a double linked list
+ * ARGUMENTS:
+ * ListHead = Caller supplied storage for the head of the list
+ */
+#define InitializeListHead(ListHead) \
+{ \
+ (ListHead)->Flink = (ListHead); \
+ (ListHead)->Blink = (ListHead); \
+}
-VOID
-InsertTailList (
- PLIST_ENTRY ListHead,
- PLIST_ENTRY Entry
- );
-BOOLEAN
-IsListEmpty (
- PLIST_ENTRY ListHead
- );
+/*
+ * VOID
+ * InsertHeadList (
+ * PLIST_ENTRY ListHead,
+ * PLIST_ENTRY Entry
+ * );
+ *
+ * FUNCTION: Inserts an entry in a double linked list
+ * ARGUMENTS:
+ * ListHead = Head of the list
+ * Entry = Entry to insert
+ */
+#define InsertHeadList(ListHead, ListEntry) \
+{ \
+ PLIST_ENTRY OldFlink; \
+ OldFlink = (ListHead)->Flink; \
+ (ListEntry)->Flink = OldFlink; \
+ (ListEntry)->Blink = (ListHead); \
+ OldFlink->Blink = (ListEntry); \
+ (ListHead)->Flink = (ListEntry); \
+ assert((ListEntry) != NULL); \
+ assert((ListEntry)->Blink!=NULL); \
+ assert((ListEntry)->Blink->Flink == (ListEntry)); \
+ assert((ListEntry)->Flink != NULL); \
+ assert((ListEntry)->Flink->Blink == (ListEntry)); \
+}
+
+
+/*
+ * VOID
+ * InsertTailList (
+ * PLIST_ENTRY ListHead,
+ * PLIST_ENTRY Entry
+ * );
+ *
+ * FUNCTION: Inserts an entry in a double linked list
+ * ARGUMENTS:
+ * ListHead = Head of the list
+ * Entry = Entry to insert
+ */
+#define InsertTailList(ListHead, ListEntry) \
+{ \
+ PLIST_ENTRY OldBlink; \
+ OldBlink = (ListHead)->Blink; \
+ (ListEntry)->Flink = (ListHead); \
+ (ListEntry)->Blink = OldBlink; \
+ OldBlink->Flink = (ListEntry); \
+ (ListHead)->Blink = (ListEntry); \
+ assert((ListEntry) != NULL); \
+ assert((ListEntry)->Blink!=NULL); \
+ assert((ListEntry)->Blink->Flink == (ListEntry)); \
+ assert((ListEntry)->Flink != NULL); \
+ assert((ListEntry)->Flink->Blink == (ListEntry)); \
+}
+
+/*
+ * BOOLEAN
+ * IsListEmpty (
+ * PLIST_ENTRY ListHead
+ * );
+ *
+ * FUNCTION:
+ * Checks if a double linked list is empty
+ *
+ * ARGUMENTS:
+ * ListHead = Head of the list
+*/
+#define IsListEmpty(ListHead) \
+ ((ListHead)->Flink == (ListHead))
+
PSINGLE_LIST_ENTRY
PopEntryList (
PSINGLE_LIST_ENTRY ListHead
);
+/*
+#define PopEntryList(ListHead) \
+ (ListHead)->Next; \
+ { \
+ PSINGLE_LIST_ENTRY FirstEntry; \
+ FirstEntry = (ListHead)->Next; \
+ if (FirstEntry != NULL) \
+ { \
+ (ListHead)->Next = FirstEntry->Next; \
+ } \
+ }
+*/
VOID
PushEntryList (
PSINGLE_LIST_ENTRY ListHead,
PSINGLE_LIST_ENTRY Entry
);
+/*
+#define PushEntryList(ListHead,Entry) \
+ (Entry)->Next = (ListHead)->Next; \
+ (ListHead)->Next = (Entry)
+*/
-VOID
-RemoveEntryList (
- PLIST_ENTRY Entry
- );
+/*
+ *VOID
+ *RemoveEntryList (
+ * PLIST_ENTRY Entry
+ * );
+ *
+ * FUNCTION:
+ * Removes an entry from a double linked list
+ *
+ * ARGUMENTS:
+ * ListEntry = Entry to remove
+ */
+#define RemoveEntryList(ListEntry) \
+{ \
+ PLIST_ENTRY OldFlink; \
+ PLIST_ENTRY OldBlink; \
+ assert((ListEntry) != NULL); \
+ assert((ListEntry)->Blink!=NULL); \
+ assert((ListEntry)->Blink->Flink == (ListEntry)); \
+ assert((ListEntry)->Flink != NULL); \
+ assert((ListEntry)->Flink->Blink == (ListEntry)); \
+ OldFlink = (ListEntry)->Flink; \
+ OldBlink = (ListEntry)->Blink; \
+ OldFlink->Blink = OldBlink; \
+ OldBlink->Flink = OldFlink; \
+}
+
+
+/*
+ * PLIST_ENTRY
+ * RemoveHeadList (
+ * PLIST_ENTRY ListHead
+ * );
+ *
+ * FUNCTION:
+ * Removes the head entry from a double linked list
+ *
+ * ARGUMENTS:
+ * ListHead = Head of the list
+ *
+ * RETURNS:
+ * The removed entry
+ */
+/*
+#define RemoveHeadList(ListHead) \
+ (ListHead)->Flink; \
+ {RemoveEntryList((ListHead)->Flink)}
+*/
+/*
PLIST_ENTRY
RemoveHeadList (
PLIST_ENTRY ListHead
);
+*/
+
+static
+inline
+PLIST_ENTRY
+RemoveHeadList (
+ PLIST_ENTRY ListHead
+ )
+{
+ PLIST_ENTRY Old;
+ PLIST_ENTRY OldFlink;
+ PLIST_ENTRY OldBlink;
+
+ Old = ListHead->Flink;
+
+ OldFlink = ListHead->Flink->Flink;
+ OldBlink = ListHead->Flink->Blink;
+ OldFlink->Blink = OldBlink;
+ OldBlink->Flink = OldFlink;
+
+ return(Old);
+}
+
+/*
+ * PLIST_ENTRY
+ * RemoveTailList (
+ * PLIST_ENTRY ListHead
+ * );
+ *
+ * FUNCTION:
+ * Removes the tail entry from a double linked list
+ *
+ * ARGUMENTS:
+ * ListHead = Head of the list
+ * RETURNS:
+ * The removed entry
+ */
+/*
+#define RemoveTailList(ListHead) \
+ (ListHead)->Blink; \
+ {RemoveEntryList((ListHead)->Blink)}
+*/
+/*
PLIST_ENTRY
RemoveTailList (
PLIST_ENTRY ListHead
);
+*/
+
+static
+inline
+PLIST_ENTRY
+RemoveTailList (
+ PLIST_ENTRY ListHead
+ )
+{
+ PLIST_ENTRY Old;
+ PLIST_ENTRY OldFlink;
+ PLIST_ENTRY OldBlink;
+
+ Old = ListHead->Blink;
+
+ OldFlink = ListHead->Blink->Flink;
+ OldBlink = ListHead->Blink->Blink;
+ OldFlink->Blink = OldBlink;
+ OldBlink->Flink = OldFlink;
+
+ return(Old);
+}
+
PVOID
STDCALL
-/* $Id: list.c,v 1.6 2000/06/07 13:05:09 ekohl Exp $
+/* $Id: list.c,v 1.7 2000/06/18 15:21:53 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/* FUNCTIONS *************************************************************/
+#if 0
static BOOLEAN CheckEntry(PLIST_ENTRY ListEntry)
{
assert(ListEntry!=NULL);
return(TRUE);
}
-BOOLEAN IsListEmpty(PLIST_ENTRY ListHead)
-/*
- * FUNCTION: Determines if a list is empty
- * ARGUMENTS:
- * ListHead = Head of the list
- * RETURNS: True if there are no entries in the list
- */
-{
- return(ListHead->Flink==ListHead);
-}
-
-VOID RemoveEntryList(PLIST_ENTRY ListEntry)
-{
- PLIST_ENTRY OldFlink;
- PLIST_ENTRY OldBlink;
-
- DPRINT("RemoveEntryList(ListEntry %x)\n", ListEntry);
-
- assert(CheckEntry(ListEntry));
-
- OldFlink=ListEntry->Flink;
- OldBlink=ListEntry->Blink;
-
- OldFlink->Blink=OldBlink;
- OldBlink->Flink=OldFlink;
-
-
- DPRINT("RemoveEntryList()\n");
-}
-
PLIST_ENTRY RemoveTailList(PLIST_ENTRY ListHead)
/*
* FUNCTION: Remove the tail entry from a double linked list
}
PLIST_ENTRY RemoveHeadList(PLIST_ENTRY ListHead)
-{
+{
PLIST_ENTRY Old;
-
+
DPRINT("RemoveHeadList(ListHead %x)\n",ListHead);
-
+
assert(CheckEntry(ListHead));
-
+
Old = ListHead->Flink;
RemoveEntryList(ListHead->Flink);
-
- DPRINT("RemoveHeadList()\n");
-
- return(Old);
-}
-VOID InitializeListHead(PLIST_ENTRY ListHead)
-/*
- * FUNCTION: Initializes a double linked list
- * ARGUMENTS:
- * ListHead = Caller supplied storage for the head of the list
- */
-{
- ListHead->Flink = ListHead->Blink = ListHead;
-}
+ DPRINT("RemoveHeadList()\n");
-VOID InsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY ListEntry)
-/*
- * FUNCTION: Inserts an entry in a double linked list
- * ARGUMENTS:
- * ListHead = Head of the list
- * Entry = Entry to insert
- */
-{
- PLIST_ENTRY Blink;
-
- Blink = ListHead->Blink;
- ListEntry->Flink=ListHead;
- ListEntry->Blink=Blink;
- Blink->Flink=ListEntry;
- ListHead->Blink=ListEntry;
- assert(CheckEntry(ListEntry));
+ return(Old);
}
+#endif
-VOID InsertHeadList(PLIST_ENTRY ListHead, PLIST_ENTRY ListEntry)
-{
- PLIST_ENTRY OldFlink;
-
- OldFlink = ListHead->Flink;
- ListEntry->Flink = OldFlink;
- ListEntry->Blink = ListHead;
- OldFlink->Blink = ListEntry;
- ListHead->Flink = ListEntry;
- assert( CheckEntry( ListEntry ) );
-}
PLIST_ENTRY
STDCALL
Old = NULL;
}
else
- {
+ {
Old = ListHead->Blink;
}
InsertTailList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl);
-
+
return(Old);
}
* Lock = Caller supplied spinlock used to synchronise access
* RETURNS: The previous head of the list
*/
-{
+{
PLIST_ENTRY Old;
KIRQL oldlvl;
}
InsertHeadList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl);
-
+
return(Old);
}
{
PLIST_ENTRY ret;
KIRQL oldlvl;
-
+
KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(Head))
{
return(ret);
}
-PLIST_ENTRY ExInterlockedRemoveTailList(PLIST_ENTRY Head,
- PKSPIN_LOCK Lock)
+PLIST_ENTRY
+ExInterlockedRemoveTailList (
+ PLIST_ENTRY Head,
+ PKSPIN_LOCK Lock
+ )
/*
* FUNCTION: Removes the tail of a double linked list
* ARGUMENTS:
{
PLIST_ENTRY ret;
KIRQL oldlvl;
-
+
KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(Head))
{