Added missing fastcall list functions

svn path=/trunk/; revision=3305
This commit is contained in:
Eric Kohl 2002-07-27 13:02:37 +00:00
parent d35d4191c1
commit 8e93e09163
4 changed files with 309 additions and 177 deletions

View file

@ -700,6 +700,7 @@ ExInitializeNPagedLookasideList (
ULONG Tag, ULONG Tag,
USHORT Depth USHORT Depth
); );
VOID VOID
STDCALL STDCALL
ExInitializePagedLookasideList ( ExInitializePagedLookasideList (
@ -712,52 +713,53 @@ ExInitializePagedLookasideList (
USHORT Depth USHORT Depth
); );
ULONG FASTCALL
ExfInterlockedAddUlong(IN PULONG Addend,
IN ULONG Increment,
IN PKSPIN_LOCK Lock);
ULONG PLIST_ENTRY FASTCALL
FASTCALL ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
ExfInterlockedAddUlong ( IN PLIST_ENTRY ListEntry,
IN PULONG Addend, IN PKSPIN_LOCK Lock);
IN ULONG Increment,
IN PKSPIN_LOCK Lock
);
INTERLOCKED_RESULT PLIST_ENTRY FASTCALL
FASTCALL ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
Exfi386InterlockedIncrementLong ( IN PLIST_ENTRY ListEntry,
IN PLONG Addend IN PKSPIN_LOCK Lock);
);
INTERLOCKED_RESULT PSINGLE_LIST_ENTRY FASTCALL
FASTCALL ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
Exfi386InterlockedDecrementLong ( IN PKSPIN_LOCK Lock);
IN PLONG Addend
);
ULONG PSINGLE_LIST_ENTRY FASTCALL
FASTCALL ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
Exfi386InterlockedExchangeUlong ( IN PSINGLE_LIST_ENTRY ListEntry,
IN PULONG Target, IN PKSPIN_LOCK Lock);
IN ULONG Value
);
INTERLOCKED_RESULT PLIST_ENTRY FASTCALL
STDCALL ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
Exi386InterlockedIncrementLong ( IN PKSPIN_LOCK Lock);
IN PLONG Addend
);
INTERLOCKED_RESULT INTERLOCKED_RESULT FASTCALL
STDCALL Exfi386InterlockedIncrementLong(IN PLONG Addend);
Exi386InterlockedDecrementLong (
IN PLONG Addend
);
ULONG INTERLOCKED_RESULT FASTCALL
STDCALL Exfi386InterlockedDecrementLong(IN PLONG Addend);
Exi386InterlockedExchangeUlong (
IN PULONG Target, ULONG FASTCALL
IN ULONG Value Exfi386InterlockedExchangeUlong(IN PULONG Target,
); IN ULONG Value);
INTERLOCKED_RESULT STDCALL
Exi386InterlockedIncrementLong(IN PLONG Addend);
INTERLOCKED_RESULT STDCALL
Exi386InterlockedDecrementLong(IN PLONG Addend);
ULONG STDCALL
Exi386InterlockedExchangeUlong(IN PULONG Target,
IN ULONG Value);
/* /*
LONG LONG

View file

@ -1,4 +1,4 @@
/* $Id: list.c,v 1.4 2001/07/04 20:40:20 chorns Exp $ /* $Id: list.c,v 1.5 2002/07/27 13:02:13 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -22,11 +22,9 @@
PLIST_ENTRY STDCALL PLIST_ENTRY STDCALL
ExInterlockedInsertHeadList ( ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
PLIST_ENTRY ListHead, PLIST_ENTRY ListEntry,
PLIST_ENTRY ListEntry, PKSPIN_LOCK Lock)
PKSPIN_LOCK Lock
)
/* /*
* FUNCTION: Inserts an entry at the head of a doubly linked list * FUNCTION: Inserts an entry at the head of a doubly linked list
* ARGUMENTS: * ARGUMENTS:
@ -36,56 +34,60 @@ ExInterlockedInsertHeadList (
* RETURNS: The previous head of the list * RETURNS: The previous head of the list
*/ */
{ {
PLIST_ENTRY Old; PLIST_ENTRY Old;
KIRQL oldlvl; KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(ListHead)) if (IsListEmpty(ListHead))
{ {
Old = NULL; Old = NULL;
} }
else else
{ {
Old = ListHead->Flink; Old = ListHead->Flink;
} }
InsertHeadList(ListHead,ListEntry); InsertHeadList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(Old); return(Old);
} }
PLIST_ENTRY STDCALL PLIST_ENTRY STDCALL
ExInterlockedInsertTailList ( ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
PLIST_ENTRY ListHead, PLIST_ENTRY ListEntry,
PLIST_ENTRY ListEntry, PKSPIN_LOCK Lock)
PKSPIN_LOCK Lock /*
) * FUNCTION: Inserts an entry at the tail of a doubly linked list
* ARGUMENTS:
* ListHead = Points to the head of the list
* ListEntry = Points to the entry to be inserted
* Lock = Caller supplied spinlock used to synchronize access
* RETURNS: The previous head of the list
*/
{ {
PLIST_ENTRY Old; PLIST_ENTRY Old;
KIRQL oldlvl; KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(ListHead)) if (IsListEmpty(ListHead))
{ {
Old = NULL; Old = NULL;
} }
else else
{ {
Old = ListHead->Blink; Old = ListHead->Blink;
} }
InsertTailList(ListHead,ListEntry); InsertTailList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(Old); return(Old);
} }
PLIST_ENTRY STDCALL PLIST_ENTRY STDCALL
ExInterlockedRemoveHeadList ( ExInterlockedRemoveHeadList(PLIST_ENTRY Head,
PLIST_ENTRY Head, PKSPIN_LOCK Lock)
PKSPIN_LOCK Lock
)
/* /*
* FUNCTION: Removes the head of a double linked list * FUNCTION: Removes the head of a double linked list
* ARGUMENTS: * ARGUMENTS:
@ -94,27 +96,26 @@ ExInterlockedRemoveHeadList (
* RETURNS: The removed entry * RETURNS: The removed entry
*/ */
{ {
PLIST_ENTRY ret; PLIST_ENTRY ret;
KIRQL oldlvl; KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(Head)) if (IsListEmpty(Head))
{ {
ret = NULL; ret = NULL;
} }
else else
{ {
ret = RemoveHeadList(Head); ret = RemoveHeadList(Head);
} }
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(ret); return(ret);
} }
PLIST_ENTRY PLIST_ENTRY
ExInterlockedRemoveTailList ( ExInterlockedRemoveTailList(PLIST_ENTRY Head,
PLIST_ENTRY Head, PKSPIN_LOCK Lock)
PKSPIN_LOCK Lock
)
/* /*
* FUNCTION: Removes the tail of a double linked list * FUNCTION: Removes the tail of a double linked list
* ARGUMENTS: * ARGUMENTS:
@ -123,27 +124,26 @@ ExInterlockedRemoveTailList (
* RETURNS: The removed entry * RETURNS: The removed entry
*/ */
{ {
PLIST_ENTRY ret; PLIST_ENTRY ret;
KIRQL oldlvl; KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(Head)) if (IsListEmpty(Head))
{ {
ret = NULL; ret = NULL;
} }
else else
{ {
ret = RemoveTailList(Head); ret = RemoveTailList(Head);
} }
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(ret); return(ret);
} }
PSINGLE_LIST_ENTRY FASTCALL PSINGLE_LIST_ENTRY FASTCALL
ExInterlockedPopEntrySList( ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
PSLIST_HEADER ListHead, IN PKSPIN_LOCK Lock)
PKSPIN_LOCK Lock)
/* /*
* FUNCTION: Removes (pops) an entry from a sequenced list * FUNCTION: Removes (pops) an entry from a sequenced list
* ARGUMENTS: * ARGUMENTS:
@ -152,26 +152,25 @@ ExInterlockedPopEntrySList(
* RETURNS: The removed entry * RETURNS: The removed entry
*/ */
{ {
PSINGLE_LIST_ENTRY ret; PSINGLE_LIST_ENTRY ret;
KIRQL oldlvl; KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
ret = PopEntryList(&ListHead->s.Next); ret = PopEntryList(&ListHead->s.Next);
if (ret) if (ret)
{ {
ListHead->s.Depth--; ListHead->s.Depth--;
ListHead->s.Sequence++; ListHead->s.Sequence++;
} }
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(ret); return(ret);
} }
PSINGLE_LIST_ENTRY FASTCALL PSINGLE_LIST_ENTRY FASTCALL
ExInterlockedPushEntrySList( ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
PSLIST_HEADER ListHead, IN PSINGLE_LIST_ENTRY ListEntry,
PSINGLE_LIST_ENTRY ListEntry, IN PKSPIN_LOCK Lock)
PKSPIN_LOCK Lock)
/* /*
* FUNCTION: Inserts (pushes) an entry into a sequenced list * FUNCTION: Inserts (pushes) an entry into a sequenced list
* ARGUMENTS: * ARGUMENTS:
@ -181,25 +180,22 @@ ExInterlockedPushEntrySList(
* RETURNS: The previous head of the list * RETURNS: The previous head of the list
*/ */
{ {
KIRQL oldlvl; KIRQL oldlvl;
PSINGLE_LIST_ENTRY ret; PSINGLE_LIST_ENTRY ret;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
ret=ListHead->s.Next.Next; ret=ListHead->s.Next.Next;
PushEntryList(&ListHead->s.Next,ListEntry); PushEntryList(&ListHead->s.Next,ListEntry);
ListHead->s.Depth++; ListHead->s.Depth++;
ListHead->s.Sequence++; ListHead->s.Sequence++;
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(ret); return(ret);
} }
PSINGLE_LIST_ENTRY PSINGLE_LIST_ENTRY STDCALL
STDCALL ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
ExInterlockedPopEntryList ( IN PKSPIN_LOCK Lock)
PSINGLE_LIST_ENTRY ListHead,
PKSPIN_LOCK Lock
)
/* /*
* FUNCTION: Removes (pops) an entry from a singly list * FUNCTION: Removes (pops) an entry from a singly list
* ARGUMENTS: * ARGUMENTS:
@ -208,23 +204,20 @@ ExInterlockedPopEntryList (
* RETURNS: The removed entry * RETURNS: The removed entry
*/ */
{ {
PSINGLE_LIST_ENTRY ret; PSINGLE_LIST_ENTRY ret;
KIRQL oldlvl; KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
ret = PopEntryList(ListHead); ret = PopEntryList(ListHead);
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(ret); return(ret);
} }
PSINGLE_LIST_ENTRY PSINGLE_LIST_ENTRY STDCALL
STDCALL ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
ExInterlockedPushEntryList ( IN PSINGLE_LIST_ENTRY ListEntry,
PSINGLE_LIST_ENTRY ListHead, IN PKSPIN_LOCK Lock)
PSINGLE_LIST_ENTRY ListEntry,
PKSPIN_LOCK Lock
)
/* /*
* FUNCTION: Inserts (pushes) an entry into a singly linked list * FUNCTION: Inserts (pushes) an entry into a singly linked list
* ARGUMENTS: * ARGUMENTS:
@ -234,14 +227,151 @@ ExInterlockedPushEntryList (
* RETURNS: The previous head of the list * RETURNS: The previous head of the list
*/ */
{ {
KIRQL oldlvl; KIRQL oldlvl;
PSINGLE_LIST_ENTRY ret; PSINGLE_LIST_ENTRY ret;
KeAcquireSpinLock(Lock,&oldlvl); KeAcquireSpinLock(Lock,&oldlvl);
ret=ListHead->Next; ret=ListHead->Next;
PushEntryList(ListHead,ListEntry); PushEntryList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl); KeReleaseSpinLock(Lock,oldlvl);
return(ret); return(ret);
}
PLIST_ENTRY FASTCALL
ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY ListEntry,
IN PKSPIN_LOCK Lock)
/*
* FUNCTION: Inserts an entry at the head of a doubly linked list
* ARGUMENTS:
* ListHead = Points to the head of the list
* ListEntry = Points to the entry to be inserted
* Lock = Caller supplied spinlock used to synchronize access
* RETURNS: The previous head of the list
*/
{
PLIST_ENTRY Old;
KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(ListHead))
{
Old = NULL;
}
else
{
Old = ListHead->Flink;
}
InsertHeadList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl);
return(Old);
}
PLIST_ENTRY FASTCALL
ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY ListEntry,
IN PKSPIN_LOCK Lock)
/*
* FUNCTION: Inserts an entry at the tail of a doubly linked list
* ARGUMENTS:
* ListHead = Points to the head of the list
* ListEntry = Points to the entry to be inserted
* Lock = Caller supplied spinlock used to synchronize access
* RETURNS: The previous head of the list
*/
{
PLIST_ENTRY Old;
KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(ListHead))
{
Old = NULL;
}
else
{
Old = ListHead->Blink;
}
InsertTailList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl);
return(Old);
}
PSINGLE_LIST_ENTRY FASTCALL
ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
IN PKSPIN_LOCK Lock)
/*
* FUNCTION: Removes (pops) an entry from a singly list
* ARGUMENTS:
* ListHead = Points to the head of the list
* Lock = Lock for synchronizing access to the list
* RETURNS: The removed entry
*/
{
PSINGLE_LIST_ENTRY ret;
KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl);
ret = PopEntryList(ListHead);
KeReleaseSpinLock(Lock,oldlvl);
return(ret);
}
PSINGLE_LIST_ENTRY FASTCALL
ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
IN PSINGLE_LIST_ENTRY ListEntry,
IN PKSPIN_LOCK Lock)
/*
* FUNCTION: Inserts (pushes) an entry into a singly linked list
* ARGUMENTS:
* ListHead = Points to the head of the list
* ListEntry = Points to the entry to be inserted
* Lock = Caller supplied spinlock used to synchronize access
* RETURNS: The previous head of the list
*/
{
KIRQL oldlvl;
PSINGLE_LIST_ENTRY ret;
KeAcquireSpinLock(Lock,&oldlvl);
ret=ListHead->Next;
PushEntryList(ListHead,ListEntry);
KeReleaseSpinLock(Lock,oldlvl);
return(ret);
}
PLIST_ENTRY FASTCALL
ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
IN PKSPIN_LOCK Lock)
/*
* FUNCTION: Removes the head of a double linked list
* ARGUMENTS:
* Head = Points to the head of the list
* Lock = Lock for synchronizing access to the list
* RETURNS: The removed entry
*/
{
PLIST_ENTRY ret;
KIRQL oldlvl;
KeAcquireSpinLock(Lock,&oldlvl);
if (IsListEmpty(Head))
{
ret = NULL;
}
else
{
ret = RemoveHeadList(Head);
}
KeReleaseSpinLock(Lock,oldlvl);
return(ret);
} }
/* EOF */ /* EOF */

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.def,v 1.138 2002/07/25 13:18:31 ekohl Exp $ ; $Id: ntoskrnl.def,v 1.139 2002/07/27 13:02:37 ekohl Exp $
; ;
; reactos/ntoskrnl/ntoskrnl.def ; reactos/ntoskrnl/ntoskrnl.def
; ;
@ -113,11 +113,11 @@ ExInsertHashTable@16
ExSearchHashTable@16 ExSearchHashTable@16
ExRemoveHashTable@16 ExRemoveHashTable@16
@ExfInterlockedAddUlong@12 @ExfInterlockedAddUlong@12
;@ExfInterlockedInsertHeadList @ExfInterlockedInsertHeadList@12
;@ExfInterlockedInsertTailList @ExfInterlockedInsertTailList@12
;@ExfInterlockedPopEntryList @ExfInterlockedPopEntryList@8
;@ExfInterlockedPushEntryList @ExfInterlockedPushEntryList@12
;@ExfInterlockedRemoveHeadList @ExfInterlockedRemoveHeadList@8
@Exfi386InterlockedDecrementLong@4 @Exfi386InterlockedDecrementLong@4
@Exfi386InterlockedExchangeUlong@8 @Exfi386InterlockedExchangeUlong@8
@Exfi386InterlockedIncrementLong@4 @Exfi386InterlockedIncrementLong@4

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.edf,v 1.124 2002/07/25 13:18:31 ekohl Exp $ ; $Id: ntoskrnl.edf,v 1.125 2002/07/27 13:02:37 ekohl Exp $
; ;
; reactos/ntoskrnl/ntoskrnl.def ; reactos/ntoskrnl/ntoskrnl.def
; ;
@ -113,11 +113,11 @@ ExInsertHashTable=ExInsertHashTable@16
ExSearchHashTable=ExSearchHashTable@16 ExSearchHashTable=ExSearchHashTable@16
ExRemoveHashTable=ExRemoveHashTable@16 ExRemoveHashTable=ExRemoveHashTable@16
ExfInterlockedAddUlong=@ExfInterlockedAddUlong@12 ExfInterlockedAddUlong=@ExfInterlockedAddUlong@12
;ExfInterlockedInsertHeadList ExfInterlockedInsertHeadList=@ExfInterlockedInsertHeadList@12
;ExfInterlockedInsertTailList ExfInterlockedInsertTailList=@ExfInterlockedInsertTailList@12
;ExfInterlockedPopEntryList ExfInterlockedPopEntryList=@ExfInterlockedPopEntryList@8
;ExfInterlockedPushEntryList ExfInterlockedPushEntryList=@ExfInterlockedPushEntryList@12
;ExfInterlockedRemoveHeadList ExfInterlockedRemoveHeadList=@ExfInterlockedRemoveHeadList@8
Exfi386InterlockedDecrementLong=@Exfi386InterlockedDecrementLong@4 Exfi386InterlockedDecrementLong=@Exfi386InterlockedDecrementLong@4
Exfi386InterlockedExchangeUlong=@Exfi386InterlockedExchangeUlong@8 Exfi386InterlockedExchangeUlong=@Exfi386InterlockedExchangeUlong@8
Exfi386InterlockedIncrementLong=@Exfi386InterlockedIncrementLong@4 Exfi386InterlockedIncrementLong=@Exfi386InterlockedIncrementLong@4